Skip to content

Commit

Permalink
Fix tests
Browse files Browse the repository at this point in the history
  • Loading branch information
fpseverino committed Aug 14, 2024
1 parent 2c8da12 commit a2a35b5
Show file tree
Hide file tree
Showing 7 changed files with 96 additions and 31 deletions.
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<div align="center">
<img src="https://avatars.githubusercontent.com/u/26165732?s=200&v=4" width="100" height="100" alt="avatar" />
<h1>PassKit</h1>
<a href="https://swiftpackageindex.com/vapor-community/PassKit/0.6.0/documentation/passkit">
<a href="https://swiftpackageindex.com/vapor-community/PassKit/documentation">
<img src="https://design.vapor.codes/images/readthedocs.svg" alt="Documentation">
</a>
<a href="https://discord.gg/vapor"><img src="https://design.vapor.codes/images/discordchat.svg" alt="Team Chat"></a>
Expand Down Expand Up @@ -39,7 +39,7 @@ Add the `Passes` product to your target's dependencies:
.product(name: "Passes", package: "PassKit")
```

See the framework's [documentation](https://swiftpackageindex.com/vapor-community/PassKit/0.6.0/documentation/passes) for information and guides on how to use it.
See the framework's [documentation](https://swiftpackageindex.com/vapor-community/PassKit/documentation/passes) for information and guides on how to use it.

For information on Apple Wallet passes, see the [Apple Developer Documentation](https://developer.apple.com/documentation/walletpasses).

Expand All @@ -54,6 +54,6 @@ Add the `Orders` product to your target's dependencies:
.product(name: "Orders", package: "PassKit")
```

See the framework's [documentation](https://swiftpackageindex.com/vapor-community/PassKit/0.6.0/documentation/orders) for information and guides on how to use it.
See the framework's [documentation](https://swiftpackageindex.com/vapor-community/PassKit/documentation/orders) for information and guides on how to use it.

For information on Apple Wallet orders, see the [Apple Developer Documentation](https://developer.apple.com/documentation/walletorders).
4 changes: 2 additions & 2 deletions Sources/PassKit/PassKit.docc/PassKit.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ The PassKit framework provides a set of tools shared by the Passes and Orders fr
The Passes framework provides a set of tools to help you create, build, and distribute digital passes for the Apple Wallet app using a Vapor server.
It also provides a way to update passes after they have been distributed, using APNs, and models to store pass and device data.

See the framework's [documentation](https://swiftpackageindex.com/vapor-community/PassKit/0.6.0/documentation/passes) for information and guides on how to use it.
See the framework's [documentation](https://swiftpackageindex.com/vapor-community/PassKit/documentation/passes) for information and guides on how to use it.

For information on Apple Wallet passes, see the [Apple Developer Documentation](https://developer.apple.com/documentation/walletpasses).

Expand All @@ -28,6 +28,6 @@ For information on Apple Wallet passes, see the [Apple Developer Documentation](
The Orders framework provides a set of tools to help you create, build, and distribute orders that users can track and manage in Apple Wallet using a Vapor server.
It also provides a way to update orders after they have been distributed, using APNs, and models to store order and device data.

See the framework's [documentation](https://swiftpackageindex.com/vapor-community/PassKit/0.6.0/documentation/orders) for information and guides on how to use it.
See the framework's [documentation](https://swiftpackageindex.com/vapor-community/PassKit/documentation/orders) for information and guides on how to use it.

For information on Apple Wallet orders, see the [Apple Developer Documentation](https://developer.apple.com/documentation/walletorders).
28 changes: 14 additions & 14 deletions Sources/Passes/Models/UserPersonalizationModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -48,63 +48,63 @@ internal extension UserPersonalizationModel {
return id
}

var _$fullName: OptionalField<String?> {
var _$fullName: OptionalField<String> {
guard let mirror = Mirror(reflecting: self).descendant("_fullName"),
let fullName = mirror as? OptionalField<String?> else {
let fullName = mirror as? OptionalField<String> else {
fatalError("fullName property must be declared using @OptionalField")
}

return fullName
}

var _$givenName: OptionalField<String?> {
var _$givenName: OptionalField<String> {
guard let mirror = Mirror(reflecting: self).descendant("_givenName"),
let givenName = mirror as? OptionalField<String?> else {
let givenName = mirror as? OptionalField<String> else {
fatalError("givenName property must be declared using @OptionalField")
}

return givenName
}

var _$familyName: OptionalField<String?> {
var _$familyName: OptionalField<String> {
guard let mirror = Mirror(reflecting: self).descendant("_familyName"),
let familyName = mirror as? OptionalField<String?> else {
let familyName = mirror as? OptionalField<String> else {
fatalError("familyName property must be declared using @OptionalField")
}

return familyName
}

var _$emailAddress: OptionalField<String?> {
var _$emailAddress: OptionalField<String> {
guard let mirror = Mirror(reflecting: self).descendant("_emailAddress"),
let emailAddress = mirror as? OptionalField<String?> else {
let emailAddress = mirror as? OptionalField<String> else {
fatalError("emailAddress property must be declared using @OptionalField")
}

return emailAddress
}

var _$postalCode: OptionalField<String?> {
var _$postalCode: OptionalField<String> {
guard let mirror = Mirror(reflecting: self).descendant("_postalCode"),
let postalCode = mirror as? OptionalField<String?> else {
let postalCode = mirror as? OptionalField<String> else {
fatalError("postalCode property must be declared using @OptionalField")
}

return postalCode
}

var _$ISOCountryCode: OptionalField<String?> {
var _$ISOCountryCode: OptionalField<String> {
guard let mirror = Mirror(reflecting: self).descendant("_ISOCountryCode"),
let ISOCountryCode = mirror as? OptionalField<String?> else {
let ISOCountryCode = mirror as? OptionalField<String> else {
fatalError("ISOCountryCode property must be declared using @OptionalField")
}

return ISOCountryCode
}

var _$phoneNumber: OptionalField<String?> {
var _$phoneNumber: OptionalField<String> {
guard let mirror = Mirror(reflecting: self).descendant("_phoneNumber"),
let phoneNumber = mirror as? OptionalField<String?> else {
let phoneNumber = mirror as? OptionalField<String> else {
fatalError("phoneNumber property must be declared using @OptionalField")
}

Expand Down
27 changes: 25 additions & 2 deletions Tests/OrdersTests/OrdersTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,12 @@ final class OrdersTests: XCTestCase {
try await app.autoMigrate()
}

override func tearDown() async throws {
try await app.autoRevert()
try await self.app.asyncShutdown()
self.app = nil
}

func testOrderGeneration() async throws {
let orderData = OrderData(title: "Test Order")
try await orderData.create(on: app.db)
Expand Down Expand Up @@ -138,14 +144,14 @@ final class OrdersTests: XCTestCase {
let logs = try await OrdersErrorLog.query(on: app.db).all()
XCTAssertEqual(logs.count, 2)
XCTAssertEqual(logs[0].message, log1)
XCTAssertEqual(logs[1].message, log2)
XCTAssertEqual(logs[1]._$message.value, log2)
}

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)
let order = try await orderData._$order.get(on: app.db)
try await ordersService.sendPushNotifications(for: order, on: app.db)
try await ordersService.sendPushNotificationsForOrder(id: order.requireID(), of: order.orderTypeIdentifier, on: app.db)

Expand All @@ -158,4 +164,21 @@ final class OrdersTests: XCTestCase {
}
)
}

func testOrdersError() {
XCTAssertEqual(OrdersError.templateNotDirectory.description, "OrdersError(errorType: templateNotDirectory)")
XCTAssertEqual(OrdersError.pemCertificateMissing.description, "OrdersError(errorType: pemCertificateMissing)")
XCTAssertEqual(OrdersError.pemPrivateKeyMissing.description, "OrdersError(errorType: pemPrivateKeyMissing)")
XCTAssertEqual(OrdersError.opensslBinaryMissing.description, "OrdersError(errorType: opensslBinaryMissing)")
}

func testDefaultDelegate() {
let delegate = DefaultOrdersDelegate()
XCTAssertEqual(delegate.wwdrCertificate, "WWDR.pem")
XCTAssertEqual(delegate.pemCertificate, "ordercertificate.pem")
XCTAssertEqual(delegate.pemPrivateKey, "orderkey.pem")
XCTAssertNil(delegate.pemPrivateKeyPassword)
XCTAssertEqual(delegate.sslBinary, URL(fileURLWithPath: "/usr/bin/openssl"))
XCTAssertFalse(delegate.generateSignatureFile(in: URL(fileURLWithPath: "")))
}
}
6 changes: 6 additions & 0 deletions Tests/OrdersTests/TestOrdersDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -32,3 +32,9 @@ final class TestOrdersDelegate: OrdersDelegate {
)
}
}

final class DefaultOrdersDelegate: OrdersDelegate {
let sslSigningFilesDirectory = URL(fileURLWithPath: "", isDirectory: true)
func template<O: OrderModel>(for order: O, db: any Database) async throws -> URL { URL(fileURLWithPath: "") }
func encode<O: OrderModel>(order: O, db: any Database, encoder: JSONEncoder) async throws -> Data { Data() }
}
50 changes: 40 additions & 10 deletions Tests/PassesTests/PassesTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,12 @@ final class PassesTests: XCTestCase {
try await app.autoMigrate()
}

override func tearDown() async throws {
try await app.autoRevert()
try await self.app.asyncShutdown()
self.app = nil
}

func testPassGeneration() async throws {
let passData = PassData(title: "Test Pass")
try await passData.create(on: app.db)
Expand All @@ -42,7 +48,7 @@ final class PassesTests: XCTestCase {

let passData2 = PassData(title: "Test Pass 2")
try await passData2.create(on: app.db)
let pass2 = try await passData2.$pass.get(on: app.db)
let pass2 = try await passData2._$pass.get(on: app.db)

let data = try await passesService.generatePassesContent(for: [pass1, pass2], on: app.db)
XCTAssertNotNil(data)
Expand Down Expand Up @@ -114,13 +120,13 @@ final class PassesTests: XCTestCase {

let personalizationQuery = try await UserPersonalization.query(on: app.db).all()
XCTAssertEqual(personalizationQuery.count, 1)
XCTAssertEqual(personalizationQuery[0].emailAddress, personalizationDict.requiredPersonalizationInfo.emailAddress)
XCTAssertEqual(personalizationQuery[0].familyName, personalizationDict.requiredPersonalizationInfo.familyName)
XCTAssertEqual(personalizationQuery[0].fullName, personalizationDict.requiredPersonalizationInfo.fullName)
XCTAssertEqual(personalizationQuery[0].givenName, personalizationDict.requiredPersonalizationInfo.givenName)
XCTAssertEqual(personalizationQuery[0].ISOCountryCode, personalizationDict.requiredPersonalizationInfo.ISOCountryCode)
XCTAssertEqual(personalizationQuery[0].phoneNumber, personalizationDict.requiredPersonalizationInfo.phoneNumber)
XCTAssertEqual(personalizationQuery[0].postalCode, personalizationDict.requiredPersonalizationInfo.postalCode)
XCTAssertEqual(personalizationQuery[0]._$emailAddress.value, personalizationDict.requiredPersonalizationInfo.emailAddress)
XCTAssertEqual(personalizationQuery[0]._$familyName.value, personalizationDict.requiredPersonalizationInfo.familyName)
XCTAssertEqual(personalizationQuery[0]._$fullName.value, personalizationDict.requiredPersonalizationInfo.fullName)
XCTAssertEqual(personalizationQuery[0]._$givenName.value, personalizationDict.requiredPersonalizationInfo.givenName)
XCTAssertEqual(personalizationQuery[0]._$ISOCountryCode.value, personalizationDict.requiredPersonalizationInfo.ISOCountryCode)
XCTAssertEqual(personalizationQuery[0]._$phoneNumber.value, personalizationDict.requiredPersonalizationInfo.phoneNumber)
XCTAssertEqual(personalizationQuery[0]._$postalCode.value, personalizationDict.requiredPersonalizationInfo.postalCode)
}

func testAPIDeviceRegistration() async throws {
Expand Down Expand Up @@ -205,14 +211,14 @@ final class PassesTests: XCTestCase {
let logs = try await PassesErrorLog.query(on: app.db).all()
XCTAssertEqual(logs.count, 2)
XCTAssertEqual(logs[0].message, log1)
XCTAssertEqual(logs[1].message, log2)
XCTAssertEqual(logs[1]._$message.value, log2)
}

func testAPNSClient() async throws {
XCTAssertNotNil(app.apns.client(.init(string: "passes")))
let passData = PassData(title: "Test Pass")
try await passData.create(on: app.db)
let pass = try await passData.$pass.get(on: app.db)
let pass = try await passData._$pass.get(on: app.db)
try await passesService.sendPushNotifications(for: pass, on: app.db)
try await passesService.sendPushNotificationsForPass(id: pass.requireID(), of: pass.passTypeIdentifier, on: app.db)

Expand All @@ -225,4 +231,28 @@ final class PassesTests: XCTestCase {
}
)
}

func testPassesError() {
XCTAssertEqual(PassesError.templateNotDirectory.description, "PassesError(errorType: templateNotDirectory)")
XCTAssertEqual(PassesError.pemCertificateMissing.description, "PassesError(errorType: pemCertificateMissing)")
XCTAssertEqual(PassesError.pemPrivateKeyMissing.description, "PassesError(errorType: pemPrivateKeyMissing)")
XCTAssertEqual(PassesError.opensslBinaryMissing.description, "PassesError(errorType: opensslBinaryMissing)")
XCTAssertEqual(PassesError.invalidNumberOfPasses.description, "PassesError(errorType: invalidNumberOfPasses)")
}

func testDefaultDelegate() async throws {
let delegate = DefaultPassesDelegate()
XCTAssertEqual(delegate.wwdrCertificate, "WWDR.pem")
XCTAssertEqual(delegate.pemCertificate, "passcertificate.pem")
XCTAssertEqual(delegate.pemPrivateKey, "passkey.pem")
XCTAssertNil(delegate.pemPrivateKeyPassword)
XCTAssertEqual(delegate.sslBinary, URL(fileURLWithPath: "/usr/bin/openssl"))
XCTAssertFalse(delegate.generateSignatureFile(in: URL(fileURLWithPath: "")))

let passData = PassData(title: "Test Pass")
try await passData.create(on: app.db)
let pass = try await passData.$pass.get(on: app.db)
let data = try await delegate.encodePersonalization(for: pass, db: app.db, encoder: JSONEncoder())
XCTAssertNil(data)
}
}
6 changes: 6 additions & 0 deletions Tests/PassesTests/TestPassesDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -51,3 +51,9 @@ final class TestPassesDelegate: PassesDelegate {
)
}
}

final class DefaultPassesDelegate: PassesDelegate {
let sslSigningFilesDirectory = URL(fileURLWithPath: "", isDirectory: true)
func template<P: PassModel>(for pass: P, db: any Database) async throws -> URL { URL(fileURLWithPath: "") }
func encode<P: PassModel>(pass: P, db: any Database, encoder: JSONEncoder) async throws -> Data { Data() }
}

0 comments on commit a2a35b5

Please sign in to comment.