From 90d138212a3a14cdb7bba327ec29eb5645b2a467 Mon Sep 17 00:00:00 2001
From: Dariusz Rybicki <dariusz@elixxir.io>
Date: Fri, 3 Jun 2022 12:27:49 +0200
Subject: [PATCH] Add Message codable model

---
 Sources/ElixxirDAppsSDK/Message.swift         | 49 +++++++++++++++++++
 Tests/ElixxirDAppsSDKTests/MessageTests.swift | 48 ++++++++++++++++++
 2 files changed, 97 insertions(+)
 create mode 100644 Sources/ElixxirDAppsSDK/Message.swift
 create mode 100644 Tests/ElixxirDAppsSDKTests/MessageTests.swift

diff --git a/Sources/ElixxirDAppsSDK/Message.swift b/Sources/ElixxirDAppsSDK/Message.swift
new file mode 100644
index 00000000..b6fc6c4c
--- /dev/null
+++ b/Sources/ElixxirDAppsSDK/Message.swift
@@ -0,0 +1,49 @@
+import Foundation
+
+public struct Message: Equatable {
+  public init(
+    messageType: Int,
+    id: Data,
+    payload: Data,
+    sender: Data,
+    recipientId: Data,
+    ephemeralId: Int,
+    timestamp: Int,
+    encrypted: Bool,
+    roundId: Int
+  ) {
+    self.messageType = messageType
+    self.id = id
+    self.payload = payload
+    self.sender = sender
+    self.recipientId = recipientId
+    self.ephemeralId = ephemeralId
+    self.timestamp = timestamp
+    self.encrypted = encrypted
+    self.roundId = roundId
+  }
+
+  public var messageType: Int
+  public var id: Data
+  public var payload: Data
+  public var sender: Data
+  public var recipientId: Data
+  public var ephemeralId: Int
+  public var timestamp: Int
+  public var encrypted: Bool
+  public var roundId: Int
+}
+
+extension Message: Codable {
+  enum CodingKeys: String, CodingKey {
+    case messageType = "MessageType"
+    case id = "ID"
+    case payload = "Payload"
+    case sender = "Sender"
+    case recipientId = "RecipientID"
+    case ephemeralId = "EphemeralID"
+    case timestamp = "Timestamp"
+    case encrypted = "Encrypted"
+    case roundId = "RoundId"
+  }
+}
diff --git a/Tests/ElixxirDAppsSDKTests/MessageTests.swift b/Tests/ElixxirDAppsSDKTests/MessageTests.swift
new file mode 100644
index 00000000..c01a880f
--- /dev/null
+++ b/Tests/ElixxirDAppsSDKTests/MessageTests.swift
@@ -0,0 +1,48 @@
+import CustomDump
+import XCTest
+@testable import ElixxirDAppsSDK
+
+final class MessageTests: XCTestCase {
+  func testCoding() throws {
+    let id = secureRandomData(count: 32)
+    let payload = secureRandomData(count: 32)
+    let sender = secureRandomData(count: 32)
+    let recipientId = secureRandomData(count: 32)
+    let jsonString = """
+    {
+      "MessageType": 1,
+      "ID": \(id.jsonEncodedBase64()),
+      "Payload": \(payload.jsonEncodedBase64()),
+      "Sender": \(sender.jsonEncodedBase64()),
+      "RecipientID": \(recipientId.jsonEncodedBase64()),
+      "EphemeralID": 17,
+      "Timestamp": 1653580439357351000,
+      "Encrypted": false,
+      "RoundId": 19
+    }
+    """
+    let jsonData = jsonString.data(using: .utf8)!
+    let decoder = JSONDecoder()
+    decoder.dataDecodingStrategy = .base64
+    let message = try decoder.decode(Message.self, from: jsonData)
+
+    XCTAssertNoDifference(message, Message(
+      messageType: 1,
+      id: id,
+      payload: payload,
+      sender: sender,
+      recipientId: recipientId,
+      ephemeralId: 17,
+      timestamp: 1_653_580_439_357_351_000,
+      encrypted: false,
+      roundId: 19
+    ))
+
+    let encoder = JSONEncoder()
+    encoder.dataEncodingStrategy = .base64
+    let encodedMessage = try encoder.encode(message)
+    let decodedMessage = try decoder.decode(Message.self, from: encodedMessage)
+
+    XCTAssertNoDifference(decodedMessage, message)
+  }
+}
-- 
GitLab