Loading app/src/test/java/foundation/e/apps/data/playstore/PlayStoreRepositoryTest.kt +215 −0 Original line number Diff line number Diff line Loading @@ -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") Loading Loading
app/src/test/java/foundation/e/apps/data/playstore/PlayStoreRepositoryTest.kt +215 −0 Original line number Diff line number Diff line Loading @@ -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") Loading