Skip to content
Snippets Groups Projects
Commit 79061154 authored by Dariusz Rybicki's avatar Dariusz Rybicki
Browse files

Implement verification in AuthCallbackHandlerRequest

parent d0006cd9
No related branches found
No related tags found
2 merge requests!102Release 1.0.0,!76Messenger example - auth requests handling
import Foundation import Foundation
import XCTestDynamicOverlay import XCTestDynamicOverlay
import XXClient import XXClient
import XXMessengerClient
import XXModels import XXModels
public struct AuthCallbackHandlerRequest { public struct AuthCallbackHandlerRequest {
...@@ -14,6 +15,7 @@ public struct AuthCallbackHandlerRequest { ...@@ -14,6 +15,7 @@ public struct AuthCallbackHandlerRequest {
extension AuthCallbackHandlerRequest { extension AuthCallbackHandlerRequest {
public static func live( public static func live(
db: DBManagerGetDB, db: DBManagerGetDB,
messenger: Messenger,
now: @escaping () -> Date now: @escaping () -> Date
) -> AuthCallbackHandlerRequest { ) -> AuthCallbackHandlerRequest {
AuthCallbackHandlerRequest { xxContact in AuthCallbackHandlerRequest { xxContact in
...@@ -29,6 +31,16 @@ extension AuthCallbackHandlerRequest { ...@@ -29,6 +31,16 @@ extension AuthCallbackHandlerRequest {
dbContact.authStatus = .verificationInProgress dbContact.authStatus = .verificationInProgress
dbContact.createdAt = now() dbContact.createdAt = now()
dbContact = try db().saveContact(dbContact) 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
}
} }
} }
} }
......
...@@ -18,7 +18,11 @@ extension AppEnvironment { ...@@ -18,7 +18,11 @@ extension AppEnvironment {
let messenger = Messenger.live(messengerEnv) let messenger = Messenger.live(messengerEnv)
let authHandler = AuthCallbackHandler.live( let authHandler = AuthCallbackHandler.live(
messenger: messenger, 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), handleConfirm: .live(db: dbManager.getDB),
handleReset: .live(db: dbManager.getDB) handleReset: .live(db: dbManager.getDB)
) )
......
import CustomDump import CustomDump
import XCTest import XCTest
import XXModels
import XXClient
import XCTestDynamicOverlay import XCTestDynamicOverlay
import XXClient
import XXMessengerClient
import XXModels
@testable import AppCore @testable import AppCore
final class AuthCallbackHandlerRequestTests: XCTestCase { final class AuthCallbackHandlerRequestTests: XCTestCase {
func testRequestFromNewContact() throws { func testRequestFromNewContact() throws {
let now = Date() let now = Date()
var didFetchContacts: [XXModels.Contact.Query] = [] var didFetchContacts: [XXModels.Contact.Query] = []
var didVerifyContact: [XXClient.Contact] = []
var didSaveContact: [XXModels.Contact] = [] var didSaveContact: [XXModels.Contact] = []
var messenger: Messenger = .unimplemented
messenger.verifyContact.run = { contact in
didVerifyContact.append(contact)
return true
}
let request = AuthCallbackHandlerRequest.live( let request = AuthCallbackHandlerRequest.live(
db: .init { db: .init {
var db: Database = .failing var db: Database = .failing
...@@ -24,6 +32,7 @@ final class AuthCallbackHandlerRequestTests: XCTestCase { ...@@ -24,6 +32,7 @@ final class AuthCallbackHandlerRequestTests: XCTestCase {
} }
return db return db
}, },
messenger: messenger,
now: { now } now: { now }
) )
var xxContact = XXClient.Contact.unimplemented("contact".data(using: .utf8)!) var xxContact = XXClient.Contact.unimplemented("contact".data(using: .utf8)!)
...@@ -39,15 +48,26 @@ final class AuthCallbackHandlerRequestTests: XCTestCase { ...@@ -39,15 +48,26 @@ final class AuthCallbackHandlerRequestTests: XCTestCase {
try request(xxContact) try request(xxContact)
XCTAssertNoDifference(didFetchContacts, [.init(id: ["id".data(using: .utf8)!])]) XCTAssertNoDifference(didFetchContacts, [.init(id: ["id".data(using: .utf8)!])])
XCTAssertNoDifference(didSaveContact, [.init( XCTAssertNoDifference(didSaveContact, [
id: "id".data(using: .utf8)!, .init(
marshaled: "contact".data(using: .utf8)!, id: "id".data(using: .utf8)!,
username: "username", marshaled: "contact".data(using: .utf8)!,
email: "email", username: "username",
phone: "phone", email: "email",
authStatus: .verificationInProgress, phone: "phone",
createdAt: now 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 { func testRequestWhenContactInDatabase() throws {
...@@ -57,6 +77,7 @@ final class AuthCallbackHandlerRequestTests: XCTestCase { ...@@ -57,6 +77,7 @@ final class AuthCallbackHandlerRequestTests: XCTestCase {
db.fetchContacts.run = { _ in [.init(id: "id".data(using: .utf8)!)] } db.fetchContacts.run = { _ in [.init(id: "id".data(using: .utf8)!)] }
return db return db
}, },
messenger: .unimplemented,
now: XCTUnimplemented("now", placeholder: Date()) now: XCTUnimplemented("now", placeholder: Date())
) )
var contact = XXClient.Contact.unimplemented("contact".data(using: .utf8)!) var contact = XXClient.Contact.unimplemented("contact".data(using: .utf8)!)
...@@ -64,4 +85,92 @@ final class AuthCallbackHandlerRequestTests: XCTestCase { ...@@ -64,4 +85,92 @@ final class AuthCallbackHandlerRequestTests: XCTestCase {
try request(contact) 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
)
])
}
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment