From 71ba6b7ff388ea56b0fdbfea5338730512623ffa Mon Sep 17 00:00:00 2001
From: Dariusz Rybicki <dariusz@elixxir.io>
Date: Wed, 27 Jul 2022 14:21:06 +0100
Subject: [PATCH] Add BroadcastMessage model

---
 .../Models/BroadcastMessage.swift             | 33 +++++++++++++++++++
 .../Models/BroadcastMessageTests.swift        | 31 +++++++++++++++++
 2 files changed, 64 insertions(+)
 create mode 100644 Sources/ElixxirDAppsSDK/Models/BroadcastMessage.swift
 create mode 100644 Tests/ElixxirDAppsSDKTests/Models/BroadcastMessageTests.swift

diff --git a/Sources/ElixxirDAppsSDK/Models/BroadcastMessage.swift b/Sources/ElixxirDAppsSDK/Models/BroadcastMessage.swift
new file mode 100644
index 00000000..19f31183
--- /dev/null
+++ b/Sources/ElixxirDAppsSDK/Models/BroadcastMessage.swift
@@ -0,0 +1,33 @@
+import Foundation
+
+public struct BroadcastMessage: Equatable {
+  public init(
+    roundId: Int,
+    ephId: [Int],
+    payload: Data
+  ) {
+    self.roundId = roundId
+    self.ephId = ephId
+    self.payload = payload
+  }
+
+  public var roundId: Int
+  public var ephId: [Int]
+  public var payload: Data
+}
+
+extension BroadcastMessage: Codable {
+  enum CodingKeys: String, CodingKey {
+    case roundId = "RoundID"
+    case ephId = "EphID"
+    case payload = "Payload"
+  }
+
+  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/ElixxirDAppsSDKTests/Models/BroadcastMessageTests.swift b/Tests/ElixxirDAppsSDKTests/Models/BroadcastMessageTests.swift
new file mode 100644
index 00000000..f9cac4b9
--- /dev/null
+++ b/Tests/ElixxirDAppsSDKTests/Models/BroadcastMessageTests.swift
@@ -0,0 +1,31 @@
+import CustomDump
+import XCTest
+@testable import ElixxirDAppsSDK
+
+final class BroadcastMessageTests: XCTestCase {
+  func testCoding() throws {
+    let roundId: Int = 42
+    let ephId: [Int] = [0, 0, 0, 0, 0, 0, 24, 61]
+    let payloadB64 = "SGVsbG8sIGJyb2FkY2FzdCBmcmllbmRzIQ=="
+    let jsonString = """
+    {
+      "RoundID": \(roundId),
+      "EphID": [\(ephId.map { "\($0)" }.joined(separator: ", "))],
+      "Payload": "\(payloadB64)"
+    }
+    """
+    let jsonData = jsonString.data(using: .utf8)!
+    let message = try BroadcastMessage.decode(jsonData)
+
+    XCTAssertNoDifference(message, BroadcastMessage(
+      roundId: roundId,
+      ephId: ephId,
+      payload: Data(base64Encoded: payloadB64)!
+    ))
+
+    let encodedMessage = try message.encode()
+    let decodedMessage = try BroadcastMessage.decode(encodedMessage)
+
+    XCTAssertNoDifference(decodedMessage, message)
+  }
+}
-- 
GitLab