diff --git a/Sources/XXClient/Functions/GetNotificationsReport.swift b/Sources/XXClient/Functions/GetNotificationsReport.swift index 81d54a59e298bc8a7f5a597736ca5f494e7f07c4..9b1235728902e37a28352fd56479429d53aceb57 100644 --- a/Sources/XXClient/Functions/GetNotificationsReport.swift +++ b/Sources/XXClient/Functions/GetNotificationsReport.swift @@ -2,12 +2,12 @@ import Bindings import XCTestDynamicOverlay public struct GetNotificationsReport { - public var run: (String, MessageServiceList) throws -> NotificationReport + public var run: (String, MessageServiceList) throws -> [NotificationReport] public func callAsFunction( notificationCSV: String, services: MessageServiceList - ) throws -> NotificationReport { + ) throws -> [NotificationReport] { try run(notificationCSV, services) } } @@ -26,7 +26,7 @@ extension GetNotificationsReport { guard let result = result else { fatalError("BindingsGetNotificationsReport returned nil without providing error") } - return try NotificationReport.decode(result) + return try [NotificationReport].decode(result) } } diff --git a/Sources/XXClient/Models/NotificationReport.swift b/Sources/XXClient/Models/NotificationReport.swift index 06eb1d89c273fcfec99e8d4615936a1d9b8ff237..3a0192cca17d9e0392302800c298f591389a02dc 100644 --- a/Sources/XXClient/Models/NotificationReport.swift +++ b/Sources/XXClient/Models/NotificationReport.swift @@ -45,3 +45,13 @@ extension NotificationReport: Codable { try JSONEncoder().encode(self) } } + +extension Array where Element == NotificationReport { + 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/Sources/XXMessengerClient/Messenger/Functions/MessengerGetNotificationReport.swift b/Sources/XXMessengerClient/Messenger/Functions/MessengerGetNotificationReports.swift similarity index 67% rename from Sources/XXMessengerClient/Messenger/Functions/MessengerGetNotificationReport.swift rename to Sources/XXMessengerClient/Messenger/Functions/MessengerGetNotificationReports.swift index a7f04ff91554e2982cfb082cb49a9c289985dd6f..b2496c2255cf3d8988e533855d6a161eb89d9a40 100644 --- a/Sources/XXMessengerClient/Messenger/Functions/MessengerGetNotificationReport.swift +++ b/Sources/XXMessengerClient/Messenger/Functions/MessengerGetNotificationReports.swift @@ -1,21 +1,21 @@ import XXClient import XCTestDynamicOverlay -public struct MessengerGetNotificationReport { +public struct MessengerGetNotificationReports { public enum Error: Swift.Error, Equatable { case serviceListMissing } - public var run: (String) throws -> NotificationReport + public var run: (String) throws -> [NotificationReport] - public func callAsFunction(notificationCSV: String) throws -> NotificationReport { + public func callAsFunction(notificationCSV: String) throws -> [NotificationReport] { try run(notificationCSV) } } -extension MessengerGetNotificationReport { - public static func live(_ env: MessengerEnvironment) -> MessengerGetNotificationReport { - MessengerGetNotificationReport { notificationCSV in +extension MessengerGetNotificationReports { + public static func live(_ env: MessengerEnvironment) -> MessengerGetNotificationReports { + MessengerGetNotificationReports { notificationCSV in guard let serviceList = env.serviceList() else { throw Error.serviceListMissing } @@ -27,8 +27,8 @@ extension MessengerGetNotificationReport { } } -extension MessengerGetNotificationReport { - public static let unimplemented = MessengerGetNotificationReport( +extension MessengerGetNotificationReports { + public static let unimplemented = MessengerGetNotificationReports( run: XCTUnimplemented("\(Self.self)") ) } diff --git a/Sources/XXMessengerClient/Messenger/Messenger.swift b/Sources/XXMessengerClient/Messenger/Messenger.swift index d0bf6e46b814ce1c10a3194d627cd46707528530..9261d26467400a3f34fc9852c08dd5df1baf0b5d 100644 --- a/Sources/XXMessengerClient/Messenger/Messenger.swift +++ b/Sources/XXMessengerClient/Messenger/Messenger.swift @@ -47,7 +47,7 @@ public struct Messenger { public var sendFile: MessengerSendFile public var receiveFile: MessengerReceiveFile public var trackServices: MessengerTrackServices - public var getNotificationReport: MessengerGetNotificationReport + public var getNotificationReports: MessengerGetNotificationReports } extension Messenger { @@ -99,7 +99,7 @@ extension Messenger { sendFile: .live(env), receiveFile: .live(env), trackServices: .live(env), - getNotificationReport: .live(env) + getNotificationReports: .live(env) ) } } @@ -152,6 +152,6 @@ extension Messenger { sendFile: .unimplemented, receiveFile: .unimplemented, trackServices: .unimplemented, - getNotificationReport: .unimplemented + getNotificationReports: .unimplemented ) } diff --git a/Tests/XXClientTests/Models/NotificationReportTests.swift b/Tests/XXClientTests/Models/NotificationReportTests.swift index 9e99d82544e5631c26142d4a43b5a64ba96342bc..4b8372fc8669d0a660325412dcbf72b5ad5a7877 100644 --- a/Tests/XXClientTests/Models/NotificationReportTests.swift +++ b/Tests/XXClientTests/Models/NotificationReportTests.swift @@ -28,4 +28,43 @@ final class NotificationReportTests: XCTestCase { XCTAssertNoDifference(decodedModel, model) } + + func testCodingArray() throws { + let source1B64 = "dGVzdGVyMTIzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + let source2B64 = "ciI1cpyUUY/UPaVeMy1zBFWbZRgiZSXhY+cVoM+fCxwD" + let jsonString = """ + [ + { + "ForMe": true, + "Type": "\(NotificationReport.ReportType.default.rawValue)", + "Source": "\(source1B64)" + }, + { + "ForMe": false, + "Type": "\(NotificationReport.ReportType.request.rawValue)", + "Source": "\(source2B64)" + }, + ] + """ + let jsonData = jsonString.data(using: .utf8)! + let models = try [NotificationReport].decode(jsonData) + + XCTAssertNoDifference(models, [ + NotificationReport( + forMe: true, + type: .default, + source: Data(base64Encoded: source1B64)! + ), + NotificationReport( + forMe: false, + type: .request, + source: Data(base64Encoded: source2B64)! + ) + ]) + + let encodedModels = try models.encode() + let decodedModels = try [NotificationReport].decode(encodedModels) + + XCTAssertNoDifference(decodedModels, models) + } } diff --git a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerGetNotificationReportTests.swift b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerGetNotificationReportsTests.swift similarity index 65% rename from Tests/XXMessengerClientTests/Messenger/Functions/MessengerGetNotificationReportTests.swift rename to Tests/XXMessengerClientTests/Messenger/Functions/MessengerGetNotificationReportsTests.swift index eed49be16789ec70d6179e9b5c0a8c5fc2e2e171..98e1adce1915b5d60e93312ab22990f830db3628 100644 --- a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerGetNotificationReportTests.swift +++ b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerGetNotificationReportsTests.swift @@ -4,11 +4,11 @@ import XCTestDynamicOverlay import XXClient @testable import XXMessengerClient -final class MessengerGetNotificationReportTests: XCTestCase { +final class MessengerGetNotificationReportsTests: XCTestCase { func testGetReport() throws { let serviceList = MessageServiceList.stub() let notificationCSV = "notification-csv" - let notificationReport = NotificationReport.stub() + let notificationReports = [NotificationReport].stub() struct GetNotificationsReportParams: Equatable { var notificationCSV: String @@ -25,11 +25,11 @@ final class MessengerGetNotificationReportTests: XCTestCase { notificationCSV: notificationCSV, serviceList: serviceList )) - return notificationReport + return notificationReports } - let getReport: MessengerGetNotificationReport = .live(env) + let getReports: MessengerGetNotificationReports = .live(env) - let report = try getReport(notificationCSV: notificationCSV) + let reports = try getReports(notificationCSV: notificationCSV) XCTAssertNoDifference(didGetNotificationsReport, [ .init( @@ -37,25 +37,31 @@ final class MessengerGetNotificationReportTests: XCTestCase { serviceList: serviceList ) ]) - XCTAssertNoDifference(report, notificationReport) + XCTAssertNoDifference(reports, notificationReports) } func testGetReportWhenServiceListMissing() { var env: MessengerEnvironment = .unimplemented env.e2e.get = { .unimplemented } env.serviceList.get = { nil } - let getReport: MessengerGetNotificationReport = .live(env) + let getReports: MessengerGetNotificationReports = .live(env) - XCTAssertThrowsError(try getReport(notificationCSV: "")) { error in + XCTAssertThrowsError(try getReports(notificationCSV: "")) { error in XCTAssertNoDifference( - error as? MessengerGetNotificationReport.Error, + error as? MessengerGetNotificationReports.Error, .serviceListMissing ) } } } -extension NotificationReport { +private extension Array where Element == NotificationReport { + static func stub() -> [NotificationReport] { + [.stub(), .stub(), .stub()] + } +} + +private extension NotificationReport { static func stub() -> NotificationReport { NotificationReport( forMe: .random(),