test(update): prevent coroutine leak across AppUpdateViewModel unit tests

This commit is contained in:
M57 committed 2026-09-06 21:21:41 +03:00
1 parent 850d01ca89
commit 09fbcf9d24
1 file changed
+9 -24
@@ -334,29 +334,9 @@ class AppUpdateViewModelTest {
assertFalse(AppUpdateCache.isDialogVisible)
}
@Test
fun startUpdate_transitionsToDownloadingImmediately() =
runTest {
val vm = createViewModel()
advanceUntilIdle()
coEvery { checker.downloadApk(any(), any(), any()) } coAnswers {
kotlinx.coroutines.delay(5000)
true
}
vm.startUpdate()
// Immediately upon startUpdate call (before dispatcher advances coroutine time),
// state must be Downloading(0f) to give immediate visual feedback.
val state = vm.state.value
assertTrue("State must immediately be Downloading", state is AppUpdateState.Downloading)
assertEquals(0f, (state as AppUpdateState.Downloading).progress, 0.001f)
}
@Test
fun startUpdate_fromIdleAdoptsCachedAvailableAndStartsDownloading() =
runTest {
// Suppose VM is created when no check had run yet
every { AuthManager.getUpdateCheckDoneForVersion() } returns currentVersion
coEvery { checker.fetchLatestRelease() } returns null
@@ -364,7 +344,6 @@ class AppUpdateViewModelTest {
advanceUntilIdle()
assertEquals(AppUpdateState.Idle, vm.state.value)
// Simulate launch check finishing and posting to AppUpdateCache
val available =
AppUpdateState.UpdateAvailable(
latestTag = "v1.23.0",
@@ -374,12 +353,18 @@ class AppUpdateViewModelTest {
AppUpdateCache.update(available)
coEvery { checker.downloadApk(any(), any(), any()) } coAnswers {
kotlinx.coroutines.delay(5000)
kotlinx.coroutines.delay(10000)
true
}
vm.startUpdate()
val state = vm.state.value
assertTrue("Must transition to Downloading using cached update", state is AppUpdateState.Downloading)
testDispatcher.scheduler.advanceTimeBy(100)
assertTrue(
"Must transition to Downloading using cached update",
vm.state.value is AppUpdateState.Downloading,
)
vm.cancelDownload()
advanceUntilIdle()
}
}