diff --git a/Sources/XXClient/Models/TrackServicesCallbackResult.swift b/Sources/XXClient/Models/TrackServicesCallbackResult.swift new file mode 100644 index 0000000000000000000000000000000000000000..03ea8490ae654075d018450504c66f546db88c79 --- /dev/null +++ b/Sources/XXClient/Models/TrackServicesCallbackResult.swift @@ -0,0 +1,36 @@ +import Foundation + +public struct TrackServicesCallbackResult: Equatable { + public init(id: Data, services: [MessageService]) { + self.id = id + self.services = services + } + + public var id: Data + public var services: [MessageService] +} + +extension TrackServicesCallbackResult: Codable { + enum CodingKeys: String, CodingKey { + case id = "Id" + case services = "Services" + } + + public static func decode(_ data: Data) throws -> Self { + try JSONDecoder().decode(Self.self, from: data) + } + + public func encode() throws -> Data { + try JSONEncoder().encode(self) + } +} + +extension Array where Element == TrackServicesCallbackResult { + public static func decode(_ data: Data) throws -> Self { + try JSONDecoder().decode(Self.self, from: data) + } + + public func encode() throws -> Data { + try JSONEncoder().encode(self) + } +} diff --git a/Tests/XXClientTests/Models/TrackServicesCallbackResultTests.swift b/Tests/XXClientTests/Models/TrackServicesCallbackResultTests.swift new file mode 100644 index 0000000000000000000000000000000000000000..855e23104da530e38d7c067d51363a30e9e2e719 --- /dev/null +++ b/Tests/XXClientTests/Models/TrackServicesCallbackResultTests.swift @@ -0,0 +1,77 @@ +import CustomDump +import XCTest +@testable import XXClient + +final class TrackServicesCallbackResultTests: XCTestCase { + func testCoding() throws { + let idB64 = "AAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD" + let serviceIdentifierB64 = "AQID" + let serviceTag = "TestTag 2" + let serviceMetadataB64 = "BAUG" + let jsonString = """ + { + "Id": "\(idB64)", + "Services": [ + { + "Identifier": "\(serviceIdentifierB64)", + "Tag": "\(serviceTag)", + "Metadata": "\(serviceMetadataB64)" + } + ] + } + """ + let jsonData = jsonString.data(using: .utf8)! + let model = try TrackServicesCallbackResult.decode(jsonData) + + XCTAssertNoDifference(model, TrackServicesCallbackResult( + id: Data(base64Encoded: idB64)!, + services: [ + MessageService( + identifier: Data(base64Encoded: serviceIdentifierB64)!, + tag: serviceTag, + metadata: Data(base64Encoded: serviceMetadataB64)! + ) + ] + )) + + let encodedModel = try model.encode() + let decodedModel = try TrackServicesCallbackResult.decode(encodedModel) + + XCTAssertNoDifference(decodedModel, model) + } + + func testCodingArray() throws { + let models = [ + TrackServicesCallbackResult( + id: "id1".data(using: .utf8)!, + services: [ + MessageService( + identifier: "service1-id".data(using: .utf8)!, + tag: "service1-tag", + metadata: "service1-metadata".data(using: .utf8)! + ), + ] + ), + TrackServicesCallbackResult( + id: "id2".data(using: .utf8)!, + services: [ + MessageService( + identifier: "service2-id".data(using: .utf8)!, + tag: "service2-tag", + metadata: "service2-metadata".data(using: .utf8)! + ), + MessageService( + identifier: "service3-id".data(using: .utf8)!, + tag: "service3-tag", + metadata: "service3-metadata".data(using: .utf8)! + ), + ] + ), + ] + + let encodedModels = try models.encode() + let decodedModels = try [TrackServicesCallbackResult].decode(encodedModels) + + XCTAssertNoDifference(models, decodedModels) + } +}