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

Use MessengerMyContact in RegisterFeature

parent b783ad91
Branches
Tags
2 merge requests!112Restore contacts from backup,!102Release 1.0.0
......@@ -7,6 +7,10 @@ import XXMessengerClient
import XXModels
public struct RegisterState: Equatable {
public enum Error: Swift.Error, Equatable {
case usernameMismatch(registering: String, registered: String?)
}
public enum Field: String, Hashable {
case username
}
......@@ -82,14 +86,22 @@ public let registerReducer = Reducer<RegisterState, RegisterAction, RegisterEnvi
do {
let db = try env.db()
try env.messenger.register(username: username)
var contact = try env.messenger.e2e.tryGet().getContact()
try contact.setFact(.username, username)
let contact = try env.messenger.myContact()
let facts = try contact.getFacts()
try db.saveContact(Contact(
id: try contact.getId(),
marshaled: contact.data,
username: username,
username: facts.get(.username)?.value,
email: facts.get(.email)?.value,
phone: facts.get(.phone)?.value,
createdAt: env.now()
))
guard facts.get(.username)?.value == username else {
throw RegisterState.Error.usernameMismatch(
registering: username,
registered: facts.get(.username)?.value
)
}
fulfill(.success(.finished))
}
catch {
......@@ -106,6 +118,7 @@ public let registerReducer = Reducer<RegisterState, RegisterAction, RegisterEnvi
return .none
case .finished:
state.isRegistering = false
return .none
}
}
......
......@@ -8,39 +8,41 @@ import XXModels
final class RegisterFeatureTests: XCTestCase {
func testRegister() throws {
let now = Date()
let username = "registering-username"
let myContactId = "my-contact-id".data(using: .utf8)!
let myContactData = "my-contact-data".data(using: .utf8)!
let myContactUsername = username
let myContactEmail = "my-contact-email"
let myContactPhone = "my-contact-phone"
let myContactFacts = [
Fact(type: .username, value: myContactUsername),
Fact(type: .email, value: myContactEmail),
Fact(type: .phone, value: myContactPhone),
]
var messengerDidRegisterUsername: [String] = []
var didGetMyContact: [MessengerMyContact.IncludeFacts?] = []
var dbDidSaveContact: [XXModels.Contact] = []
let store = TestStore(
initialState: RegisterState(),
reducer: registerReducer,
environment: .unimplemented
)
let now = Date()
let mainQueue = DispatchQueue.test
let bgQueue = DispatchQueue.test
var didSetFactsOnContact: [[XXClient.Fact]] = []
var dbDidSaveContact: [XXModels.Contact] = []
var messengerDidRegisterUsername: [String] = []
store.environment.now = { now }
store.environment.mainQueue = mainQueue.eraseToAnyScheduler()
store.environment.bgQueue = bgQueue.eraseToAnyScheduler()
store.environment.mainQueue = .immediate
store.environment.bgQueue = .immediate
store.environment.messenger.register.run = { username in
messengerDidRegisterUsername.append(username)
}
store.environment.messenger.e2e.get = {
var e2e: E2E = .unimplemented
e2e.getContact.run = {
var contact = XXClient.Contact.unimplemented("contact-data".data(using: .utf8)!)
contact.getIdFromContact.run = { _ in "contact-id".data(using: .utf8)! }
contact.getFactsFromContact.run = { _ in [] }
contact.setFactsOnContact.run = { data, facts in
didSetFactsOnContact.append(facts)
return data
}
store.environment.messenger.myContact.run = { includeFacts in
didGetMyContact.append(includeFacts)
var contact = XXClient.Contact.unimplemented(myContactData)
contact.getIdFromContact.run = { _ in myContactId }
contact.getFactsFromContact.run = { _ in myContactFacts }
return contact
}
return e2e
}
store.environment.db.run = {
var db: Database = .unimplemented
db.saveContact.run = { contact in
......@@ -50,33 +52,34 @@ final class RegisterFeatureTests: XCTestCase {
return db
}
store.send(.set(\.$username, "NewUser")) {
$0.username = "NewUser"
store.send(.set(\.$focusedField, .username)) {
$0.focusedField = .username
}
store.send(.set(\.$username, myContactUsername)) {
$0.username = myContactUsername
}
store.send(.registerTapped) {
$0.focusedField = nil
$0.isRegistering = true
}
XCTAssertNoDifference(messengerDidRegisterUsername, [])
XCTAssertNoDifference(dbDidSaveContact, [])
bgQueue.advance()
XCTAssertNoDifference(messengerDidRegisterUsername, ["NewUser"])
XCTAssertNoDifference(didSetFactsOnContact, [[Fact(type: .username, value: "NewUser")]])
XCTAssertNoDifference(messengerDidRegisterUsername, [username])
XCTAssertNoDifference(dbDidSaveContact, [
XXModels.Contact(
id: "contact-id".data(using: .utf8)!,
marshaled: "contact-data".data(using: .utf8)!,
username: "NewUser",
id: myContactId,
marshaled: myContactData,
username: myContactUsername,
email: myContactEmail,
phone: myContactPhone,
createdAt: now
)
])
mainQueue.advance()
store.receive(.finished)
store.receive(.finished) {
$0.isRegistering = false
}
}
func testGetDbFailure() throws {
......@@ -139,4 +142,78 @@ final class RegisterFeatureTests: XCTestCase {
$0.failure = error.localizedDescription
}
}
func testRegisterUsernameMismatchFailure() throws {
let now = Date()
let username = "registering-username"
let myContactId = "my-contact-id".data(using: .utf8)!
let myContactData = "my-contact-data".data(using: .utf8)!
let myContactUsername = "my-contact-username"
let myContactEmail = "my-contact-email"
let myContactPhone = "my-contact-phone"
let myContactFacts = [
Fact(type: .username, value: myContactUsername),
Fact(type: .email, value: myContactEmail),
Fact(type: .phone, value: myContactPhone),
]
var messengerDidRegisterUsername: [String] = []
var didGetMyContact: [MessengerMyContact.IncludeFacts?] = []
var dbDidSaveContact: [XXModels.Contact] = []
let store = TestStore(
initialState: RegisterState(
username: username
),
reducer: registerReducer,
environment: .unimplemented
)
store.environment.now = { now }
store.environment.mainQueue = .immediate
store.environment.bgQueue = .immediate
store.environment.messenger.register.run = { username in
messengerDidRegisterUsername.append(username)
}
store.environment.messenger.myContact.run = { includeFacts in
didGetMyContact.append(includeFacts)
var contact = XXClient.Contact.unimplemented(myContactData)
contact.getIdFromContact.run = { _ in myContactId }
contact.getFactsFromContact.run = { _ in myContactFacts }
return contact
}
store.environment.db.run = {
var db: Database = .unimplemented
db.saveContact.run = { contact in
dbDidSaveContact.append(contact)
return contact
}
return db
}
store.send(.registerTapped) {
$0.focusedField = nil
$0.isRegistering = true
}
XCTAssertNoDifference(messengerDidRegisterUsername, [username])
XCTAssertNoDifference(dbDidSaveContact, [
XXModels.Contact(
id: myContactId,
marshaled: myContactData,
username: myContactUsername,
email: myContactEmail,
phone: myContactPhone,
createdAt: now
)
])
let failure = RegisterState.Error.usernameMismatch(
registering: username,
registered: myContactUsername
)
store.receive(.failed(failure.localizedDescription)) {
$0.isRegistering = false
$0.failure = failure.localizedDescription
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment