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

Use MessengerMyContact in RegisterFeature

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