// // PKPaymentToken+SerializableTests.swift // PSCB-OOS-iOSTests // // Created by Antonov Ilia on 22.10.2020. // #if canImport(PassKit) import Foundation import PassKit import XCTest @testable import PSCBOnline final class PKPaymentTokenSerializableTests: XCTestCase { // MARK: - Test .serializeToJSON() func testPaymentTokenSerialization() { // given: let token = MockPaymentToken.createToken() // when: let json = token.serializeToJSON() print("JSON: >>") print(json) // then: XCTAssertEqual(json["transactionIdentifier"], "2C7B4FD8-7D1B-49D4-8AB5-AFE3CC79265A") // and: let method = json["paymentMethod"] let network = (method as! [String: AnyHashable])["network"] ?? "N/A" as AnyHashable XCTAssertEqual(network, "Visa" as AnyHashable) } // MARK: - Test .serializeToData() func testSerializeToData() { // given: let token = MockPaymentToken.createToken() // expect: XCTAssertNoThrow(try token.serializeToData()) } // MARK: - Test .serializeToString() func testSerializeToString() { // given: let token = MockPaymentToken.createToken() // expect: XCTAssertNoThrow(try token.serializeToString()) // when: let json = try! token.serializeToString() // debug: print("JSON: >>") print(json) } // MARK: - Test PKPaymentToken.toCryptogramString() func testToCryptogramString() { // given: let token = MockPaymentToken.createToken() // expect: XCTAssertNoThrow(try token.toCryptogramString()) // when: let string = try! token.toCryptogramString() // debug: print("Cryptogram String: >> \(string)") // then: XCTAssertFalse(string.isEmpty) // when: let data = Data(base64Encoded: string, options: Data.Base64DecodingOptions(rawValue: 0))! // debug: print("Decoded >>") print(String(data: data, encoding: .utf8)!) // and: let decoder = JSONDecoder() let output = try! decoder.decode(PaymentTokenResult.self, from: data) // then: XCTAssertEqual(output.version, "EC_v1") XCTAssertEqual(output.signature, "....") } } internal struct PaymentTokenResult: Decodable { let data: String let version: String let signature: String } internal struct PaymentMethodResult: Decodable { let displayName: String let network: String let type: String } #endif