Skip to content

Commit 67ea387

Browse files
author
Saket Narayan
committed
Register a new user for every Android test
1 parent e61323c commit 67ea387

File tree

5 files changed

+102
-36
lines changed

5 files changed

+102
-36
lines changed

app/src/androidTest/java/org/simple/clinic/AuthenticationRule.kt

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
package org.simple.clinic
22

33
import com.google.common.truth.Truth.assertThat
4+
import io.bloco.faker.Faker
45
import org.junit.rules.TestRule
56
import org.junit.runner.Description
67
import org.junit.runners.model.Statement
7-
import org.simple.clinic.login.LoginResult
8+
import org.simple.clinic.facility.Facility
9+
import org.simple.clinic.facility.FacilitySyncApiV1
10+
import org.simple.clinic.patient.SyncStatus
11+
import org.simple.clinic.registration.RegistrationResult
812
import org.simple.clinic.user.User
913
import org.simple.clinic.user.UserSession
1014
import org.simple.clinic.user.UserStatus
@@ -19,6 +23,15 @@ class AuthenticationRule : TestRule {
1923
@Inject
2024
lateinit var testData: TestData
2125

26+
@Inject
27+
lateinit var facilityApi: FacilitySyncApiV1
28+
29+
@Inject
30+
lateinit var facilityDao: Facility.RoomDao
31+
32+
@Inject
33+
lateinit var faker: Faker
34+
2235
override fun apply(base: Statement, description: Description): Statement {
2336
return object : Statement() {
2437
override fun evaluate() {
@@ -33,7 +46,7 @@ class AuthenticationRule : TestRule {
3346
try {
3447
// Login also needs to happen inside this try block so that in case
3548
// of a failure, logout() still gets called to reset all app data.
36-
login()
49+
register()
3750
base.evaluate()
3851

3952
} finally {
@@ -43,11 +56,28 @@ class AuthenticationRule : TestRule {
4356
}
4457
}
4558

46-
private fun login() {
47-
val loginResult = userSession.saveOngoingLoginEntry(testData.qaOngoingLoginEntry())
48-
.andThen(userSession.loginWithOtp(testData.qaUserOtp()))
59+
private fun register() {
60+
val facilities = facilityApi.pull(10)
61+
.map { it.facilities }
62+
.map { facilities -> facilities.map { it.toDatabaseModel(SyncStatus.DONE) } }
4963
.blockingGet()
50-
assertThat(loginResult).isInstanceOf(LoginResult.Success::class.java)
64+
facilityDao.save(facilities)
65+
66+
while (true) {
67+
val registrationEntry = testData.ongoingRegistrationEntry(
68+
phoneNumber = faker.number.number(10),
69+
pin = testData.qaUserPin(),
70+
facilities = facilities)
71+
72+
val registrationResult = userSession.saveOngoingRegistrationEntry(registrationEntry)
73+
.andThen(userSession.loginFromOngoingRegistrationEntry())
74+
.andThen(userSession.register())
75+
.blockingGet()
76+
77+
if (registrationResult is RegistrationResult.Success) {
78+
break
79+
}
80+
}
5181

5282
val (accessToken) = userSession.accessToken()
5383
assertThat(accessToken).isNotNull()

app/src/androidTest/java/org/simple/clinic/TestData.kt

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import org.simple.clinic.di.AppScope
66
import org.simple.clinic.drugs.sync.PrescribedDrugPayload
77
import org.simple.clinic.facility.Facility
88
import org.simple.clinic.facility.FacilityPayload
9+
import org.simple.clinic.facility.FacilityRepository
910
import org.simple.clinic.medicalhistory.MedicalHistory
1011
import org.simple.clinic.medicalhistory.sync.MedicalHistoryPayload
1112
import org.simple.clinic.overdue.Appointment
@@ -20,9 +21,9 @@ import org.simple.clinic.patient.SyncStatus
2021
import org.simple.clinic.patient.sync.PatientAddressPayload
2122
import org.simple.clinic.patient.sync.PatientPayload
2223
import org.simple.clinic.patient.sync.PatientPhoneNumberPayload
23-
import org.simple.clinic.user.OngoingLoginEntry
2424
import org.simple.clinic.user.OngoingRegistrationEntry
2525
import org.simple.clinic.user.User
26+
import org.simple.clinic.user.UserSession
2627
import org.simple.clinic.user.UserStatus
2728
import org.threeten.bp.Instant
2829
import org.threeten.bp.LocalDate
@@ -36,18 +37,25 @@ private fun <T : Enum<T>> randomOfEnum(enumClass: KClass<T>): T {
3637
}
3738

3839
@AppScope
39-
class TestData @Inject constructor(private val faker: Faker) {
40+
class TestData @Inject constructor(
41+
private val faker: Faker,
42+
private val facilityRepository: FacilityRepository,
43+
private val userSession: UserSession
44+
) {
4045

41-
fun qaUserUuid() = UUID.fromString("c6834f82-3305-4144-9dc8-5f77c908ebf1")
46+
fun qaUserUuid(): UUID =
47+
userSession.requireLoggedInUser()
48+
.map { it.uuid }
49+
.blockingFirst()
4250

43-
fun qaUserOtp(): String = "000000"
51+
fun qaUserPin() = "1712"
4452

45-
fun qaOngoingLoginEntry() = OngoingLoginEntry(qaUserUuid(), phoneNumber = "0000", pin = "0000")
53+
fun qaUserOtp() = "000000"
4654

47-
@Deprecated(message = "Get real facilities from the server instead. Look at UserSessionAndroidTest for examples.")
48-
fun qaUserFacilityUuid(): UUID {
49-
return UUID.fromString("43dad34c-139e-4e5f-976e-a3ef1d9ac977")
50-
}
55+
fun qaUserFacilityUuid(): UUID =
56+
facilityRepository.currentFacility(userSession)
57+
.map { it.uuid }
58+
.blockingFirst()
5159

5260
fun patientPayload(
5361
fullName: String = faker.name.name(),
@@ -161,11 +169,14 @@ class TestData @Inject constructor(private val faker: Faker) {
161169
loggedInStatus = loggedInStatus)
162170
}
163171

164-
fun ongoingRegistrationEntry(facilities: List<Facility>): OngoingRegistrationEntry {
165-
val pin = faker.number.number(4)
172+
fun ongoingRegistrationEntry(
173+
phoneNumber: String = faker.number.number(10),
174+
pin: String = qaUserPin(),
175+
facilities: List<Facility>
176+
): OngoingRegistrationEntry {
166177
return OngoingRegistrationEntry(
167178
uuid = UUID.randomUUID(),
168-
phoneNumber = faker.number.number(10),
179+
phoneNumber = phoneNumber,
169180
fullName = faker.name.name(),
170181
pin = pin,
171182
pinConfirmation = pin,
@@ -355,7 +366,7 @@ class TestData @Inject constructor(private val faker: Faker) {
355366
val ongoingPhoneNumber = phone?.let {
356367
OngoingPatientEntry.PhoneNumber(phone, PatientPhoneNumberType.MOBILE, active = true)
357368
}
358-
return OngoingPatientEntry(ongoingPersonalDetails, ongoingAddress, ongoingPhoneNumber)
359369

370+
return OngoingPatientEntry(ongoingPersonalDetails, ongoingAddress, ongoingPhoneNumber)
360371
}
361372
}

app/src/androidTest/java/org/simple/clinic/bp/sync/BloodPressureSyncAndroidTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ class BloodPressureSyncAndroidTest {
139139

140140
@Test
141141
fun when_pulling_measurements_then_paginate_till_the_server_does_not_have_anymore_measurements() {
142-
lastPullTimestamp.set(Just(Instant.now().minusMillis(100)))
142+
lastPullTimestamp.set(Just(Instant.EPOCH))
143143

144144
val measurementsToInsert = 2 * configProvider.blockingGet().batchSize + 7
145145

app/src/androidTest/java/org/simple/clinic/drugs/sync/PrescriptionSyncAndroidTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ class PrescriptionSyncAndroidTest {
143143

144144
@Test
145145
fun when_pulling_prescriptions_then_paginate_till_the_server_does_not_have_anymore_prescriptions() {
146-
lastPullTimestamp.set(Just(Instant.now().minusMillis(100)))
146+
lastPullTimestamp.set(Just(Instant.EPOCH))
147147

148148
val prescriptionsToInsert = 2 * configProvider.blockingGet().batchSize + 7
149149
insertDummyPrescriptions(count = prescriptionsToInsert).blockingAwait()

app/src/androidTest/java/org/simple/clinic/user/UserSessionAndroidTest.kt

Lines changed: 40 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@ package org.simple.clinic.user
33
import android.support.test.runner.AndroidJUnit4
44
import com.google.common.truth.Truth.assertThat
55
import org.junit.Before
6+
import org.junit.Rule
67
import org.junit.Test
78
import org.junit.runner.RunWith
89
import org.simple.clinic.AppDatabase
10+
import org.simple.clinic.AuthenticationRule
911
import org.simple.clinic.TestClinicApp
1012
import org.simple.clinic.TestData
1113
import org.simple.clinic.facility.FacilityRepository
@@ -39,16 +41,22 @@ class UserSessionAndroidTest {
3941
@Inject
4042
lateinit var facilityApi: FacilitySyncApiV1
4143

44+
@get:Rule
45+
val authenticationRule = AuthenticationRule()
46+
4247
@Before
4348
fun setUp() {
4449
TestClinicApp.appComponent().inject(this)
45-
userSession.logout().blockingAwait()
4650
}
4751

4852
@Test
4953
fun when_correct_login_params_are_given_then_login_should_happen_and_session_data_should_be_persisted() {
54+
val ongoingLoginEntry = userSession.requireLoggedInUser()
55+
.map { OngoingLoginEntry(userId = it.uuid, phoneNumber = it.phoneNumber, pin = testData.qaUserPin()) }
56+
.blockingFirst()
57+
5058
val lawgon = userSession
51-
.saveOngoingLoginEntry(testData.qaOngoingLoginEntry())
59+
.saveOngoingLoginEntry(ongoingLoginEntry)
5260
.andThen(userSession.loginWithOtp(testData.qaUserOtp()))
5361
.blockingGet()
5462

@@ -60,17 +68,14 @@ class UserSessionAndroidTest {
6068
assertThat(userSession.isUserLoggedIn()).isTrue()
6169
assertThat(loggedInUser!!.status).isEqualTo(UserStatus.APPROVED_FOR_SYNCING)
6270
assertThat(loggedInUser.loggedInStatus).isEqualTo(LOGGED_IN)
63-
64-
val currentFacility = facilityRepository
65-
.currentFacility(userSession)
66-
.blockingFirst()
67-
assertThat(currentFacility.uuid).isEqualTo(UUID.fromString("43dad34c-139e-4e5f-976e-a3ef1d9ac977"))
6871
}
6972

7073
@Test
7174
fun when_incorrect_login_params_are_given_then_login_should_fail() {
75+
userSession.logout().blockingAwait()
76+
7277
val lawgon = userSession
73-
.saveOngoingLoginEntry(OngoingLoginEntry(testData.qaUserUuid(), "9919299", "0102"))
78+
.saveOngoingLoginEntry(OngoingLoginEntry(UUID.randomUUID(), "9919299", "0102"))
7479
.andThen(userSession.loginWithOtp(testData.qaUserOtp()))
7580
.blockingGet()
7681

@@ -83,14 +88,16 @@ class UserSessionAndroidTest {
8388

8489
@Test
8590
fun when_logging_in_from_registration_entry_user_should_be_logged_in_locally() {
91+
userSession.logout().blockingAwait()
92+
8693
val facilities = facilityApi.pull(10)
8794
.map { it.facilities }
8895
.map { facilities -> facilities.map { it.toDatabaseModel(SyncStatus.DONE) } }
8996
.blockingGet()
9097
appDatabase.facilityDao().save(facilities)
9198

9299
val selectedFacilities = facilities.subList(0, 2)
93-
val ongoingRegistrationEntry = testData.ongoingRegistrationEntry(selectedFacilities)
100+
val ongoingRegistrationEntry = testData.ongoingRegistrationEntry(facilities = selectedFacilities)
94101
userSession.saveOngoingRegistrationEntry(ongoingRegistrationEntry)
95102
.andThen(userSession.loginFromOngoingRegistrationEntry())
96103
.blockingAwait()
@@ -110,8 +117,12 @@ class UserSessionAndroidTest {
110117

111118
@Test
112119
fun when_user_is_logged_out_then_all_app_data_should_get_cleared() {
120+
val ongoingLoginEntry = userSession.requireLoggedInUser()
121+
.map { OngoingLoginEntry(userId = it.uuid, phoneNumber = it.phoneNumber, pin = testData.qaUserPin()) }
122+
.blockingFirst()
123+
113124
userSession
114-
.saveOngoingLoginEntry(testData.qaOngoingLoginEntry())
125+
.saveOngoingLoginEntry(ongoingLoginEntry)
115126
.andThen(userSession.loginWithOtp(testData.qaUserOtp()))
116127
.toCompletable()
117128
.andThen(userSession.logout())
@@ -124,14 +135,16 @@ class UserSessionAndroidTest {
124135

125136
@Test
126137
fun when_registering_a_user_is_registered_then_the_logged_in_user_should_be_sent_to_the_server() {
138+
userSession.logout().blockingAwait()
139+
127140
val facilities = facilityApi.pull(10)
128141
.map { it.facilities }
129142
.map { facilities -> facilities.map { it.toDatabaseModel(SyncStatus.DONE) } }
130143
.blockingGet()
131144
appDatabase.facilityDao().save(facilities)
132145

133146
val selectedFacilities = facilities.subList(0, 2)
134-
val ongoingRegistrationEntry = testData.ongoingRegistrationEntry(selectedFacilities)
147+
val ongoingRegistrationEntry = testData.ongoingRegistrationEntry(facilities = selectedFacilities)
135148

136149
val registrationResult = userSession
137150
.saveOngoingRegistrationEntry(ongoingRegistrationEntry)
@@ -146,7 +159,11 @@ class UserSessionAndroidTest {
146159

147160
@Test
148161
fun when_saving_a_user_locally_it_should_save_the_user_locally_with_a_status_of_not_signed_in() {
149-
val findUserResult = userSession.findExistingUser(testData.qaOngoingLoginEntry().phoneNumber).blockingGet()
162+
val ongoingLoginEntry = userSession.requireLoggedInUser()
163+
.map { OngoingLoginEntry(userId = it.uuid, phoneNumber = it.phoneNumber, pin = testData.qaUserPin()) }
164+
.blockingFirst()
165+
166+
val findUserResult = userSession.findExistingUser(ongoingLoginEntry.phoneNumber).blockingGet()
150167
assertThat(findUserResult).isInstanceOf(FindUserResult.Found::class.java)
151168

152169
val foundUserPayload = (findUserResult as FindUserResult.Found).user
@@ -165,8 +182,12 @@ class UserSessionAndroidTest {
165182

166183
@Test
167184
fun when_logged_in_user_is_cleared_the_local_saved_user_must_be_removed_from_database() {
185+
val ongoingLoginEntry = userSession.requireLoggedInUser()
186+
.map { OngoingLoginEntry(userId = it.uuid, phoneNumber = it.phoneNumber, pin = testData.qaUserPin()) }
187+
.blockingFirst()
188+
168189
val lawgon = userSession
169-
.saveOngoingLoginEntry(testData.qaOngoingLoginEntry())
190+
.saveOngoingLoginEntry(ongoingLoginEntry)
170191
.andThen(userSession.loginWithOtp(testData.qaUserOtp()))
171192
.blockingGet()
172193

@@ -183,7 +204,11 @@ class UserSessionAndroidTest {
183204

184205
@Test
185206
fun when_login_otp_is_requested_successfully_it_must_update_the_logged_in_status_of_the_user() {
186-
val findUserResult = userSession.findExistingUser(testData.qaOngoingLoginEntry().phoneNumber).blockingGet()
207+
val ongoingLoginEntry = userSession.requireLoggedInUser()
208+
.map { OngoingLoginEntry(userId = it.uuid, phoneNumber = it.phoneNumber, pin = testData.qaUserPin()) }
209+
.blockingFirst()
210+
211+
val findUserResult = userSession.findExistingUser(ongoingLoginEntry.phoneNumber).blockingGet()
187212
assertThat(findUserResult).isInstanceOf(FindUserResult.Found::class.java)
188213

189214
val foundUser = (findUserResult as FindUserResult.Found).user
@@ -194,7 +219,7 @@ class UserSessionAndroidTest {
194219
assertThat(userSession.loggedInUserImmediate()!!.loggedInStatus).isEqualTo(NOT_LOGGED_IN)
195220

196221
val requestOtpResult = userSession
197-
.saveOngoingLoginEntry(testData.qaOngoingLoginEntry())
222+
.saveOngoingLoginEntry(ongoingLoginEntry)
198223
.andThen(userSession.requestLoginOtp())
199224
.blockingGet()
200225

0 commit comments

Comments
 (0)