From b215c811212b8d91a092a26dbb2db87140bb7b0f Mon Sep 17 00:00:00 2001 From: Mike Scamell Date: Tue, 25 Feb 2025 11:36:23 +0100 Subject: [PATCH] Add tests to ensure the fallback is executed and canceled correctly. --- .../app/launch/LaunchViewModelTest.kt | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/app/src/test/java/com/duckduckgo/app/launch/LaunchViewModelTest.kt b/app/src/test/java/com/duckduckgo/app/launch/LaunchViewModelTest.kt index ad8dd6f65438..c93c50eae063 100644 --- a/app/src/test/java/com/duckduckgo/app/launch/LaunchViewModelTest.kt +++ b/app/src/test/java/com/duckduckgo/app/launch/LaunchViewModelTest.kt @@ -26,14 +26,19 @@ import com.duckduckgo.app.pixels.AppPixelName import com.duckduckgo.app.referral.StubAppReferrerFoundStateListener import com.duckduckgo.common.test.CoroutineTestRule import com.duckduckgo.fakes.FakePixel +import kotlin.time.Duration.Companion.seconds +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.advanceTimeBy import kotlinx.coroutines.test.runTest import org.junit.After import org.junit.Assert.assertEquals +import org.junit.Assert.assertTrue import org.junit.Rule import org.junit.Test import org.mockito.kotlin.any import org.mockito.kotlin.mock import org.mockito.kotlin.verify +import org.mockito.kotlin.verifyNoInteractions import org.mockito.kotlin.whenever class LaunchViewModelTest { @@ -153,4 +158,47 @@ class LaunchViewModelTest { assertEquals(AppPixelName.SPLASHSCREEN_SHOWN.pixelName, fakePixel.firedPixels.first()) } + + @OptIn(ExperimentalCoroutinesApi::class) + @Test + fun whenLaunchSplashScreenFailToExitJobCalledThenItExecutesFallbackAfterDelay() = runTest { + whenever(userStageStore.getUserAppStage()).thenReturn(AppStage.ESTABLISHED) + + testee = LaunchViewModel( + userStageStore, + StubAppReferrerFoundStateListener("xx", mockDelayMs = Long.MAX_VALUE), + fakePixel, + ) + + testee.command.observeForever(mockCommandObserver) + testee.launchSplashScreenFailToExitJob() + + // Wait for fail to exit timeout and referrer timeout + advanceTimeBy(3.5.seconds) + + assertEquals(AppPixelName.SPLASHSCREEN_SHOWN.pixelName, fakePixel.firedPixels.first()) + verify(mockCommandObserver).onChanged(any()) + } + + @OptIn(ExperimentalCoroutinesApi::class) + @Test + fun whenCancelSplashScreenFailToExitJobThenStopsFallback() = runTest { + whenever(userStageStore.getUserAppStage()).thenReturn(AppStage.ESTABLISHED) + + testee = LaunchViewModel( + userStageStore, + StubAppReferrerFoundStateListener("xx", mockDelayMs = Long.MAX_VALUE), + fakePixel, + ) + + testee.command.observeForever(mockCommandObserver) + testee.launchSplashScreenFailToExitJob() + testee.cancelSplashScreenFailToExitJob() + + // advance time to ensure that the code does not execute after the delay + advanceTimeBy(3.seconds) + + assertTrue(fakePixel.firedPixels.isEmpty()) + verifyNoInteractions(mockCommandObserver) + } }