From b6939ba6131535ac60c0ed4d31b641bead139f0f Mon Sep 17 00:00:00 2001
From: Dariusz Rybicki <dariusz@elixxir.io>
Date: Tue, 8 Nov 2022 11:46:01 +0100
Subject: [PATCH] Add MessengerGetNotificationReport

---
 .../XXClient/Models/NotificationReport.swift  |  2 +-
 .../MessengerGetNotificationReport.swift      | 39 ++++++++
 .../Messenger/MessengerEnvironment.swift      |  3 +
 .../MessengerGetNotificationReportTests.swift | 88 +++++++++++++++++++
 4 files changed, 131 insertions(+), 1 deletion(-)
 create mode 100644 Sources/XXMessengerClient/Messenger/Functions/MessengerGetNotificationReport.swift
 create mode 100644 Tests/XXMessengerClientTests/Messenger/Functions/MessengerGetNotificationReportTests.swift

diff --git a/Sources/XXClient/Models/NotificationReport.swift b/Sources/XXClient/Models/NotificationReport.swift
index 31c106a3..06eb1d89 100644
--- a/Sources/XXClient/Models/NotificationReport.swift
+++ b/Sources/XXClient/Models/NotificationReport.swift
@@ -1,7 +1,7 @@
 import Foundation
 
 public struct NotificationReport: Equatable {
-  public enum ReportType: String, Equatable {
+  public enum ReportType: String, Equatable, CaseIterable {
     case `default`
     case request
     case reset
diff --git a/Sources/XXMessengerClient/Messenger/Functions/MessengerGetNotificationReport.swift b/Sources/XXMessengerClient/Messenger/Functions/MessengerGetNotificationReport.swift
new file mode 100644
index 00000000..6de0ead8
--- /dev/null
+++ b/Sources/XXMessengerClient/Messenger/Functions/MessengerGetNotificationReport.swift
@@ -0,0 +1,39 @@
+import XXClient
+import XCTestDynamicOverlay
+
+public struct MessengerGetNotificationReport {
+  public enum Error: Swift.Error, Equatable {
+    case notConnected
+    case serviceListMissing
+  }
+
+  public var run: (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
+      guard let e2e = env.e2e() else {
+        throw Error.notConnected
+      }
+      guard let serviceList = env.serviceList() else {
+        throw Error.serviceListMissing
+      }
+      return try env.getNotificationsReport(
+        e2eId: e2e.getId(),
+        notificationCSV: notificationCSV,
+        services: serviceList
+      )
+    }
+  }
+}
+
+extension MessengerGetNotificationReport {
+  public static let unimplemented = MessengerGetNotificationReport(
+    run: XCTUnimplemented("\(Self.self)")
+  )
+}
diff --git a/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift b/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift
index d8c68787..76707e35 100644
--- a/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift
+++ b/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift
@@ -16,6 +16,7 @@ public struct MessengerEnvironment {
   public var getE2EFileTransferParams: GetE2EFileTransferParams
   public var getE2EParams: GetE2EParams
   public var getFileTransferParams: GetFileTransferParams
+  public var getNotificationsReport: GetNotificationsReport
   public var getSingleUseParams: GetSingleUseParams
   public var initFileTransfer: InitFileTransfer
   public var initializeBackup: InitializeBackup
@@ -68,6 +69,7 @@ extension MessengerEnvironment {
       getE2EFileTransferParams: .liveDefault,
       getE2EParams: .liveDefault,
       getFileTransferParams: .liveDefault,
+      getNotificationsReport: .live,
       getSingleUseParams: .liveDefault,
       initFileTransfer: .live,
       initializeBackup: .live,
@@ -115,6 +117,7 @@ extension MessengerEnvironment {
     getE2EFileTransferParams: .unimplemented,
     getE2EParams: .unimplemented,
     getFileTransferParams: .unimplemented,
+    getNotificationsReport: .unimplemented,
     getSingleUseParams: .unimplemented,
     initFileTransfer: .unimplemented,
     initializeBackup: .unimplemented,
diff --git a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerGetNotificationReportTests.swift b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerGetNotificationReportTests.swift
new file mode 100644
index 00000000..236cfae7
--- /dev/null
+++ b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerGetNotificationReportTests.swift
@@ -0,0 +1,88 @@
+import CustomDump
+import XCTest
+import XCTestDynamicOverlay
+import XXClient
+@testable import XXMessengerClient
+
+final class MessengerGetNotificationReportTests: XCTestCase {
+  func testGetReport() throws {
+    let e2eId = 123
+    let serviceList = MessageServiceList.stub()
+    let notificationCSV = "notification-csv"
+    let notificationReport = NotificationReport.stub()
+
+    struct GetNotificationsReportParams: Equatable {
+      var e2eId: Int
+      var notificationCSV: String
+      var serviceList: MessageServiceList
+    }
+    var didGetNotificationsReport: [GetNotificationsReportParams] = []
+
+    var env: MessengerEnvironment = .unimplemented
+    env.e2e.get = {
+      var e2e: E2E = .unimplemented
+      e2e.getId.run = { e2eId }
+      return e2e
+    }
+    env.serviceList.get = {
+      serviceList
+    }
+    env.getNotificationsReport.run = { e2eId, notificationCSV, serviceList in
+      didGetNotificationsReport.append(.init(
+        e2eId: e2eId,
+        notificationCSV: notificationCSV,
+        serviceList: serviceList
+      ))
+      return notificationReport
+    }
+    let getReport: MessengerGetNotificationReport = .live(env)
+
+    let report = try getReport(notificationCSV: notificationCSV)
+
+    XCTAssertNoDifference(didGetNotificationsReport, [
+      .init(
+        e2eId: e2eId,
+        notificationCSV: notificationCSV,
+        serviceList: serviceList
+      )
+    ])
+    XCTAssertNoDifference(report, notificationReport)
+  }
+
+  func testGetReportWhenNotConnected() {
+    var env: MessengerEnvironment = .unimplemented
+    env.e2e.get = { nil }
+    let getReport: MessengerGetNotificationReport = .live(env)
+
+    XCTAssertThrowsError(try getReport(notificationCSV: "")) { error in
+      XCTAssertNoDifference(
+        error as? MessengerGetNotificationReport.Error,
+        .notConnected
+      )
+    }
+  }
+
+  func testGetReportWhenServiceListMissing() {
+    var env: MessengerEnvironment = .unimplemented
+    env.e2e.get = { .unimplemented }
+    env.serviceList.get = { nil }
+    let getReport: MessengerGetNotificationReport = .live(env)
+
+    XCTAssertThrowsError(try getReport(notificationCSV: "")) { error in
+      XCTAssertNoDifference(
+        error as? MessengerGetNotificationReport.Error,
+        .serviceListMissing
+      )
+    }
+  }
+}
+
+extension NotificationReport {
+  static func stub() -> NotificationReport {
+    NotificationReport(
+      forMe: .random(),
+      type: ReportType.allCases.randomElement()!,
+      source: "source-\(Int.random(in: 100...999))".data(using: .utf8)!
+    )
+  }
+}
-- 
GitLab