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 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
}
}
}
}
......
......@@ -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)
)
......
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
)
])
}
}
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