From 5fa25fe330ddd17ebf02461df087334c4b88eb27 Mon Sep 17 00:00:00 2001
From: Dariusz Rybicki <dariusz@elixxir.io>
Date: Tue, 30 Aug 2022 01:07:44 +0100
Subject: [PATCH] Add GroupMember model

---
 Sources/XXClient/Models/GroupMember.swift     | 30 ++++++++++++++++
 .../Models/GroupMemberTests.swift             | 36 +++++++++++++++++++
 2 files changed, 66 insertions(+)
 create mode 100644 Sources/XXClient/Models/GroupMember.swift
 create mode 100644 Tests/XXClientTests/Models/GroupMemberTests.swift

diff --git a/Sources/XXClient/Models/GroupMember.swift b/Sources/XXClient/Models/GroupMember.swift
new file mode 100644
index 00000000..b08d71c2
--- /dev/null
+++ b/Sources/XXClient/Models/GroupMember.swift
@@ -0,0 +1,30 @@
+import Foundation
+
+public struct GroupMember: Equatable {
+  public init(id: Data, dhKey: DHKey) {
+    self.id = id
+    self.dhKey = dhKey
+  }
+
+  public var id: Data
+  public var dhKey: DHKey
+}
+
+extension GroupMember: Decodable {
+  enum CodingKeys: String, CodingKey {
+    case id = "ID"
+    case dhKey = "DhKey"
+  }
+
+  public static func decode(_ data: Data) throws -> Self {
+    let data = convertJsonNumberToString(in: data, at: "Value")
+    return try JSONDecoder().decode(Self.self, from: data)
+  }
+}
+
+extension Array where Element == GroupMember {
+  public static func decode(_ data: Data) throws -> Self {
+    let data = convertJsonNumberToString(in: data, at: "Value")
+    return try JSONDecoder().decode(Self.self, from: data)
+  }
+}
diff --git a/Tests/XXClientTests/Models/GroupMemberTests.swift b/Tests/XXClientTests/Models/GroupMemberTests.swift
new file mode 100644
index 00000000..a682dfe9
--- /dev/null
+++ b/Tests/XXClientTests/Models/GroupMemberTests.swift
@@ -0,0 +1,36 @@
+import CustomDump
+import XCTest
+@testable import XXClient
+
+final class GroupMemberTests: XCTestCase {
+  func testCoding() throws {
+    let idB64 = "U4x/lrFkvxuXu59LtHLon1sUhPJSCcnZND6SugndnVID"
+    let dhKeyValue = "1759426033802606996617132861414734059978289057332806031357800676138355264622676606691435603603751978195460163638145821347601916259127578968570412642641025630452893097179266022832268525346700655861033031712000288680395716922501450233258587788020541937373196899001184700899008948530359980753630443486308876999029238453979779103124291315202352475056237021681172884599194016245219278368648568458514708567045834427853469072638665888791358582182353417065794210125797368093469194927663862565508608719835557592421245749381164023134450699040591219966988201315627676532245052123725278573237006510683695959381015415110970848376498637637944431576313526294020390694483472829278364602405292767170719547347485307956614210210673321959886410245334772057212077704024337636501108566655549055129066343309591274727538343075929837698653965640646190405582788894021694347212874155979958144038307500444865955516612526623220973497735316081265793063949"
+    let dhKeyFingerprint: UInt64 = 15989433043166758754
+    let jsonString = """
+    {
+      "ID": "\(idB64)",
+      "DhKey": {
+        "Value": \(dhKeyValue),
+        "Fingerprint": \(dhKeyFingerprint)
+      }
+    }
+    """
+    let jsonData = jsonString.data(using: .utf8)!
+    let model = try GroupMember.decode(jsonData)
+
+    XCTAssertNoDifference(model, GroupMember(
+      id: Data(base64Encoded: idB64)!,
+      dhKey: DHKey(
+        value: dhKeyValue,
+        fingerprint: dhKeyFingerprint
+      )
+    ))
+
+    let jsonArrayString = "[\(jsonString)]"
+    let jsonArrayData = jsonArrayString.data(using: .utf8)!
+    let decodedModels = try [GroupMember].decode(jsonArrayData)
+
+    XCTAssertNoDifference(decodedModels, [model])
+  }
+}
-- 
GitLab