diff --git a/Sources/XXClient/Models/UDSearchResult.swift b/Sources/XXClient/Models/UDSearchResult.swift new file mode 100644 index 0000000000000000000000000000000000000000..26e6bf4dadca56b85ed038b2a1176da44b82da50 --- /dev/null +++ b/Sources/XXClient/Models/UDSearchResult.swift @@ -0,0 +1,39 @@ +import Foundation + +public struct UDSearchResult: Equatable { + public init( + id: Data, + facts: [Fact] + ) { + self.id = id + self.facts = facts + } + + public var id: Data + public var facts: [Fact] +} + +extension UDSearchResult: Codable { + enum CodingKeys: String, CodingKey { + case id = "ID" + case facts = "Facts" + } + + 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 == UDSearchResult { + 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/UDSearchResultTests.swift b/Tests/XXClientTests/Models/UDSearchResultTests.swift new file mode 100644 index 0000000000000000000000000000000000000000..3037e773a8f2f1dfbc726eb4d9a872f95a2c5e0e --- /dev/null +++ b/Tests/XXClientTests/Models/UDSearchResultTests.swift @@ -0,0 +1,45 @@ +import CustomDump +import XCTest +@testable import XXClient + +final class UDSearchResultTests: XCTestCase { + func testCoding() throws { + let idB64 = "pYIpRwPy+FnOkl5tndkG8RC93W/t5b1lszqPpMDynlUD" + let facts: [Fact] = [ + Fact(fact: "carlos_arimateias", type: 0), + ] + let jsonString = """ + { + "ID": "\(idB64)", + "Facts": \(String(data: try! facts.encode(), encoding: .utf8)!) + } + """ + let jsonData = jsonString.data(using: .utf8)! + let model = try UDSearchResult.decode(jsonData) + + XCTAssertNoDifference(model, UDSearchResult( + id: Data(base64Encoded: idB64)!, + facts: facts + )) + + let encodedModel = try model.encode() + let decodedModel = try UDSearchResult.decode(encodedModel) + + XCTAssertNoDifference(decodedModel, model) + } + + func testCodingArray() throws { + let models: [UDSearchResult] = [ + UDSearchResult( + id: Data(base64Encoded: "pYIpRwPy+FnOkl5tndkG8RC93W/t5b1lszqPpMDynlUD")!, + facts: [ + Fact(fact: "carlos_arimateias", type: 0), + ] + ), + ] + let encodedModels = try models.encode() + let decodedModels = try [UDSearchResult].decode(encodedModels) + + XCTAssertNoDifference(decodedModels, models) + } +}