Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d0d1e519 authored by Jonathan Klee's avatar Jonathan Klee
Browse files

tests: add new unit tests for token refresh

parent 9df1f318
Loading
Loading
Loading
Loading
Loading
+215 −0
Original line number Diff line number Diff line
@@ -304,6 +304,221 @@ class PlayStoreRepositoryTest {
        }
    }

    @Test
    fun `getAppDetails does not retry when token refresh fails`() = runTest {
        val authData = AuthData(email = "user@gmail.com")
        val playStoreAuthManager = mock<PlayStoreAuthManager>()

        repository = createRepository(playStoreAuthManager)

        whenever(playStoreAuthManager.getGPlayAuthOrThrow()).thenReturn(authData)
        whenever(playStoreAuthManager.getValidatedAuthData())
            .thenReturn(ResultSupreme.Error("auth refresh failed"))
        every {
            anyConstructed<AppDetailsHelper>().getAppByPackageName("pkg.test")
        } throws GplayHttpRequestException(401, "unauthorized")

        kotlin.test.assertFailsWith<GplayHttpRequestException> {
            repository.getAppDetails("pkg.test")
        }

        mockitoVerify(playStoreAuthManager).getValidatedAuthData()
        verify(exactly = 1) { anyConstructed<AppDetailsHelper>().getAppByPackageName("pkg.test") }
    }

    @Test
    fun `getAppDetails does not retry when token refresh returns null auth data`() = runTest {
        val authData = AuthData(email = "user@gmail.com")
        val playStoreAuthManager = mock<PlayStoreAuthManager>()

        repository = createRepository(playStoreAuthManager)

        whenever(playStoreAuthManager.getGPlayAuthOrThrow()).thenReturn(authData)
        whenever(playStoreAuthManager.getValidatedAuthData())
            .thenReturn(ResultSupreme.Success(null))
        every {
            anyConstructed<AppDetailsHelper>().getAppByPackageName("pkg.test")
        } throws GplayHttpRequestException(401, "unauthorized")

        kotlin.test.assertFailsWith<GplayHttpRequestException> {
            repository.getAppDetails("pkg.test")
        }

        mockitoVerify(playStoreAuthManager).getValidatedAuthData()
        verify(exactly = 1) { anyConstructed<AppDetailsHelper>().getAppByPackageName("pkg.test") }
    }

    @Test
    fun `getAppDetails does not retry on non-auth errors`() = runTest {
        val authData = AuthData(email = "user@gmail.com")
        val playStoreAuthManager = mock<PlayStoreAuthManager>()

        repository = createRepository(playStoreAuthManager)

        whenever(playStoreAuthManager.getGPlayAuthOrThrow()).thenReturn(authData)
        every {
            anyConstructed<AppDetailsHelper>().getAppByPackageName("pkg.test")
        } throws GplayHttpRequestException(500, "server error")

        kotlin.test.assertFailsWith<GplayHttpRequestException> {
            repository.getAppDetails("pkg.test")
        }

        mockitoVerify(playStoreAuthManager, org.mockito.kotlin.never()).getValidatedAuthData()
        verify(exactly = 1) { anyConstructed<AppDetailsHelper>().getAppByPackageName("pkg.test") }
    }

    @Test
    fun `getAppDetails throws when version code is still zero after token refresh`() = runTest {
        val authData = AuthData(email = "user@gmail.com")
        val staleApp = App(packageName = "pkg.test", versionCode = 0)
        val playStoreAuthManager = mock<PlayStoreAuthManager>()
        val storeAuthCoordinator = mock<StoreAuthCoordinator>()
        val playStoreAuthStore = createPlayStoreAuthStore(authData)

        repository = createRepository(playStoreAuthManager, playStoreAuthStore, storeAuthCoordinator)

        whenever(playStoreAuthManager.getGPlayAuthOrThrow()).thenReturn(authData)
        whenever(storeAuthCoordinator.fetchAuthObjects(listOf(StoreType.PLAY_STORE)))
            .thenReturn(emptyList())
        every {
            anyConstructed<AppDetailsHelper>().getAppByPackageName("pkg.test")
        } returns staleApp

        kotlin.test.assertFailsWith<IllegalStateException> {
            repository.getAppDetails("pkg.test")
        }

        mockitoVerify(storeAuthCoordinator).fetchAuthObjects(listOf(StoreType.PLAY_STORE))
    }

    @Test
    fun `getAppsDetails retries after 401`() = runTest {
        val authData = AuthData(email = "user@gmail.com")
        val apps = listOf(App(packageName = "pkg.test", versionCode = 2))
        val playStoreAuthManager = mock<PlayStoreAuthManager>()

        repository = createRepository(playStoreAuthManager)

        whenever(playStoreAuthManager.getGPlayAuthOrThrow()).thenReturn(authData)
        whenever(playStoreAuthManager.getValidatedAuthData()).thenReturn(ResultSupreme.Success(authData))
        every {
            anyConstructed<AppDetailsHelper>().getAppByPackageName(listOf("pkg.test"))
        } throws GplayHttpRequestException(401, "unauthorized") andThen apps

        val result = repository.getAppsDetails(listOf("pkg.test"))

        assertThat(result).hasSize(1)
        mockitoVerify(playStoreAuthManager).getValidatedAuthData()
        verify(exactly = 2) {
            anyConstructed<AppDetailsHelper>().getAppByPackageName(listOf("pkg.test"))
        }
    }

    @Test
    fun `getAppsDetails does not retry when token refresh fails`() = runTest {
        val authData = AuthData(email = "user@gmail.com")
        val playStoreAuthManager = mock<PlayStoreAuthManager>()

        repository = createRepository(playStoreAuthManager)

        whenever(playStoreAuthManager.getGPlayAuthOrThrow()).thenReturn(authData)
        whenever(playStoreAuthManager.getValidatedAuthData())
            .thenReturn(ResultSupreme.Error("auth refresh failed"))
        every {
            anyConstructed<AppDetailsHelper>().getAppByPackageName(listOf("pkg.test"))
        } throws GplayHttpRequestException(401, "unauthorized")

        kotlin.test.assertFailsWith<GplayHttpRequestException> {
            repository.getAppsDetails(listOf("pkg.test"))
        }

        mockitoVerify(playStoreAuthManager).getValidatedAuthData()
        verify(exactly = 1) {
            anyConstructed<AppDetailsHelper>().getAppByPackageName(listOf("pkg.test"))
        }
    }

    @Test
    fun `getAppsDetails does not refresh auth for non-anonymous user when all version codes are zero`() = runTest {
        val authData = AuthData(email = "user@gmail.com", isAnonymous = false)
        val staleApps = listOf(App(packageName = "pkg.test", versionCode = 0))
        val playStoreAuthManager = mock<PlayStoreAuthManager>()
        val storeAuthCoordinator = mock<StoreAuthCoordinator>()
        val playStoreAuthStore = createPlayStoreAuthStore(authData)

        repository = createRepository(playStoreAuthManager, playStoreAuthStore, storeAuthCoordinator)

        whenever(playStoreAuthManager.getGPlayAuthOrThrow()).thenReturn(authData)
        every {
            anyConstructed<AppDetailsHelper>().getAppByPackageName(listOf("pkg.test"))
        } returns staleApps

        val result = repository.getAppsDetails(listOf("pkg.test"))

        assertThat(result).isEmpty()
        mockitoVerify(storeAuthCoordinator, org.mockito.kotlin.never())
            .fetchAuthObjects(org.mockito.kotlin.any())
        verify(exactly = 1) {
            anyConstructed<AppDetailsHelper>().getAppByPackageName(listOf("pkg.test"))
        }
    }

    @Test
    fun `getAppsDetails does not refresh auth when not all version codes are zero`() = runTest {
        val authData = AuthData(email = "anon@example.com", isAnonymous = true)
        val apps = listOf(
            App(packageName = "pkg.a", versionCode = 0),
            App(packageName = "pkg.b", versionCode = 5)
        )
        val playStoreAuthManager = mock<PlayStoreAuthManager>()
        val storeAuthCoordinator = mock<StoreAuthCoordinator>()
        val playStoreAuthStore = createPlayStoreAuthStore(authData)

        repository = createRepository(playStoreAuthManager, playStoreAuthStore, storeAuthCoordinator)

        whenever(playStoreAuthManager.getGPlayAuthOrThrow()).thenReturn(authData)
        every {
            anyConstructed<AppDetailsHelper>().getAppByPackageName(listOf("pkg.a", "pkg.b"))
        } returns apps

        val result = repository.getAppsDetails(listOf("pkg.a", "pkg.b"))

        assertThat(result).hasSize(1)
        assertThat(result.first().package_name).isEqualTo("pkg.b")
        mockitoVerify(storeAuthCoordinator, org.mockito.kotlin.never())
            .fetchAuthObjects(org.mockito.kotlin.any())
        verify(exactly = 1) {
            anyConstructed<AppDetailsHelper>().getAppByPackageName(listOf("pkg.a", "pkg.b"))
        }
    }

    @Test
    fun `getAppsDetails returns empty result when version codes still zero after token refresh`() = runTest {
        val authData = AuthData(email = "anon@example.com", isAnonymous = true)
        val staleApps = listOf(App(packageName = "pkg.test", versionCode = 0))
        val playStoreAuthManager = mock<PlayStoreAuthManager>()
        val storeAuthCoordinator = mock<StoreAuthCoordinator>()
        val playStoreAuthStore = createPlayStoreAuthStore(authData)

        repository = createRepository(playStoreAuthManager, playStoreAuthStore, storeAuthCoordinator)

        whenever(playStoreAuthManager.getGPlayAuthOrThrow()).thenReturn(authData)
        whenever(storeAuthCoordinator.fetchAuthObjects(listOf(StoreType.PLAY_STORE)))
            .thenReturn(emptyList())
        every {
            anyConstructed<AppDetailsHelper>().getAppByPackageName(listOf("pkg.test"))
        } returns staleApps

        val result = repository.getAppsDetails(listOf("pkg.test"))

        assertThat(result).isEmpty()
        mockitoVerify(storeAuthCoordinator).fetchAuthObjects(listOf(StoreType.PLAY_STORE))
        verify(exactly = 2) {
            anyConstructed<AppDetailsHelper>().getAppByPackageName(listOf("pkg.test"))
        }
    }

    @Test
    fun `getAppsDetails filters invalid apps`() = runTest {
        val authData = AuthData(email = "user@gmail.com")