From 837263bd4909bb9f05392f4c62b963a69ba0175e Mon Sep 17 00:00:00 2001
From: Dariusz Rybicki <dariusz@elixxir.io>
Date: Fri, 16 Sep 2022 17:41:49 +0200
Subject: [PATCH 1/7] Rename MessengerSearchUsers to MessengerSeatchContacts

---
 ...rs.swift => MessengerSearchContacts.swift} | 14 ++++-----
 .../Messenger/Messenger.swift                 |  6 ++--
 ...ift => MessengerSearchContactsTests.swift} | 30 +++++++++----------
 3 files changed, 25 insertions(+), 25 deletions(-)
 rename Sources/XXMessengerClient/Messenger/Functions/{MessengerSearchUsers.swift => MessengerSearchContacts.swift} (88%)
 rename Tests/XXMessengerClientTests/Messenger/Functions/{MessengerSearchUsersTests.swift => MessengerSearchContactsTests.swift} (84%)

diff --git a/Sources/XXMessengerClient/Messenger/Functions/MessengerSearchUsers.swift b/Sources/XXMessengerClient/Messenger/Functions/MessengerSearchContacts.swift
similarity index 88%
rename from Sources/XXMessengerClient/Messenger/Functions/MessengerSearchUsers.swift
rename to Sources/XXMessengerClient/Messenger/Functions/MessengerSearchContacts.swift
index 5acd76d7..94f55c27 100644
--- a/Sources/XXMessengerClient/Messenger/Functions/MessengerSearchUsers.swift
+++ b/Sources/XXMessengerClient/Messenger/Functions/MessengerSearchContacts.swift
@@ -2,7 +2,7 @@ import Foundation
 import XCTestDynamicOverlay
 import XXClient
 
-public struct MessengerSearchUsers {
+public struct MessengerSearchContacts {
   public struct Query: Equatable {
     public init(
       username: String? = nil,
@@ -31,9 +31,9 @@ public struct MessengerSearchUsers {
   }
 }
 
-extension MessengerSearchUsers {
-  public static func live(_ env: MessengerEnvironment) -> MessengerSearchUsers {
-    MessengerSearchUsers { query in
+extension MessengerSearchContacts {
+  public static func live(_ env: MessengerEnvironment) -> MessengerSearchContacts {
+    MessengerSearchContacts { query in
       guard let e2e = env.e2e() else {
         throw Error.notConnected
       }
@@ -63,7 +63,7 @@ extension MessengerSearchUsers {
   }
 }
 
-extension MessengerSearchUsers.Query {
+extension MessengerSearchContacts.Query {
   public var isEmpty: Bool {
     [username, email, phone]
       .compactMap { $0 }
@@ -86,8 +86,8 @@ extension MessengerSearchUsers.Query {
   }
 }
 
-extension MessengerSearchUsers {
-  public static let unimplemented = MessengerSearchUsers(
+extension MessengerSearchContacts {
+  public static let unimplemented = MessengerSearchContacts(
     run: XCTUnimplemented("\(Self.self)")
   )
 }
diff --git a/Sources/XXMessengerClient/Messenger/Messenger.swift b/Sources/XXMessengerClient/Messenger/Messenger.swift
index 4995f9a1..6a3c417b 100644
--- a/Sources/XXMessengerClient/Messenger/Messenger.swift
+++ b/Sources/XXMessengerClient/Messenger/Messenger.swift
@@ -21,7 +21,7 @@ public struct Messenger {
   public var waitForNetwork: MessengerWaitForNetwork
   public var waitForNodes: MessengerWaitForNodes
   public var destroy: MessengerDestroy
-  public var searchUsers: MessengerSearchUsers
+  public var searchContacts: MessengerSearchContacts
   public var registerForNotifications: MessengerRegisterForNotifications
   public var verifyContact: MessengerVerifyContact
   public var sendMessage: MessengerSendMessage
@@ -50,7 +50,7 @@ extension Messenger {
       waitForNetwork: .live(env),
       waitForNodes: .live(env),
       destroy: .live(env),
-      searchUsers: .live(env),
+      searchContacts: .live(env),
       registerForNotifications: .live(env),
       verifyContact: .live(env),
       sendMessage: .live(env)
@@ -80,7 +80,7 @@ extension Messenger {
     waitForNetwork: .unimplemented,
     waitForNodes: .unimplemented,
     destroy: .unimplemented,
-    searchUsers: .unimplemented,
+    searchContacts: .unimplemented,
     registerForNotifications: .unimplemented,
     verifyContact: .unimplemented,
     sendMessage: .unimplemented
diff --git a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerSearchUsersTests.swift b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerSearchContactsTests.swift
similarity index 84%
rename from Tests/XXMessengerClientTests/Messenger/Functions/MessengerSearchUsersTests.swift
rename to Tests/XXMessengerClientTests/Messenger/Functions/MessengerSearchContactsTests.swift
index 21152086..f3ab082c 100644
--- a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerSearchUsersTests.swift
+++ b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerSearchContactsTests.swift
@@ -3,7 +3,7 @@ import XCTest
 import XXClient
 @testable import XXMessengerClient
 
-final class MessengerSearchUsersTests: XCTestCase {
+final class MessengerSearchContactsTests: XCTestCase {
   func testSearch() throws {
     struct SearchUdParams: Equatable {
       var e2eId: Int
@@ -41,8 +41,8 @@ final class MessengerSearchUsersTests: XCTestCase {
       return SingleUseSendReport(rounds: [], roundURL: "", ephId: 0, receptionId: Data())
     }
 
-    let search: MessengerSearchUsers = .live(env)
-    let query = MessengerSearchUsers.Query(
+    let search: MessengerSearchContacts = .live(env)
+    let query = MessengerSearchContacts.Query(
       username: "Username",
       email: "Email",
       phone: "Phone"
@@ -67,10 +67,10 @@ final class MessengerSearchUsersTests: XCTestCase {
   func testSearchNotConnected() {
     var env: MessengerEnvironment = .unimplemented
     env.e2e.get = { nil }
-    let search: MessengerSearchUsers = .live(env)
+    let search: MessengerSearchContacts = .live(env)
 
     XCTAssertThrowsError(try search(query: .init())) { error in
-      XCTAssertNoDifference(error as? MessengerSearchUsers.Error, .notConnected)
+      XCTAssertNoDifference(error as? MessengerSearchContacts.Error, .notConnected)
     }
   }
 
@@ -78,10 +78,10 @@ final class MessengerSearchUsersTests: XCTestCase {
     var env: MessengerEnvironment = .unimplemented
     env.e2e.get = { .unimplemented }
     env.ud.get = { nil }
-    let search: MessengerSearchUsers = .live(env)
+    let search: MessengerSearchContacts = .live(env)
 
     XCTAssertThrowsError(try search(query: .init())) { error in
-      XCTAssertNoDifference(error as? MessengerSearchUsers.Error, .notLoggedIn)
+      XCTAssertNoDifference(error as? MessengerSearchContacts.Error, .notLoggedIn)
     }
   }
 
@@ -103,7 +103,7 @@ final class MessengerSearchUsersTests: XCTestCase {
     env.getSingleUseParams.run = { Data() }
     env.searchUD.run = { _, _, _, _, _ in throw error }
 
-    let search: MessengerSearchUsers = .live(env)
+    let search: MessengerSearchContacts = .live(env)
 
     XCTAssertThrowsError(try search(query: .init())) { err in
       XCTAssertNoDifference(err as? Failure, error)
@@ -131,7 +131,7 @@ final class MessengerSearchUsersTests: XCTestCase {
       return SingleUseSendReport(rounds: [], roundURL: "", ephId: 0, receptionId: Data())
     }
 
-    let search: MessengerSearchUsers = .live(env)
+    let search: MessengerSearchContacts = .live(env)
 
     XCTAssertThrowsError(try search(query: .init())) { err in
       XCTAssertNoDifference(err as? Failure, error)
@@ -139,7 +139,7 @@ final class MessengerSearchUsersTests: XCTestCase {
   }
 
   func testQueryIsEmpty() {
-    let emptyQueries: [MessengerSearchUsers.Query] = [
+    let emptyQueries: [MessengerSearchContacts.Query] = [
       .init(username: nil, email: nil, phone: nil),
       .init(username: "", email: nil, phone: nil),
       .init(username: nil, email: "", phone: nil),
@@ -151,7 +151,7 @@ final class MessengerSearchUsersTests: XCTestCase {
       XCTAssertTrue(query.isEmpty, "\(query) should be empty")
     }
 
-    let nonEmptyQueries: [MessengerSearchUsers.Query] = [
+    let nonEmptyQueries: [MessengerSearchContacts.Query] = [
       .init(username: "test", email: nil, phone: nil),
       .init(username: nil, email: "test", phone: nil),
       .init(username: nil, email: nil, phone: "test"),
@@ -165,17 +165,17 @@ final class MessengerSearchUsersTests: XCTestCase {
 
   func testQueryFacts() {
     XCTAssertNoDifference(
-      MessengerSearchUsers.Query(username: nil, email: nil, phone: nil).facts,
+      MessengerSearchContacts.Query(username: nil, email: nil, phone: nil).facts,
       []
     )
 
     XCTAssertNoDifference(
-      MessengerSearchUsers.Query(username: "", email: "", phone: "").facts,
+      MessengerSearchContacts.Query(username: "", email: "", phone: "").facts,
       []
     )
 
     XCTAssertNoDifference(
-      MessengerSearchUsers.Query(
+      MessengerSearchContacts.Query(
         username: "username",
         email: "email",
         phone: "phone"
@@ -188,7 +188,7 @@ final class MessengerSearchUsersTests: XCTestCase {
     )
 
     XCTAssertNoDifference(
-      MessengerSearchUsers.Query(
+      MessengerSearchContacts.Query(
         username: "username",
         email: "",
         phone: nil
-- 
GitLab


From 70badd4b7aff10d4de581b94f4aee05ea9e6bac9 Mon Sep 17 00:00:00 2001
From: Dariusz Rybicki <dariusz@elixxir.io>
Date: Fri, 16 Sep 2022 18:02:19 +0200
Subject: [PATCH 2/7] Add LookupUD.Params struct

---
 Sources/XXClient/Functions/LookupUD.swift     | 39 +++++++++++++------
 .../Functions/MessengerVerifyContact.swift    | 12 +++---
 .../MessengerVerifyContactTests.swift         | 13 ++-----
 3 files changed, 38 insertions(+), 26 deletions(-)

diff --git a/Sources/XXClient/Functions/LookupUD.swift b/Sources/XXClient/Functions/LookupUD.swift
index 0626470c..3a505bc7 100644
--- a/Sources/XXClient/Functions/LookupUD.swift
+++ b/Sources/XXClient/Functions/LookupUD.swift
@@ -2,30 +2,45 @@ import Bindings
 import XCTestDynamicOverlay
 
 public struct LookupUD {
-  public var run: (Int, Contact, Data, Data, UdLookupCallback) throws -> SingleUseSendReport
+  public struct Params: Equatable {
+    public init(
+      e2eId: Int,
+      udContact: Contact,
+      lookupId: Data,
+      singleRequestParamsJSON: Data = GetSingleUseParams.liveDefault()
+    ) {
+      self.e2eId = e2eId
+      self.udContact = udContact
+      self.lookupId = lookupId
+      self.singleRequestParamsJSON = singleRequestParamsJSON
+    }
+
+    public var e2eId: Int
+    public var udContact: Contact
+    public var lookupId: Data
+    public var singleRequestParamsJSON: Data
+  }
+
+  public var run: (Params, UdLookupCallback) throws -> SingleUseSendReport
 
   public func callAsFunction(
-    e2eId: Int,
-    udContact: Contact,
-    lookupId: Data,
-    singleRequestParamsJSON: Data = GetSingleUseParams.liveDefault(),
+    params: Params,
     callback: UdLookupCallback
   ) throws -> SingleUseSendReport {
-    try run(e2eId, udContact, lookupId, singleRequestParamsJSON, callback)
+    try run(params, callback)
   }
 }
 
 extension LookupUD {
-  public static let live = LookupUD {
-    e2eId, udContact, lookupId, singleRequestParamsJSON, callback in
+  public static let live = LookupUD { params, callback in
 
     var error: NSError?
     let reportData = BindingsLookupUD(
-      e2eId,
-      udContact.data,
+      params.e2eId,
+      params.udContact.data,
       callback.makeBindingsUdLookupCallback(),
-      lookupId,
-      singleRequestParamsJSON,
+      params.lookupId,
+      params.singleRequestParamsJSON,
       &error
     )
     if let error = error {
diff --git a/Sources/XXMessengerClient/Messenger/Functions/MessengerVerifyContact.swift b/Sources/XXMessengerClient/Messenger/Functions/MessengerVerifyContact.swift
index 7851dd1f..2a8d176b 100644
--- a/Sources/XXMessengerClient/Messenger/Functions/MessengerVerifyContact.swift
+++ b/Sources/XXMessengerClient/Messenger/Functions/MessengerVerifyContact.swift
@@ -30,11 +30,13 @@ extension MessengerVerifyContact {
         var lookupResult: Result<Contact, NSError>!
         let semaphore = DispatchSemaphore(value: 0)
         _ = try env.lookupUD(
-          e2eId: e2e.getId(),
-          udContact: try ud.getContact(),
-          lookupId: try contact.getId(),
-          singleRequestParamsJSON: env.getSingleUseParams(),
-          callback: .init { result in
+          params: LookupUD.Params(
+            e2eId: e2e.getId(),
+            udContact: try ud.getContact(),
+            lookupId: try contact.getId(),
+            singleRequestParamsJSON: env.getSingleUseParams()
+          ),
+          callback: UdLookupCallback { result in
             lookupResult = result
             semaphore.signal()
           }
diff --git a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerVerifyContactTests.swift b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerVerifyContactTests.swift
index 52fed6cb..2f4e8a84 100644
--- a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerVerifyContactTests.swift
+++ b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerVerifyContactTests.swift
@@ -39,7 +39,7 @@ final class MessengerVerifyContactTests: XCTestCase {
       var verified: Contact
       var e2eId: Int
     }
-    var didLookupUDWithParams: [LookupUDParams] = []
+    var didLookupUDWithParams: [LookupUD.Params] = []
     var didVerifyOwnershipWithParams: [VerifyOwnershipParams] = []
 
     var contact = Contact.unimplemented("contact-data".data(using: .utf8)!)
@@ -68,13 +68,8 @@ final class MessengerVerifyContactTests: XCTestCase {
       return ud
     }
     env.getSingleUseParams.run = { "single-use-params".data(using: .utf8)! }
-    env.lookupUD.run = { e2eId, udContact, lookupId, singleRequestParamsJSON, callback in
-      didLookupUDWithParams.append(.init(
-        e2eId: e2eId,
-        udContact: udContact,
-        lookupId: lookupId,
-        singleRequestParamsJSON: singleRequestParamsJSON
-      ))
+    env.lookupUD.run = { params, callback in
+      didLookupUDWithParams.append(params)
       callback.handle(.success(lookedUpContact))
       return SingleUseSendReport(rounds: [], roundURL: "", ephId: 0, receptionId: Data())
     }
@@ -117,7 +112,7 @@ final class MessengerVerifyContactTests: XCTestCase {
       return ud
     }
     env.getSingleUseParams.run = { "single-use-params".data(using: .utf8)! }
-    env.lookupUD.run = { _, _, _, _, callback in
+    env.lookupUD.run = { _, callback in
       callback.handle(.failure(lookupFailure))
       return SingleUseSendReport(rounds: [], roundURL: "", ephId: 0, receptionId: Data())
     }
-- 
GitLab


From 569c862eab1601dd674efc96c56525184ff83320 Mon Sep 17 00:00:00 2001
From: Dariusz Rybicki <dariusz@elixxir.io>
Date: Fri, 16 Sep 2022 18:09:11 +0200
Subject: [PATCH 3/7] Add SearchUD.Params struct

---
 Sources/XXClient/Functions/SearchUD.swift     | 40 +++++++++++++------
 .../Functions/MessengerSearchContacts.swift   | 12 +++---
 .../Functions/MessengerVerifyContact.swift    | 12 +++---
 .../MessengerSearchContactsTests.swift        | 22 +++-------
 .../MessengerVerifyContactTests.swift         | 31 ++++----------
 5 files changed, 53 insertions(+), 64 deletions(-)

diff --git a/Sources/XXClient/Functions/SearchUD.swift b/Sources/XXClient/Functions/SearchUD.swift
index 9f82808d..aa7c8b81 100644
--- a/Sources/XXClient/Functions/SearchUD.swift
+++ b/Sources/XXClient/Functions/SearchUD.swift
@@ -2,30 +2,44 @@ import Bindings
 import XCTestDynamicOverlay
 
 public struct SearchUD {
-  public var run: (Int, Contact, [Fact], Data, UdSearchCallback) throws -> SingleUseSendReport
+  public struct Params: Equatable {
+    public init(
+      e2eId: Int,
+      udContact: Contact,
+      facts: [Fact],
+      singleRequestParamsJSON: Data = GetSingleUseParams.liveDefault()
+    ) {
+      self.e2eId = e2eId
+      self.udContact = udContact
+      self.facts = facts
+      self.singleRequestParamsJSON = singleRequestParamsJSON
+    }
+
+    public var e2eId: Int
+    public var udContact: Contact
+    public var facts: [Fact]
+    public var singleRequestParamsJSON: Data
+  }
+
+  public var run: (Params, UdSearchCallback) throws -> SingleUseSendReport
 
   public func callAsFunction(
-    e2eId: Int,
-    udContact: Contact,
-    facts: [Fact],
-    singleRequestParamsJSON: Data = GetSingleUseParams.liveDefault(),
+    params: Params,
     callback: UdSearchCallback
   ) throws -> SingleUseSendReport {
-    try run(e2eId, udContact, facts, singleRequestParamsJSON, callback)
+    try run(params, callback)
   }
 }
 
 extension SearchUD {
-  public static let live = SearchUD {
-    e2eId, udContact, facts, singleRequestParamsJSON, callback in
-
+  public static let live = SearchUD { params, callback in
     var error: NSError?
     let reportData = BindingsSearchUD(
-      e2eId,
-      udContact.data,
+      params.e2eId,
+      params.udContact.data,
       callback.makeBindingsUdSearchCallback(),
-      try facts.encode(),
-      singleRequestParamsJSON,
+      try params.facts.encode(),
+      params.singleRequestParamsJSON,
       &error
     )
     if let error = error {
diff --git a/Sources/XXMessengerClient/Messenger/Functions/MessengerSearchContacts.swift b/Sources/XXMessengerClient/Messenger/Functions/MessengerSearchContacts.swift
index 94f55c27..46b2007c 100644
--- a/Sources/XXMessengerClient/Messenger/Functions/MessengerSearchContacts.swift
+++ b/Sources/XXMessengerClient/Messenger/Functions/MessengerSearchContacts.swift
@@ -43,11 +43,13 @@ extension MessengerSearchContacts {
       var result: Result<[Contact], Swift.Error>!
       let semaphore = DispatchSemaphore(value: 0)
       _ = try env.searchUD(
-        e2eId: e2e.getId(),
-        udContact: try ud.getContact(),
-        facts: query.facts,
-        singleRequestParamsJSON: env.getSingleUseParams(),
-        callback: .init { searchResult in
+        params: SearchUD.Params(
+          e2eId: e2e.getId(),
+          udContact: try ud.getContact(),
+          facts: query.facts,
+          singleRequestParamsJSON: env.getSingleUseParams()
+        ),
+        callback: UdSearchCallback { searchResult in
           switch searchResult {
           case .success(let contacts):
             result = .success(contacts)
diff --git a/Sources/XXMessengerClient/Messenger/Functions/MessengerVerifyContact.swift b/Sources/XXMessengerClient/Messenger/Functions/MessengerVerifyContact.swift
index 2a8d176b..afb13e7c 100644
--- a/Sources/XXMessengerClient/Messenger/Functions/MessengerVerifyContact.swift
+++ b/Sources/XXMessengerClient/Messenger/Functions/MessengerVerifyContact.swift
@@ -47,11 +47,13 @@ extension MessengerVerifyContact {
         var searchResult: Result<[Contact], NSError>!
         let semaphore = DispatchSemaphore(value: 0)
         _ = try env.searchUD(
-          e2eId: e2e.getId(),
-          udContact: try ud.getContact(),
-          facts: facts,
-          singleRequestParamsJSON: env.getSingleUseParams(),
-          callback: .init { result in
+          params: SearchUD.Params(
+            e2eId: e2e.getId(),
+            udContact: try ud.getContact(),
+            facts: facts,
+            singleRequestParamsJSON: env.getSingleUseParams()
+          ),
+          callback: UdSearchCallback { result in
             searchResult = result
             semaphore.signal()
           }
diff --git a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerSearchContactsTests.swift b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerSearchContactsTests.swift
index f3ab082c..2b44f19e 100644
--- a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerSearchContactsTests.swift
+++ b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerSearchContactsTests.swift
@@ -5,14 +5,7 @@ import XXClient
 
 final class MessengerSearchContactsTests: XCTestCase {
   func testSearch() throws {
-    struct SearchUdParams: Equatable {
-      var e2eId: Int
-      var udContact: Contact
-      var facts: [Fact]
-      var singleRequestParamsJSON: Data
-    }
-
-    var didSearchUdWithParams: [SearchUdParams] = []
+    var didSearchUdWithParams: [SearchUD.Params] = []
 
     var env: MessengerEnvironment = .unimplemented
     env.e2e.get = {
@@ -26,13 +19,8 @@ final class MessengerSearchContactsTests: XCTestCase {
       return ud
     }
     env.getSingleUseParams.run = { "single-use-params".data(using: .utf8)! }
-    env.searchUD.run = { e2eId, udContact, facts, singleRequestParamsJSON, callback in
-      didSearchUdWithParams.append(.init(
-        e2eId: e2eId,
-        udContact: udContact,
-        facts: facts,
-        singleRequestParamsJSON: singleRequestParamsJSON
-      ))
+    env.searchUD.run = { params, callback in
+      didSearchUdWithParams.append(params)
       callback.handle(.success([
         .unimplemented("contact-1".data(using: .utf8)!),
         .unimplemented("contact-2".data(using: .utf8)!),
@@ -101,7 +89,7 @@ final class MessengerSearchContactsTests: XCTestCase {
       return ud
     }
     env.getSingleUseParams.run = { Data() }
-    env.searchUD.run = { _, _, _, _, _ in throw error }
+    env.searchUD.run = { _, _ in throw error }
 
     let search: MessengerSearchContacts = .live(env)
 
@@ -126,7 +114,7 @@ final class MessengerSearchContactsTests: XCTestCase {
       return ud
     }
     env.getSingleUseParams.run = { Data() }
-    env.searchUD.run = { _, _, _, _, callback in
+    env.searchUD.run = { _, callback in
       callback.handle(.failure(error as NSError))
       return SingleUseSendReport(rounds: [], roundURL: "", ephId: 0, receptionId: Data())
     }
diff --git a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerVerifyContactTests.swift b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerVerifyContactTests.swift
index 2f4e8a84..92e4142a 100644
--- a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerVerifyContactTests.swift
+++ b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerVerifyContactTests.swift
@@ -28,12 +28,6 @@ final class MessengerVerifyContactTests: XCTestCase {
   }
 
   func testVerifyContactWithoutFacts() throws {
-    struct LookupUDParams: Equatable {
-      var e2eId: Int
-      var udContact: Contact
-      var lookupId: Data
-      var singleRequestParamsJSON: Data
-    }
     struct VerifyOwnershipParams: Equatable {
       var received: Contact
       var verified: Contact
@@ -124,18 +118,12 @@ final class MessengerVerifyContactTests: XCTestCase {
   }
 
   func testVerifyContactWithFacts() throws {
-    struct SearchUDParams: Equatable {
-      var e2eId: Int
-      var udContact: Contact
-      var facts: [Fact]
-      var singleRequestParamsJSON: Data
-    }
     struct VerifyOwnershipParams: Equatable {
       var received: Contact
       var verified: Contact
       var e2eId: Int
     }
-    var didSearchUDWithParams: [SearchUDParams] = []
+    var didSearchUDWithParams: [SearchUD.Params] = []
     var didVerifyOwnershipWithParams: [VerifyOwnershipParams] = []
 
     var contact = Contact.unimplemented("contact-data".data(using: .utf8)!)
@@ -169,13 +157,8 @@ final class MessengerVerifyContactTests: XCTestCase {
       return ud
     }
     env.getSingleUseParams.run = { "single-use-params".data(using: .utf8)! }
-    env.searchUD.run = { e2eId, udContact, facts, singleRequestParamsJSON, callback in
-      didSearchUDWithParams.append(.init(
-        e2eId: e2eId,
-        udContact: udContact,
-        facts: facts,
-        singleRequestParamsJSON: singleRequestParamsJSON
-      ))
+    env.searchUD.run = { params, callback in
+      didSearchUDWithParams.append(params)
       callback.handle(.success([foundContact]))
       return SingleUseSendReport(rounds: [], roundURL: "", ephId: 0, receptionId: Data())
     }
@@ -221,7 +204,7 @@ final class MessengerVerifyContactTests: XCTestCase {
       return ud
     }
     env.getSingleUseParams.run = { "single-use-params".data(using: .utf8)! }
-    env.searchUD.run = { e2eId, udContact, facts, singleRequestParamsJSON, callback in
+    env.searchUD.run = { _, callback in
       callback.handle(.success([]))
       return SingleUseSendReport(rounds: [], roundURL: "", ephId: 0, receptionId: Data())
     }
@@ -257,7 +240,7 @@ final class MessengerVerifyContactTests: XCTestCase {
       return ud
     }
     env.getSingleUseParams.run = { "single-use-params".data(using: .utf8)! }
-    env.searchUD.run = { _, _, _, _, callback in
+    env.searchUD.run = { _, callback in
       callback.handle(.failure(searchFailure))
       return SingleUseSendReport(rounds: [], roundURL: "", ephId: 0, receptionId: Data())
     }
@@ -291,7 +274,7 @@ final class MessengerVerifyContactTests: XCTestCase {
       return ud
     }
     env.getSingleUseParams.run = { "single-use-params".data(using: .utf8)! }
-    env.searchUD.run = { _, _, _, _, callback in
+    env.searchUD.run = { _, callback in
       callback.handle(.success([.unimplemented("found-contact-data".data(using: .utf8)!)]))
       return SingleUseSendReport(rounds: [], roundURL: "", ephId: 0, receptionId: Data())
     }
@@ -330,7 +313,7 @@ final class MessengerVerifyContactTests: XCTestCase {
       return ud
     }
     env.getSingleUseParams.run = { "single-use-params".data(using: .utf8)! }
-    env.searchUD.run = { _, _, _, _, callback in
+    env.searchUD.run = { _, callback in
       callback.handle(.success([.unimplemented("found-contact-data".data(using: .utf8)!)]))
       return SingleUseSendReport(rounds: [], roundURL: "", ephId: 0, receptionId: Data())
     }
-- 
GitLab


From bcf22fb36b24ec9bbe657af5d9c41833e737ec03 Mon Sep 17 00:00:00 2001
From: Dariusz Rybicki <dariusz@elixxir.io>
Date: Fri, 16 Sep 2022 18:21:14 +0200
Subject: [PATCH 4/7] Add MessengerLookupContact function

---
 .../Functions/MessengerLookupContact.swift    |  51 ++++++++
 .../Messenger/Messenger.swift                 |   3 +
 .../MessengerLookupContactTests.swift         | 117 ++++++++++++++++++
 3 files changed, 171 insertions(+)
 create mode 100644 Sources/XXMessengerClient/Messenger/Functions/MessengerLookupContact.swift
 create mode 100644 Tests/XXMessengerClientTests/Messenger/Functions/MessengerLookupContactTests.swift

diff --git a/Sources/XXMessengerClient/Messenger/Functions/MessengerLookupContact.swift b/Sources/XXMessengerClient/Messenger/Functions/MessengerLookupContact.swift
new file mode 100644
index 00000000..de77da41
--- /dev/null
+++ b/Sources/XXMessengerClient/Messenger/Functions/MessengerLookupContact.swift
@@ -0,0 +1,51 @@
+import Foundation
+import XCTestDynamicOverlay
+import XXClient
+
+public struct MessengerLookupContact {
+  public enum Error: Swift.Error, Equatable {
+    case notConnected
+    case notLoggedIn
+  }
+
+  public var run: (Data) throws -> Contact
+
+  public func callAsFunction(id: Data) throws -> Contact {
+    try run(id)
+  }
+}
+
+extension MessengerLookupContact {
+  public static func live(_ env: MessengerEnvironment) -> MessengerLookupContact {
+    MessengerLookupContact { id in
+      guard let e2e = env.e2e() else {
+        throw Error.notConnected
+      }
+      guard let ud = env.ud() else {
+        throw Error.notLoggedIn
+      }
+      var result: Result<Contact, NSError>!
+      let semaphore = DispatchSemaphore(value: 0)
+      _ = try env.lookupUD(
+        params: LookupUD.Params(
+          e2eId: e2e.getId(),
+          udContact: try ud.getContact(),
+          lookupId: id,
+          singleRequestParamsJSON: env.getSingleUseParams()
+        ),
+        callback: UdLookupCallback { lookupResult in
+          result = lookupResult
+          semaphore.signal()
+        }
+      )
+      semaphore.wait()
+      return try result.get()
+    }
+  }
+}
+
+extension MessengerLookupContact {
+  public static let unimplemented = MessengerLookupContact(
+    run: XCTUnimplemented("\(Self.self)")
+  )
+}
diff --git a/Sources/XXMessengerClient/Messenger/Messenger.swift b/Sources/XXMessengerClient/Messenger/Messenger.swift
index 6a3c417b..7186b611 100644
--- a/Sources/XXMessengerClient/Messenger/Messenger.swift
+++ b/Sources/XXMessengerClient/Messenger/Messenger.swift
@@ -22,6 +22,7 @@ public struct Messenger {
   public var waitForNodes: MessengerWaitForNodes
   public var destroy: MessengerDestroy
   public var searchContacts: MessengerSearchContacts
+  public var lookupContact: MessengerLookupContact
   public var registerForNotifications: MessengerRegisterForNotifications
   public var verifyContact: MessengerVerifyContact
   public var sendMessage: MessengerSendMessage
@@ -51,6 +52,7 @@ extension Messenger {
       waitForNodes: .live(env),
       destroy: .live(env),
       searchContacts: .live(env),
+      lookupContact: .live(env),
       registerForNotifications: .live(env),
       verifyContact: .live(env),
       sendMessage: .live(env)
@@ -81,6 +83,7 @@ extension Messenger {
     waitForNodes: .unimplemented,
     destroy: .unimplemented,
     searchContacts: .unimplemented,
+    lookupContact: .unimplemented,
     registerForNotifications: .unimplemented,
     verifyContact: .unimplemented,
     sendMessage: .unimplemented
diff --git a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerLookupContactTests.swift b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerLookupContactTests.swift
new file mode 100644
index 00000000..3069e8c0
--- /dev/null
+++ b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerLookupContactTests.swift
@@ -0,0 +1,117 @@
+import CustomDump
+import XCTest
+import XXClient
+@testable import XXMessengerClient
+
+final class MessengerLookupContactTests: XCTestCase {
+  func testLookup() throws {
+    let contactId = "contact-id".data(using: .utf8)!
+    let e2eId = 123
+    let udContact = Contact.unimplemented("ud-contact".data(using: .utf8)!)
+    let singleRequestParams = "single-request-params".data(using: .utf8)!
+    let contact = Contact.unimplemented("contact".data(using: .utf8)!)
+
+    var didLookupWithParams: [LookupUD.Params] = []
+
+    var env: MessengerEnvironment = .unimplemented
+    env.e2e.get = {
+      var e2e: E2E = .unimplemented
+      e2e.getId.run = { e2eId }
+      return e2e
+    }
+    env.ud.get = {
+      var ud: UserDiscovery = .unimplemented
+      ud.getContact.run = { udContact }
+      return ud
+    }
+    env.getSingleUseParams.run = { singleRequestParams }
+    env.lookupUD.run = { params, callback in
+      didLookupWithParams.append(params)
+      callback.handle(.success(contact))
+      return SingleUseSendReport(rounds: [], roundURL: "", ephId: 0, receptionId: Data())
+    }
+    let lookup: MessengerLookupContact = .live(env)
+
+    let result = try lookup(id: contactId)
+
+    XCTAssertNoDifference(didLookupWithParams, [.init(
+      e2eId: e2eId,
+      udContact: udContact,
+      lookupId: contactId,
+      singleRequestParamsJSON: singleRequestParams
+    )])
+    XCTAssertNoDifference(result, contact)
+  }
+
+  func testLookupWhenNotConnected() {
+    var env: MessengerEnvironment = .unimplemented
+    env.e2e.get = { nil }
+    let lookup: MessengerLookupContact = .live(env)
+
+    XCTAssertThrowsError(try lookup(id: Data())) { error in
+      XCTAssertEqual(error as? MessengerLookupContact.Error, .notConnected)
+    }
+  }
+
+  func testLookupWhenNotLoggedIn() {
+    var env: MessengerEnvironment = .unimplemented
+    env.e2e.get = { .unimplemented }
+    env.ud.get = { nil }
+    let lookup: MessengerLookupContact = .live(env)
+
+    XCTAssertThrowsError(try lookup(id: Data())) { error in
+      XCTAssertEqual(error as? MessengerLookupContact.Error, .notLoggedIn)
+    }
+  }
+
+  func testLookupFailure() {
+    struct Failure: Error, Equatable {}
+    let failure = Failure()
+
+    var env: MessengerEnvironment = .unimplemented
+    env.e2e.get = {
+      var e2e: E2E = .unimplemented
+      e2e.getId.run = { 0 }
+      return e2e
+    }
+    env.ud.get = {
+      var ud: UserDiscovery = .unimplemented
+      ud.getContact.run = { .unimplemented(Data()) }
+      return ud
+    }
+    env.getSingleUseParams.run = { Data() }
+    env.lookupUD.run = { _, _ in throw failure }
+    let lookup: MessengerLookupContact = .live(env)
+
+    XCTAssertThrowsError(try lookup(id: Data())) { error in
+      XCTAssertEqual(error as? Failure, failure)
+    }
+  }
+
+  func testLookupCallbackFailure() {
+    struct Failure: Error, Equatable {}
+    let failure = Failure()
+
+    var env: MessengerEnvironment = .unimplemented
+    env.e2e.get = {
+      var e2e: E2E = .unimplemented
+      e2e.getId.run = { 0 }
+      return e2e
+    }
+    env.ud.get = {
+      var ud: UserDiscovery = .unimplemented
+      ud.getContact.run = { .unimplemented(Data()) }
+      return ud
+    }
+    env.getSingleUseParams.run = { Data() }
+    env.lookupUD.run = { _, callback in
+      callback.handle(.failure(failure as NSError))
+      return SingleUseSendReport(rounds: [], roundURL: "", ephId: 0, receptionId: Data())
+    }
+    let lookup: MessengerLookupContact = .live(env)
+
+    XCTAssertThrowsError(try lookup(id: Data())) { error in
+      XCTAssertEqual(error as? Failure, failure)
+    }
+  }
+}
-- 
GitLab


From dab0c90aeb6f446d87dcee4214b414ff8faaf2ee Mon Sep 17 00:00:00 2001
From: Dariusz Rybicki <dariusz@elixxir.io>
Date: Fri, 16 Sep 2022 18:41:56 +0200
Subject: [PATCH 5/7] Refactor UdMultiLookupCallback.Result

---
 .../Callbacks/UdMultiLookupCallback.swift     | 49 +++++++++++++------
 1 file changed, 34 insertions(+), 15 deletions(-)

diff --git a/Sources/XXClient/Callbacks/UdMultiLookupCallback.swift b/Sources/XXClient/Callbacks/UdMultiLookupCallback.swift
index 9a6d9df6..1782c01e 100644
--- a/Sources/XXClient/Callbacks/UdMultiLookupCallback.swift
+++ b/Sources/XXClient/Callbacks/UdMultiLookupCallback.swift
@@ -2,9 +2,20 @@ import Bindings
 import XCTestDynamicOverlay
 
 public struct UdMultiLookupCallback {
-  public enum Result: Equatable {
-    case success([Contact])
-    case failure(error: NSError, failedIDs: [Data])
+  public struct Result: Equatable {
+    public init(
+      contacts: [Contact],
+      failedIds: [Data],
+      errors: [NSError]
+    ) {
+      self.contacts = contacts
+      self.failedIds = failedIds
+      self.errors = errors
+    }
+
+    public var contacts: [Contact]
+    public var failedIds: [Data]
+    public var errors: [NSError]
   }
 
   public init(handle: @escaping (Result) -> Void) {
@@ -30,23 +41,31 @@ extension UdMultiLookupCallback {
       let callback: UdMultiLookupCallback
 
       func callback(_ contactListJSON: Data?, failedIDs: Data?, err: Error?) {
+        var result = UdMultiLookupCallback.Result(
+          contacts: [],
+          failedIds: [],
+          errors: []
+        )
         if let err = err {
-          callback.handle(.failure(
-            error: err as NSError,
-            failedIDs: failedIDs
-              .map { (try? JSONDecoder().decode([Data].self, from: $0)) ?? [] } ?? []
-          ))
-        } else if let contactListJSON = contactListJSON {
+          result.errors.append(err as NSError)
+        }
+        if let contactListJSON = contactListJSON {
+          do {
+            result.contacts = try JSONDecoder()
+              .decode([Data].self, from: contactListJSON)
+              .map { Contact.live($0) }
+          } catch {
+            result.errors.append(error as NSError)
+          }
+        }
+        if let failedIDs = failedIDs {
           do {
-            let contactsData = try JSONDecoder().decode([Data].self, from: contactListJSON)
-            let contacts: [Contact] = contactsData.map { Contact.live($0) }
-            callback.handle(.success(contacts))
+            result.failedIds = try JSONDecoder().decode([Data].self, from: failedIDs)
           } catch {
-            callback.handle(.failure(error: error as NSError, failedIDs: []))
+            result.errors.append(error as NSError)
           }
-        } else {
-          fatalError("BindingsUdMultiLookupCallbackProtocol received `nil` contactListJSON and `nil` error")
         }
+        callback.handle(result)
       }
     }
 
-- 
GitLab


From f71d2e2b543200adf843f18039036a5bafd3cab2 Mon Sep 17 00:00:00 2001
From: Dariusz Rybicki <dariusz@elixxir.io>
Date: Fri, 16 Sep 2022 18:50:47 +0200
Subject: [PATCH 6/7] Add MessengerLookupContacts function

---
 .../Functions/MessengerLookupContacts.swift   | 51 ++++++++++
 .../Messenger/MessengerEnvironment.swift      |  3 +
 .../MessengerLookupContactsTests.swift        | 93 +++++++++++++++++++
 3 files changed, 147 insertions(+)
 create mode 100644 Sources/XXMessengerClient/Messenger/Functions/MessengerLookupContacts.swift
 create mode 100644 Tests/XXMessengerClientTests/Messenger/Functions/MessengerLookupContactsTests.swift

diff --git a/Sources/XXMessengerClient/Messenger/Functions/MessengerLookupContacts.swift b/Sources/XXMessengerClient/Messenger/Functions/MessengerLookupContacts.swift
new file mode 100644
index 00000000..77a667db
--- /dev/null
+++ b/Sources/XXMessengerClient/Messenger/Functions/MessengerLookupContacts.swift
@@ -0,0 +1,51 @@
+import Foundation
+import XCTestDynamicOverlay
+import XXClient
+
+public struct MessengerLookupContacts {
+  public enum Error: Swift.Error, Equatable {
+    case notConnected
+    case notLoggedIn
+  }
+
+  public var run: ([Data]) throws -> UdMultiLookupCallback.Result
+
+  public func callAsFunction(ids: [Data]) throws -> UdMultiLookupCallback.Result {
+    try run(ids)
+  }
+}
+
+extension MessengerLookupContacts {
+  public static func live(_ env: MessengerEnvironment) -> MessengerLookupContacts {
+    MessengerLookupContacts { ids in
+      guard let e2e = env.e2e() else {
+        throw Error.notConnected
+      }
+      guard let ud = env.ud() else {
+        throw Error.notLoggedIn
+      }
+      var callbackResult: UdMultiLookupCallback.Result!
+      let semaphore = DispatchSemaphore(value: 0)
+      _ = try env.multiLookupUD(
+        params: MultiLookupUD.Params(
+          e2eId: e2e.getId(),
+          udContact: try ud.getContact(),
+          lookupIds: ids,
+          singleRequestParams: env.getSingleUseParams()
+        ),
+        callback: UdMultiLookupCallback { result in
+          callbackResult = result
+          semaphore.signal()
+        }
+      )
+      semaphore.wait()
+      return callbackResult
+    }
+  }
+}
+
+extension MessengerLookupContacts {
+  public static let unimplemented = MessengerLookupContacts(
+    run: XCTUnimplemented("\(Self.self)")
+  )
+}
diff --git a/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift b/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift
index b4ff607e..f125c1ef 100644
--- a/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift
+++ b/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift
@@ -17,6 +17,7 @@ public struct MessengerEnvironment {
   public var login: Login
   public var lookupUD: LookupUD
   public var messageListeners: ListenersRegistry
+  public var multiLookupUD: MultiLookupUD
   public var ndfEnvironment: NDFEnvironment
   public var newCMix: NewCMix
   public var newOrLoadUd: NewOrLoadUd
@@ -54,6 +55,7 @@ extension MessengerEnvironment {
       login: .live,
       lookupUD: .live,
       messageListeners: .live(),
+      multiLookupUD: .live(),
       ndfEnvironment: .mainnet,
       newCMix: .live,
       newOrLoadUd: .live,
@@ -86,6 +88,7 @@ extension MessengerEnvironment {
     login: .unimplemented,
     lookupUD: .unimplemented,
     messageListeners: .unimplemented,
+    multiLookupUD: .unimplemented,
     ndfEnvironment: .unimplemented,
     newCMix: .unimplemented,
     newOrLoadUd: .unimplemented,
diff --git a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerLookupContactsTests.swift b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerLookupContactsTests.swift
new file mode 100644
index 00000000..9f903110
--- /dev/null
+++ b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerLookupContactsTests.swift
@@ -0,0 +1,93 @@
+import CustomDump
+import XCTest
+import XXClient
+@testable import XXMessengerClient
+
+final class MessengerLookupContactsTests: XCTestCase {
+  func testLookup() throws {
+    let contactIds = ["contact-id".data(using: .utf8)!]
+    let e2eId = 123
+    let udContact = Contact.unimplemented("ud-contact".data(using: .utf8)!)
+    let singleRequestParams = "single-request-params".data(using: .utf8)!
+    let contacts = [Contact.unimplemented("contact".data(using: .utf8)!)]
+
+    var didMultiLookupWithParams: [MultiLookupUD.Params] = []
+
+    var env: MessengerEnvironment = .unimplemented
+    env.e2e.get = {
+      var e2e: E2E = .unimplemented
+      e2e.getId.run = { e2eId }
+      return e2e
+    }
+    env.ud.get = {
+      var ud: UserDiscovery = .unimplemented
+      ud.getContact.run = { udContact }
+      return ud
+    }
+    env.getSingleUseParams.run = { singleRequestParams }
+    env.multiLookupUD.run = { params, callback in
+      didMultiLookupWithParams.append(params)
+      callback.handle(.init(
+        contacts: contacts,
+        failedIds: [],
+        errors: []
+      ))
+    }
+    let lookup: MessengerLookupContacts = .live(env)
+
+    let result = try lookup(ids: contactIds)
+
+    XCTAssertNoDifference(didMultiLookupWithParams, [.init(
+      e2eId: e2eId,
+      udContact: udContact,
+      lookupIds: contactIds,
+      singleRequestParams: singleRequestParams
+    )])
+    XCTAssertNoDifference(result, .init(contacts: contacts, failedIds: [], errors: []))
+  }
+
+  func testLookupWhenNotConnected() {
+    var env: MessengerEnvironment = .unimplemented
+    env.e2e.get = { nil }
+    let lookup: MessengerLookupContacts = .live(env)
+
+    XCTAssertThrowsError(try lookup(ids: [])) { error in
+      XCTAssertEqual(error as? MessengerLookupContacts.Error, .notConnected)
+    }
+  }
+
+  func testLookupWhenNotLoggedIn() {
+    var env: MessengerEnvironment = .unimplemented
+    env.e2e.get = { .unimplemented }
+    env.ud.get = { nil }
+    let lookup: MessengerLookupContacts = .live(env)
+
+    XCTAssertThrowsError(try lookup(ids: [])) { error in
+      XCTAssertEqual(error as? MessengerLookupContacts.Error, .notLoggedIn)
+    }
+  }
+
+  func testLookupFailure() {
+    struct Failure: Error, Equatable {}
+    let failure = Failure()
+
+    var env: MessengerEnvironment = .unimplemented
+    env.e2e.get = {
+      var e2e: E2E = .unimplemented
+      e2e.getId.run = { 0 }
+      return e2e
+    }
+    env.ud.get = {
+      var ud: UserDiscovery = .unimplemented
+      ud.getContact.run = { .unimplemented(Data()) }
+      return ud
+    }
+    env.getSingleUseParams.run = { Data() }
+    env.multiLookupUD.run = { _, _ in throw failure }
+    let lookup: MessengerLookupContacts = .live(env)
+
+    XCTAssertThrowsError(try lookup(ids: [])) { error in
+      XCTAssertEqual(error as? Failure, failure)
+    }
+  }
+}
-- 
GitLab


From aac2bf948e549dbfb30abc992f76755b1265368a Mon Sep 17 00:00:00 2001
From: Dariusz Rybicki <dariusz@elixxir.io>
Date: Fri, 16 Sep 2022 19:03:44 +0200
Subject: [PATCH 7/7] Fix messenger example app

---
 .../Sources/UserSearchFeature/UserSearchFeature.swift       | 6 +++---
 .../Sources/UserSearchFeature/UserSearchView.swift          | 2 +-
 .../UserSearchFeatureTests/UserSearchFeatureTests.swift     | 6 +++---
 3 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/Examples/xx-messenger/Sources/UserSearchFeature/UserSearchFeature.swift b/Examples/xx-messenger/Sources/UserSearchFeature/UserSearchFeature.swift
index 2e892bb4..f39353a7 100644
--- a/Examples/xx-messenger/Sources/UserSearchFeature/UserSearchFeature.swift
+++ b/Examples/xx-messenger/Sources/UserSearchFeature/UserSearchFeature.swift
@@ -41,7 +41,7 @@ public struct UserSearchState: Equatable {
 
   public init(
     focusedField: Field? = nil,
-    query: MessengerSearchUsers.Query = .init(),
+    query: MessengerSearchContacts.Query = .init(),
     isSearching: Bool = false,
     failure: String? = nil,
     results: IdentifiedArrayOf<Result> = [],
@@ -56,7 +56,7 @@ public struct UserSearchState: Equatable {
   }
 
   @BindableState public var focusedField: Field?
-  @BindableState public var query: MessengerSearchUsers.Query
+  @BindableState public var query: MessengerSearchContacts.Query
   public var isSearching: Bool
   public var failure: String?
   public var results: IdentifiedArrayOf<Result>
@@ -113,7 +113,7 @@ public let userSearchReducer = Reducer<UserSearchState, UserSearchAction, UserSe
     state.failure = nil
     return .result { [query = state.query] in
       do {
-        return .success(.didSucceed(try env.messenger.searchUsers(query: query)))
+        return .success(.didSucceed(try env.messenger.searchContacts(query: query)))
       } catch {
         return .success(.didFail(error.localizedDescription))
       }
diff --git a/Examples/xx-messenger/Sources/UserSearchFeature/UserSearchView.swift b/Examples/xx-messenger/Sources/UserSearchFeature/UserSearchView.swift
index b3a1f0a4..328ff98c 100644
--- a/Examples/xx-messenger/Sources/UserSearchFeature/UserSearchView.swift
+++ b/Examples/xx-messenger/Sources/UserSearchFeature/UserSearchView.swift
@@ -14,7 +14,7 @@ public struct UserSearchView: View {
 
   struct ViewState: Equatable {
     var focusedField: UserSearchState.Field?
-    var query: MessengerSearchUsers.Query
+    var query: MessengerSearchContacts.Query
     var isSearching: Bool
     var failure: String?
     var results: IdentifiedArrayOf<UserSearchState.Result>
diff --git a/Examples/xx-messenger/Tests/UserSearchFeatureTests/UserSearchFeatureTests.swift b/Examples/xx-messenger/Tests/UserSearchFeatureTests/UserSearchFeatureTests.swift
index f8f482f6..44731c1f 100644
--- a/Examples/xx-messenger/Tests/UserSearchFeatureTests/UserSearchFeatureTests.swift
+++ b/Examples/xx-messenger/Tests/UserSearchFeatureTests/UserSearchFeatureTests.swift
@@ -13,7 +13,7 @@ final class UserSearchFeatureTests: XCTestCase {
       environment: .unimplemented
     )
 
-    var didSearchWithQuery: [MessengerSearchUsers.Query] = []
+    var didSearchWithQuery: [MessengerSearchContacts.Query] = []
 
     struct GetIdFromContactError: Error {}
     struct GetFactsFromContactError: Error {}
@@ -44,7 +44,7 @@ final class UserSearchFeatureTests: XCTestCase {
 
     store.environment.bgQueue = .immediate
     store.environment.mainQueue = .immediate
-    store.environment.messenger.searchUsers.run = { query in
+    store.environment.messenger.searchContacts.run = { query in
       didSearchWithQuery.append(query)
       return contacts
     }
@@ -100,7 +100,7 @@ final class UserSearchFeatureTests: XCTestCase {
 
     store.environment.bgQueue = .immediate
     store.environment.mainQueue = .immediate
-    store.environment.messenger.searchUsers.run = { _ in throw failure }
+    store.environment.messenger.searchContacts.run = { _ in throw failure }
 
     store.send(.searchTapped) {
       $0.focusedField = nil
-- 
GitLab