-
Notifications
You must be signed in to change notification settings - Fork 12
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* Switch from XCTest to Swift Testing --------- Co-authored-by: Tim Condon <[email protected]>
- Loading branch information
1 parent
939492b
commit 349b450
Showing
15 changed files
with
1,187 additions
and
1,227 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
10 changes: 6 additions & 4 deletions
10
Tests/OrdersTests/SecretMiddleware.swift → ...es/PassKit/Testing/SecretMiddleware.swift
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
import Vapor | ||
|
||
package let isLoggingConfigured: Bool = { | ||
LoggingSystem.bootstrap { label in | ||
var handler = StreamLogHandler.standardOutput(label: label) | ||
handler.logLevel = .debug | ||
return handler | ||
} | ||
return true | ||
}() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,116 +1,92 @@ | ||
import Fluent | ||
import FluentSQLiteDriver | ||
import FluentKit | ||
import PassKit | ||
import Testing | ||
import XCTVapor | ||
import Zip | ||
|
||
@testable import Orders | ||
|
||
final class EncryptedOrdersTests: XCTestCase { | ||
@Suite("Orders Tests with Encrypted PEM Key") | ||
struct EncryptedOrdersTests { | ||
let delegate = EncryptedOrdersDelegate() | ||
let ordersURI = "/api/orders/v1/" | ||
var ordersService: OrdersService! | ||
var app: Application! | ||
|
||
override func setUp() async throws { | ||
self.app = try await Application.make(.testing) | ||
app.databases.use(.sqlite(.memory), as: .sqlite) | ||
|
||
OrdersService.register(migrations: app.migrations) | ||
app.migrations.add(CreateOrderData()) | ||
ordersService = try OrdersService( | ||
app: app, | ||
delegate: delegate, | ||
pushRoutesMiddleware: SecretMiddleware(secret: "foo"), | ||
logger: app.logger | ||
) | ||
app.databases.middleware.use(OrderDataMiddleware(service: ordersService), on: .sqlite) | ||
|
||
try await app.autoMigrate() | ||
|
||
Zip.addCustomFileExtension("order") | ||
} | ||
|
||
override func tearDown() async throws { | ||
try await app.autoRevert() | ||
try await self.app.asyncShutdown() | ||
self.app = nil | ||
@Test("Order Generation") | ||
func orderGeneration() async throws { | ||
try await withApp(delegate: delegate) { app, ordersService in | ||
let orderData = OrderData(title: "Test Order") | ||
try await orderData.create(on: app.db) | ||
let order = try await orderData.$order.get(on: app.db) | ||
let data = try await ordersService.generateOrderContent(for: order, on: app.db) | ||
let orderURL = FileManager.default.temporaryDirectory.appendingPathComponent("test.order") | ||
try data.write(to: orderURL) | ||
let orderFolder = try Zip.quickUnzipFile(orderURL) | ||
|
||
#expect(FileManager.default.fileExists(atPath: orderFolder.path.appending("/signature"))) | ||
|
||
let passJSONData = try String(contentsOfFile: orderFolder.path.appending("/order.json")).data(using: .utf8) | ||
let passJSON = try JSONSerialization.jsonObject(with: passJSONData!) as! [String: Any] | ||
#expect(passJSON["authenticationToken"] as? String == order.authenticationToken) | ||
let orderID = try order.requireID().uuidString | ||
#expect(passJSON["orderIdentifier"] as? String == orderID) | ||
|
||
let manifestJSONData = try String(contentsOfFile: orderFolder.path.appending("/manifest.json")).data(using: .utf8) | ||
let manifestJSON = try JSONSerialization.jsonObject(with: manifestJSONData!) as! [String: Any] | ||
let iconData = try Data(contentsOf: orderFolder.appendingPathComponent("/icon.png")) | ||
let iconHash = Array(SHA256.hash(data: iconData)).hex | ||
#expect(manifestJSON["icon.png"] as? String == iconHash) | ||
} | ||
} | ||
|
||
func testOrderGeneration() async throws { | ||
let orderData = OrderData(title: "Test Order") | ||
try await orderData.create(on: app.db) | ||
let order = try await orderData.$order.get(on: app.db) | ||
let data = try await ordersService.generateOrderContent(for: order, on: app.db) | ||
let orderURL = FileManager.default.temporaryDirectory.appendingPathComponent("test.order") | ||
try data.write(to: orderURL) | ||
let orderFolder = try Zip.quickUnzipFile(orderURL) | ||
|
||
XCTAssert(FileManager.default.fileExists(atPath: orderFolder.path.appending("/signature"))) | ||
|
||
let passJSONData = try String(contentsOfFile: orderFolder.path.appending("/order.json")) | ||
.data(using: .utf8) | ||
let passJSON = try JSONSerialization.jsonObject(with: passJSONData!) as! [String: Any] | ||
XCTAssertEqual(passJSON["authenticationToken"] as? String, order.authenticationToken) | ||
try XCTAssertEqual(passJSON["orderIdentifier"] as? String, order.requireID().uuidString) | ||
|
||
let manifestJSONData = try String( | ||
contentsOfFile: orderFolder.path.appending("/manifest.json") | ||
).data(using: .utf8) | ||
let manifestJSON = | ||
try JSONSerialization.jsonObject(with: manifestJSONData!) as! [String: Any] | ||
let iconData = try Data(contentsOf: orderFolder.appendingPathComponent("/icon.png")) | ||
let iconHash = Array(SHA256.hash(data: iconData)).hex | ||
XCTAssertEqual(manifestJSON["icon.png"] as? String, iconHash) | ||
} | ||
|
||
func testAPNSClient() async throws { | ||
XCTAssertNotNil(app.apns.client(.init(string: "orders"))) | ||
|
||
let orderData = OrderData(title: "Test Order") | ||
try await orderData.create(on: app.db) | ||
let order = try await orderData._$order.get(on: app.db) | ||
|
||
try await ordersService.sendPushNotificationsForOrder( | ||
id: order.requireID(), of: order.orderTypeIdentifier, on: app.db) | ||
|
||
let deviceLibraryIdentifier = "abcdefg" | ||
let pushToken = "1234567890" | ||
|
||
try await app.test( | ||
.POST, | ||
"\(ordersURI)push/\(order.orderTypeIdentifier)/\(order.requireID())", | ||
headers: ["X-Secret": "foo"], | ||
afterResponse: { res async throws in | ||
XCTAssertEqual(res.status, .noContent) | ||
} | ||
) | ||
|
||
try await app.test( | ||
.POST, | ||
"\(ordersURI)devices/\(deviceLibraryIdentifier)/registrations/\(order.orderTypeIdentifier)/\(order.requireID())", | ||
headers: ["Authorization": "AppleOrder \(order.authenticationToken)"], | ||
beforeRequest: { req async throws in | ||
try req.content.encode(RegistrationDTO(pushToken: pushToken)) | ||
}, | ||
afterResponse: { res async throws in | ||
XCTAssertEqual(res.status, .created) | ||
} | ||
) | ||
|
||
try await app.test( | ||
.POST, | ||
"\(ordersURI)push/\(order.orderTypeIdentifier)/\(order.requireID())", | ||
headers: ["X-Secret": "foo"], | ||
afterResponse: { res async throws in | ||
XCTAssertEqual(res.status, .internalServerError) | ||
} | ||
) | ||
|
||
// Test `OrderDataMiddleware` update method | ||
orderData.title = "Test Order 2" | ||
do { | ||
try await orderData.update(on: app.db) | ||
} catch {} | ||
@Test("APNS Client") | ||
func apnsClient() async throws { | ||
try await withApp(delegate: delegate) { app, ordersService in | ||
#expect(app.apns.client(.init(string: "orders")) != nil) | ||
|
||
let orderData = OrderData(title: "Test Order") | ||
try await orderData.create(on: app.db) | ||
let order = try await orderData._$order.get(on: app.db) | ||
|
||
try await ordersService.sendPushNotificationsForOrder(id: order.requireID(), of: order.orderTypeIdentifier, on: app.db) | ||
|
||
let deviceLibraryIdentifier = "abcdefg" | ||
let pushToken = "1234567890" | ||
|
||
try await app.test( | ||
.POST, | ||
"\(ordersURI)push/\(order.orderTypeIdentifier)/\(order.requireID())", | ||
headers: ["X-Secret": "foo"], | ||
afterResponse: { res async throws in | ||
#expect(res.status == .noContent) | ||
} | ||
) | ||
|
||
try await app.test( | ||
.POST, | ||
"\(ordersURI)devices/\(deviceLibraryIdentifier)/registrations/\(order.orderTypeIdentifier)/\(order.requireID())", | ||
headers: ["Authorization": "AppleOrder \(order.authenticationToken)"], | ||
beforeRequest: { req async throws in | ||
try req.content.encode(RegistrationDTO(pushToken: pushToken)) | ||
}, | ||
afterResponse: { res async throws in | ||
#expect(res.status == .created) | ||
} | ||
) | ||
|
||
try await app.test( | ||
.POST, | ||
"\(ordersURI)push/\(order.orderTypeIdentifier)/\(order.requireID())", | ||
headers: ["X-Secret": "foo"], | ||
afterResponse: { res async throws in | ||
#expect(res.status == .internalServerError) | ||
} | ||
) | ||
|
||
// Test `OrderDataMiddleware` update method | ||
orderData.title = "Test Order 2" | ||
do { | ||
try await orderData.update(on: app.db) | ||
} catch {} | ||
} | ||
} | ||
} |
Oops, something went wrong.