Skip to content

Commit b04a96a

Browse files
committed
proving onOperationRepoLoaded doesn't always fire
Add test to prove onOperationRepoLoaded doesn't always fire. Refactored test to make it easier to share mocks between tests.
1 parent 685e471 commit b04a96a

File tree

1 file changed

+61
-21
lines changed

1 file changed

+61
-21
lines changed

OneSignalSDK/onesignal/core/src/test/java/com/onesignal/user/internal/migrations/RecoverFromDroppedLoginBugTests.kt

Lines changed: 61 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -15,44 +15,84 @@ import io.mockk.mockk
1515
import io.mockk.runs
1616
import io.mockk.spyk
1717
import io.mockk.verify
18+
import kotlinx.coroutines.delay
19+
import kotlinx.coroutines.withTimeout
20+
21+
private class Mocks {
22+
val operationModelStore: OperationModelStore =
23+
run {
24+
val mockOperationModelStore = mockk<OperationModelStore>()
25+
every { mockOperationModelStore.loadOperations() } just runs
26+
every { mockOperationModelStore.list() } returns listOf()
27+
mockOperationModelStore
28+
}
29+
val configModelStore = mockk<ConfigModelStore>()
30+
val operationRepo =
31+
spyk(
32+
OperationRepo(
33+
listOf(),
34+
operationModelStore,
35+
configModelStore,
36+
Time(),
37+
ExecutorMocks.getNewRecordState(configModelStore),
38+
),
39+
)
40+
41+
val recovery = spyk(RecoverFromDroppedLoginBug(operationRepo, MockHelper.identityModelStore(), configModelStore))
42+
}
1843

1944
class RecoverFromDroppedLoginBugTests : FunSpec({
20-
test("ensure RecoverFromDroppedLoginBug receive onOperationRepoLoaded callback from operationRepo") {
45+
test("ensure onOperationRepoLoaded callback fires from operationRepo") {
2146
// Given
22-
val mockOperationModelStore = mockk<OperationModelStore>()
23-
val mockConfigModelStore = mockk<ConfigModelStore>()
24-
val operationRepo =
25-
spyk(
26-
OperationRepo(
27-
listOf(),
28-
mockOperationModelStore,
29-
mockConfigModelStore,
30-
Time(),
31-
ExecutorMocks.getNewRecordState(mockConfigModelStore),
32-
),
33-
)
34-
every { mockOperationModelStore.loadOperations() } just runs
35-
every { mockOperationModelStore.list() } returns listOf()
36-
val recovery = spyk(RecoverFromDroppedLoginBug(operationRepo, MockHelper.identityModelStore(), mockConfigModelStore))
47+
val mocks = Mocks()
3748

3849
// When
39-
recovery.start()
50+
mocks.recovery.start()
4051
val waiter = Waiter()
41-
operationRepo.addOperationLoadedListener(
52+
mocks.operationRepo.addOperationLoadedListener(
4253
object : IOperationRepoLoadedListener {
4354
override fun onOperationRepoLoaded() {
4455
waiter.wake()
4556
}
4657
},
4758
)
48-
operationRepo.start()
59+
mocks.operationRepo.start()
4960
// Waiting here ensures recovery.onOperationRepoLoaded() is called consistently
5061
waiter.waitForWake()
5162

5263
// Then
5364
verify(exactly = 1) {
54-
operationRepo.subscribe(recovery)
55-
recovery.onOperationRepoLoaded()
65+
mocks.operationRepo.subscribe(mocks.recovery)
66+
mocks.recovery.onOperationRepoLoaded()
67+
}
68+
}
69+
70+
test("ensure onOperationRepoLoaded callback fires from operationRepo, even if started first") {
71+
// Given
72+
val mocks = Mocks()
73+
74+
// When
75+
mocks.operationRepo.start()
76+
// give operation repo some time to fully initialize
77+
delay(200)
78+
79+
mocks.recovery.start()
80+
81+
val waiter = Waiter()
82+
mocks.operationRepo.addOperationLoadedListener(
83+
object : IOperationRepoLoadedListener {
84+
override fun onOperationRepoLoaded() {
85+
waiter.wake()
86+
}
87+
},
88+
)
89+
// Waiting here ensures recovery.onOperationRepoLoaded() is called consistently
90+
withTimeout(1_000) { waiter.waitForWake() }
91+
92+
// Then
93+
verify(exactly = 1) {
94+
mocks.operationRepo.subscribe(mocks.recovery)
95+
mocks.recovery.onOperationRepoLoaded()
5696
}
5797
}
5898
})

0 commit comments

Comments
 (0)