diff --git a/Examples/xx-messenger/Sources/AppCore/AuthCallbackHandler/AuthCallbackHandlerRequest.swift b/Examples/xx-messenger/Sources/AppCore/AuthCallbackHandler/AuthCallbackHandlerRequest.swift index 1ec239230874c79e3d670bf377c57ab45400895b..e8f14806ba8d088dc976365741387b502e7bbb42 100644 --- a/Examples/xx-messenger/Sources/AppCore/AuthCallbackHandler/AuthCallbackHandlerRequest.swift +++ b/Examples/xx-messenger/Sources/AppCore/AuthCallbackHandler/AuthCallbackHandlerRequest.swift @@ -1,6 +1,7 @@ import Foundation import XCTestDynamicOverlay import XXClient +import XXMessengerClient import XXModels public struct AuthCallbackHandlerRequest { @@ -14,6 +15,7 @@ public struct AuthCallbackHandlerRequest { extension AuthCallbackHandlerRequest { public static func live( db: DBManagerGetDB, + messenger: Messenger, now: @escaping () -> Date ) -> AuthCallbackHandlerRequest { AuthCallbackHandlerRequest { xxContact in @@ -29,6 +31,16 @@ extension AuthCallbackHandlerRequest { dbContact.authStatus = .verificationInProgress dbContact.createdAt = now() dbContact = try db().saveContact(dbContact) + + do { + let verified = try messenger.verifyContact(xxContact) + dbContact.authStatus = verified ? .verified : .verificationFailed + dbContact = try db().saveContact(dbContact) + } catch { + dbContact.authStatus = .verificationFailed + dbContact = try db().saveContact(dbContact) + throw error + } } } } diff --git a/Examples/xx-messenger/Sources/AppFeature/AppEnvironment+Live.swift b/Examples/xx-messenger/Sources/AppFeature/AppEnvironment+Live.swift index c45c93ef4fb5b3f3f7052d1b99aa15c1b038709b..5267fcc3f1a42445702386278b8fbeeb600785ae 100644 --- a/Examples/xx-messenger/Sources/AppFeature/AppEnvironment+Live.swift +++ b/Examples/xx-messenger/Sources/AppFeature/AppEnvironment+Live.swift @@ -18,7 +18,11 @@ extension AppEnvironment { let messenger = Messenger.live(messengerEnv) let authHandler = AuthCallbackHandler.live( messenger: messenger, - handleRequest: .live(db: dbManager.getDB, now: Date.init), + handleRequest: .live( + db: dbManager.getDB, + messenger: messenger, + now: Date.init + ), handleConfirm: .live(db: dbManager.getDB), handleReset: .live(db: dbManager.getDB) ) diff --git a/Examples/xx-messenger/Tests/AppCoreTests/AuthCallbackHandler/AuthCallbackHandlerRequestTests.swift b/Examples/xx-messenger/Tests/AppCoreTests/AuthCallbackHandler/AuthCallbackHandlerRequestTests.swift index fb92a5b8871258b61c88f5bfd43bdb53d64208ba..07359d1f99234d8faabf1b0b9dff29c6af963b70 100644 --- a/Examples/xx-messenger/Tests/AppCoreTests/AuthCallbackHandler/AuthCallbackHandlerRequestTests.swift +++ b/Examples/xx-messenger/Tests/AppCoreTests/AuthCallbackHandler/AuthCallbackHandlerRequestTests.swift @@ -1,16 +1,24 @@ import CustomDump import XCTest -import XXModels -import XXClient import XCTestDynamicOverlay +import XXClient +import XXMessengerClient +import XXModels @testable import AppCore final class AuthCallbackHandlerRequestTests: XCTestCase { func testRequestFromNewContact() throws { let now = Date() var didFetchContacts: [XXModels.Contact.Query] = [] + var didVerifyContact: [XXClient.Contact] = [] var didSaveContact: [XXModels.Contact] = [] + var messenger: Messenger = .unimplemented + messenger.verifyContact.run = { contact in + didVerifyContact.append(contact) + return true + } + let request = AuthCallbackHandlerRequest.live( db: .init { var db: Database = .failing @@ -24,6 +32,7 @@ final class AuthCallbackHandlerRequestTests: XCTestCase { } return db }, + messenger: messenger, now: { now } ) var xxContact = XXClient.Contact.unimplemented("contact".data(using: .utf8)!) @@ -39,15 +48,26 @@ final class AuthCallbackHandlerRequestTests: XCTestCase { try request(xxContact) XCTAssertNoDifference(didFetchContacts, [.init(id: ["id".data(using: .utf8)!])]) - XCTAssertNoDifference(didSaveContact, [.init( - id: "id".data(using: .utf8)!, - marshaled: "contact".data(using: .utf8)!, - username: "username", - email: "email", - phone: "phone", - authStatus: .verificationInProgress, - createdAt: now - )]) + XCTAssertNoDifference(didSaveContact, [ + .init( + id: "id".data(using: .utf8)!, + marshaled: "contact".data(using: .utf8)!, + username: "username", + email: "email", + phone: "phone", + authStatus: .verificationInProgress, + createdAt: now + ), + .init( + id: "id".data(using: .utf8)!, + marshaled: "contact".data(using: .utf8)!, + username: "username", + email: "email", + phone: "phone", + authStatus: .verified, + createdAt: now + ) + ]) } func testRequestWhenContactInDatabase() throws { @@ -57,6 +77,7 @@ final class AuthCallbackHandlerRequestTests: XCTestCase { db.fetchContacts.run = { _ in [.init(id: "id".data(using: .utf8)!)] } return db }, + messenger: .unimplemented, now: XCTUnimplemented("now", placeholder: Date()) ) var contact = XXClient.Contact.unimplemented("contact".data(using: .utf8)!) @@ -64,4 +85,92 @@ final class AuthCallbackHandlerRequestTests: XCTestCase { try request(contact) } + + func testRequestFromNewContactVerificationFalse() throws { + let now = Date() + var didSaveContact: [XXModels.Contact] = [] + + var messenger: Messenger = .unimplemented + messenger.verifyContact.run = { _ in false } + + let request = AuthCallbackHandlerRequest.live( + db: .init { + var db: Database = .failing + db.fetchContacts.run = { query in return [] } + db.saveContact.run = { contact in + didSaveContact.append(contact) + return contact + } + return db + }, + messenger: messenger, + now: { now } + ) + var xxContact = XXClient.Contact.unimplemented("contact".data(using: .utf8)!) + xxContact.getIdFromContact.run = { _ in "id".data(using: .utf8)! } + xxContact.getFactsFromContact.run = { _ in [] } + + try request(xxContact) + + XCTAssertNoDifference(didSaveContact, [ + .init( + id: "id".data(using: .utf8)!, + marshaled: "contact".data(using: .utf8)!, + authStatus: .verificationInProgress, + createdAt: now + ), + .init( + id: "id".data(using: .utf8)!, + marshaled: "contact".data(using: .utf8)!, + authStatus: .verificationFailed, + createdAt: now + ) + ]) + } + + func testRequestFromNewContactVerificationFailure() throws { + struct Failure: Error, Equatable {} + let failure = Failure() + let now = Date() + var didSaveContact: [XXModels.Contact] = [] + + var messenger: Messenger = .unimplemented + messenger.verifyContact.run = { _ in throw failure } + + let request = AuthCallbackHandlerRequest.live( + db: .init { + var db: Database = .failing + db.fetchContacts.run = { query in return [] } + db.saveContact.run = { contact in + didSaveContact.append(contact) + return contact + } + return db + }, + messenger: messenger, + now: { now } + ) + var xxContact = XXClient.Contact.unimplemented("contact".data(using: .utf8)!) + xxContact.getIdFromContact.run = { _ in "id".data(using: .utf8)! } + xxContact.getFactsFromContact.run = { _ in [] } + + XCTAssertThrowsError(try request(xxContact)) { error in + XCTAssertNoDifference(error as? Failure, failure) + } + + XCTAssertNoDifference(didSaveContact, [ + .init( + id: "id".data(using: .utf8)!, + marshaled: "contact".data(using: .utf8)!, + authStatus: .verificationInProgress, + createdAt: now + ), + .init( + id: "id".data(using: .utf8)!, + marshaled: "contact".data(using: .utf8)!, + authStatus: .verificationFailed, + createdAt: now + ) + ]) + } }