Skip to content

Commit fe8f829

Browse files
committed
test(android): add instrumented tests for TokenManager, ShiftStateManager
1 parent 438f26c commit fe8f829

4 files changed

Lines changed: 129 additions & 22 deletions

File tree

android/app/build.gradle.kts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,10 +74,15 @@ dependencies {
7474

7575
// Tests
7676
testImplementation(libs.junit)
77+
testImplementation(libs.kotlinx.coroutines.test)
78+
testImplementation("org.mockito:mockito-core:5.7.0")
7779
androidTestImplementation(libs.androidx.junit)
7880
androidTestImplementation(libs.androidx.espresso.core)
7981
androidTestImplementation(platform(libs.androidx.compose.bom))
8082
androidTestImplementation(libs.androidx.compose.ui.test.junit4)
83+
androidTestImplementation(libs.androidx.test.core)
84+
androidTestImplementation(libs.androidx.test.ext.junit)
85+
androidTestImplementation(libs.kotlinx.coroutines.test)
8186
debugImplementation(libs.androidx.compose.ui.tooling)
8287
debugImplementation(libs.androidx.compose.ui.test.manifest)
8388

Lines changed: 49 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,78 @@
11
package org.onebusaway.vehiclepositions.util
22

3+
import android.content.Context
4+
import androidx.datastore.preferences.core.edit
5+
import androidx.test.core.app.ApplicationProvider
6+
import androidx.test.ext.junit.runners.AndroidJUnit4
37
import kotlinx.coroutines.flow.first
8+
import kotlinx.coroutines.runBlocking
49
import kotlinx.coroutines.test.runTest
10+
import org.junit.After
511
import org.junit.Assert.assertEquals
6-
import org.junit.Assert.assertNotNull
12+
import org.junit.Assert.assertFalse
13+
import org.junit.Assert.assertNull
14+
import org.junit.Assert.assertTrue
715
import org.junit.Before
816
import org.junit.Test
17+
import org.junit.runner.RunWith
918

10-
class ServiceEventBusTest {
19+
@RunWith(AndroidJUnit4::class)
20+
class ShiftStateManagerTest {
1121

12-
private lateinit var bus: ServiceEventBus
22+
private lateinit var context: Context
23+
private lateinit var manager: ShiftStateManager
1324

1425
@Before
1526
fun setup() {
16-
bus = ServiceEventBus()
27+
context = ApplicationProvider.getApplicationContext()
28+
manager = ShiftStateManager(context)
29+
30+
runBlocking {
31+
context.dataStore.edit { preferences ->
32+
preferences.clear()
33+
}
34+
}
35+
}
36+
37+
@After
38+
fun teardown() {
39+
runBlocking {
40+
context.dataStore.edit { preferences ->
41+
preferences.clear()
42+
}
43+
}
1744
}
1845

1946
@Test
20-
fun `ServiceEventBus initializes without error`() {
21-
assertNotNull(bus)
47+
fun initialShiftStateIsNotActive() = runTest {
48+
assertFalse(manager.isShiftActive.first())
2249
}
2350

2451
@Test
25-
fun `emitting StopShift event is received by collector`() = runTest {
26-
bus.emitStopShift()
27-
val event = bus.events.first()
28-
assertEquals(ServiceEvent.StopShift, event)
52+
fun initialVehicleIdIsNull() = runTest {
53+
assertNull(manager.activeVehicleId.first())
2954
}
3055

3156
@Test
32-
fun `emitting NavigateToLogin event is received by collector`() = runTest {
33-
bus.emitNavigateToLogin()
34-
val event = bus.events.first()
35-
assertEquals(ServiceEvent.NavigateToLogin, event)
57+
fun startShiftSetsShiftActiveAndVehicleId() = runTest {
58+
manager.startShift("2045")
59+
assertTrue(manager.isShiftActive.first())
60+
assertEquals("2045", manager.activeVehicleId.first())
3661
}
3762

3863
@Test
39-
fun `emitting LocationPermissionRevoked event is received by collector`() = runTest {
40-
bus.emitLocationPermissionRevoked()
41-
val event = bus.events.first()
42-
assertEquals(ServiceEvent.LocationPermissionRevoked, event)
64+
fun endShiftClearsShiftState() = runTest {
65+
manager.startShift("2045")
66+
manager.endShift()
67+
assertFalse(manager.isShiftActive.first())
68+
assertNull(manager.activeVehicleId.first())
4369
}
4470

4571
@Test
46-
fun `multiple events are received in order`() = runTest {
47-
bus.emitStopShift()
48-
val event = bus.events.first()
49-
assertEquals(ServiceEvent.StopShift, event)
72+
fun startShiftWithDifferentVehicleIdUpdatesCorrectly() = runTest {
73+
manager.startShift("2045")
74+
manager.endShift()
75+
manager.startShift("9999")
76+
assertEquals("9999", manager.activeVehicleId.first())
5077
}
5178
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,75 @@
11
package org.onebusaway.vehiclepositions.util
22

3+
import android.content.Context
4+
import androidx.test.core.app.ApplicationProvider
5+
import androidx.test.ext.junit.runners.AndroidJUnit4
6+
import org.junit.Assert.assertEquals
7+
import org.junit.Assert.assertFalse
8+
import org.junit.Assert.assertNull
9+
import org.junit.Assert.assertTrue
10+
import org.junit.Before
11+
import org.junit.Test
12+
import org.junit.runner.RunWith
13+
14+
@RunWith(AndroidJUnit4::class)
315
class TokenManagerTest {
16+
17+
private lateinit var context: Context
18+
private lateinit var tokenManager: TokenManager
19+
20+
@Before
21+
fun setup() {
22+
context = ApplicationProvider.getApplicationContext()
23+
tokenManager = TokenManager(context)
24+
tokenManager.clearTokens()
25+
}
26+
27+
@Test
28+
fun initialTokenIsNull() {
29+
assertNull(tokenManager.getToken())
30+
}
31+
32+
@Test
33+
fun initialRefreshTokenIsNull() {
34+
assertNull(tokenManager.getRefreshToken())
35+
}
36+
37+
@Test
38+
fun isLoggedInReturnsFalseWhenNoToken() {
39+
assertFalse(tokenManager.isLoggedIn())
40+
}
41+
42+
@Test
43+
fun saveTokenStoresTokenCorrectly() {
44+
tokenManager.saveToken("test_jwt_token")
45+
assertEquals("test_jwt_token", tokenManager.getToken())
46+
}
47+
48+
@Test
49+
fun saveRefreshTokenStoresRefreshTokenCorrectly() {
50+
tokenManager.saveRefreshToken("test_refresh_token")
51+
assertEquals("test_refresh_token", tokenManager.getRefreshToken())
52+
}
53+
54+
@Test
55+
fun isLoggedInReturnsTrueAfterSaveToken() {
56+
tokenManager.saveToken("test_jwt_token")
57+
assertTrue(tokenManager.isLoggedIn())
58+
}
59+
60+
@Test
61+
fun clearTokensRemovesBothTokens() {
62+
tokenManager.saveToken("test_jwt_token")
63+
tokenManager.saveRefreshToken("test_refresh_token")
64+
tokenManager.clearTokens()
65+
assertNull(tokenManager.getToken())
66+
assertNull(tokenManager.getRefreshToken())
67+
}
68+
69+
@Test
70+
fun isLoggedInReturnsFalseAfterClearTokens() {
71+
tokenManager.saveToken("test_jwt_token")
72+
tokenManager.clearTokens()
73+
assertFalse(tokenManager.isLoggedIn())
74+
}
475
}

android/gradle/libs.versions.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
[versions]
22
agp = "9.1.0"
33
coreKtx = "1.18.0"
4+
coroutinesTest = "1.8.1"
45
junit = "4.13.2"
56
junitVersion = "1.3.0"
67
espressoCore = "3.7.0"
@@ -39,6 +40,9 @@ androidx-compose-ui-tooling = { group = "androidx.compose.ui", name = "ui-toolin
3940
androidx-compose-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" }
4041
androidx-compose-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" }
4142
androidx-compose-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" }
43+
androidx-test-core = { group = "androidx.test", name = "core-ktx", version = "1.6.1" }
44+
androidx-test-ext-junit = { group = "androidx.test.ext", name = "junit-ktx", version = "1.2.1" }
45+
kotlinx-coroutines-test = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-test", version.ref = "coroutinesTest" }
4246
androidx-compose-material3 = { group = "androidx.compose.material3", name = "material3" }
4347
material = { group = "com.google.android.material", name = "material", version.ref = "material" }
4448
maps = { group = "com.google.android.gms", name = "play-services-maps", version.ref = "maps" }

0 commit comments

Comments
 (0)