Loading app/src/main/java/foundation/e/apps/data/application/ApplicationApiImpl.kt +0 −22 Original line number Diff line number Diff line Loading @@ -19,58 +19,36 @@ package foundation.e.apps.data.application import android.content.Context import android.text.format.Formatter import com.aurora.gplayapi.Constants import com.aurora.gplayapi.SearchSuggestEntry import com.aurora.gplayapi.data.models.App import com.aurora.gplayapi.data.models.Artwork import com.aurora.gplayapi.data.models.AuthData import com.aurora.gplayapi.data.models.SearchBundle import com.aurora.gplayapi.data.models.StreamCluster import dagger.hilt.android.qualifiers.ApplicationContext import foundation.e.apps.R import foundation.e.apps.data.ResultSupreme import foundation.e.apps.data.application.ApplicationApi.Companion.APP_TYPE_ANY import foundation.e.apps.data.application.ApplicationApi.Companion.APP_TYPE_OPEN import foundation.e.apps.data.application.ApplicationApi.Companion.APP_TYPE_PWA import foundation.e.apps.data.application.data.Application import foundation.e.apps.data.application.data.Category import foundation.e.apps.data.application.data.Home import foundation.e.apps.data.application.data.Ratings import foundation.e.apps.data.application.utils.CategoryType import foundation.e.apps.data.application.utils.CategoryUtils import foundation.e.apps.data.application.utils.toApplication import foundation.e.apps.data.cleanapk.CleanApkDownloadInfoFetcher import foundation.e.apps.data.cleanapk.data.categories.Categories import foundation.e.apps.data.cleanapk.data.search.Search import foundation.e.apps.data.cleanapk.repositories.CleanApkRepository import foundation.e.apps.data.enums.AppTag import foundation.e.apps.data.enums.FilterLevel import foundation.e.apps.data.enums.Origin import foundation.e.apps.data.enums.ResultStatus import foundation.e.apps.data.enums.Status import foundation.e.apps.data.enums.Type import foundation.e.apps.data.enums.isUnFiltered import foundation.e.apps.data.fusedDownload.models.FusedDownload import foundation.e.apps.data.handleNetworkResult import foundation.e.apps.data.login.AuthObject import foundation.e.apps.data.playstore.PlayStoreRepository import foundation.e.apps.data.preference.PreferenceManagerModule import foundation.e.apps.install.pkg.PWAManagerModule import foundation.e.apps.install.pkg.PkgManagerModule import foundation.e.apps.ui.applicationlist.ApplicationDiffUtil import foundation.e.apps.utils.eventBus.AppEvent import foundation.e.apps.utils.eventBus.EventBus import kotlinx.coroutines.Deferred import kotlinx.coroutines.MainScope import kotlinx.coroutines.launch import retrofit2.Response import timber.log.Timber import javax.inject.Inject import javax.inject.Named import javax.inject.Singleton import com.aurora.gplayapi.data.models.Category as GplayapiCategory import foundation.e.apps.data.cleanapk.data.app.Application as CleanApkApplication typealias FusedHomeDeferred = Deferred<ResultSupreme<List<Home>>> Loading app/src/main/java/foundation/e/apps/data/application/AppsApi.kt +3 −5 Original line number Diff line number Diff line Loading @@ -12,8 +12,6 @@ interface AppsApi { /* * Function to search cleanapk using package name. * Will be used to handle f-droid deeplink. * * Issue: https://gitlab.e.foundation/e/backlog/-/issues/5509 */ suspend fun getCleanapkAppDetails(packageName: String): Pair<Application, ResultStatus> Loading app/src/main/java/foundation/e/apps/data/application/data/Application.kt +3 −3 Original line number Diff line number Diff line Loading @@ -102,9 +102,9 @@ data class Application( fun updateSource(context: Context) { this.apply { source = if (origin == Origin.CLEANAPK && is_pwa) context.getString(R.string.pwa) else if (origin == Origin.CLEANAPK) context.getString(R.string.open_source) else "" source = if (origin != Origin.CLEANAPK) "" else if (is_pwa) context.getString(R.string.pwa) else context.getString(R.string.open_source) } } } app/src/test/java/foundation/e/apps/apps/AppsApiTest.kt 0 → 100644 +488 −0 Original line number Diff line number Diff line /* * Copyright (C) 2022 ECORP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <https://www.gnu.org/licenses/>. */ package foundation.e.apps.apps import android.content.Context import android.text.format.Formatter import androidx.arch.core.executor.testing.InstantTaskExecutorRule import com.aurora.gplayapi.Constants import com.aurora.gplayapi.data.models.App import com.aurora.gplayapi.data.models.AuthData import foundation.e.apps.FakePreferenceModule import foundation.e.apps.data.cleanapk.repositories.CleanApkRepository import foundation.e.apps.data.enums.FilterLevel import foundation.e.apps.data.enums.Origin import foundation.e.apps.data.enums.Status import foundation.e.apps.data.application.ApplicationDataManager import foundation.e.apps.data.application.AppsApi import foundation.e.apps.data.application.AppsApiImpl import foundation.e.apps.data.application.data.Application import foundation.e.apps.data.playstore.PlayStoreRepository import foundation.e.apps.install.pkg.PWAManagerModule import foundation.e.apps.install.pkg.PkgManagerModule import foundation.e.apps.util.MainCoroutineRule import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runTest import org.junit.After import org.junit.Assert.assertEquals import org.junit.Assert.assertFalse import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Rule import org.junit.Test import org.mockito.Mock import org.mockito.MockedStatic import org.mockito.Mockito import org.mockito.MockitoAnnotations import org.mockito.kotlin.eq @OptIn(ExperimentalCoroutinesApi::class) class AppsApiTest { // Run tasks synchronously @Rule @JvmField val instantExecutorRule = InstantTaskExecutorRule() // Sets the main coroutines dispatcher to a TestCoroutineScope for unit testing. @ExperimentalCoroutinesApi @get:Rule var mainCoroutineRule = MainCoroutineRule() @Mock private lateinit var pwaManagerModule: PWAManagerModule @Mock private lateinit var pkgManagerModule: PkgManagerModule @Mock private lateinit var context: Context @Mock private lateinit var cleanApkAppsRepository: CleanApkRepository @Mock private lateinit var gPlayAPIRepository: PlayStoreRepository private lateinit var appsApi: AppsApi private lateinit var applicationDataManager: ApplicationDataManager private lateinit var preferenceManagerModule: FakePreferenceModule private lateinit var formatterMocked: MockedStatic<Formatter> companion object { private val AUTH_DATA = AuthData("e@e.email", "AtadyMsIAtadyM") } @Before fun setup() { MockitoAnnotations.openMocks(this) formatterMocked = Mockito.mockStatic(Formatter::class.java) preferenceManagerModule = FakePreferenceModule(context) applicationDataManager = ApplicationDataManager(gPlayAPIRepository, pkgManagerModule, pwaManagerModule) appsApi = AppsApiImpl( context, preferenceManagerModule, gPlayAPIRepository, cleanApkAppsRepository, applicationDataManager, ) } @After fun after() { formatterMocked.close() } @Test fun `is any app updated when new list is empty`() { val oldAppList = mutableListOf<Application>( Application( _id = "111", status = Status.UNAVAILABLE, name = "Demo One", package_name = "foundation.e.demoone" ), Application( _id = "112", status = Status.INSTALLED, name = "Demo Two", package_name = "foundation.e.demotwo" ), Application( _id = "113", status = Status.UNAVAILABLE, name = "Demo Three", package_name = "foundation.e.demothree" ) ) val newAppList = mutableListOf<Application>() val isFusedAppUpdated = appsApi.isAnyFusedAppUpdated(newAppList, oldAppList) assertTrue("isAnyAppUpdated", isFusedAppUpdated) } @Test fun `is any app updated when both list are empty`() { val isFusedAppUpdated = appsApi.isAnyFusedAppUpdated(listOf(), listOf()) assertFalse("isAnyAppUpdated", isFusedAppUpdated) } @Test fun `is any app updated when any app is uninstalled`() { val oldAppList = mutableListOf<Application>( Application( _id = "111", status = Status.UNAVAILABLE, name = "Demo One", package_name = "foundation.e.demoone" ), Application( _id = "112", status = Status.INSTALLED, name = "Demo Two", package_name = "foundation.e.demotwo" ), Application( _id = "113", status = Status.UNAVAILABLE, name = "Demo Three", package_name = "foundation.e.demothree" ) ) val newAppList = mutableListOf<Application>( Application( _id = "111", status = Status.UNAVAILABLE, name = "Demo One", package_name = "foundation.e.demoone" ), Application( _id = "112", status = Status.UNAVAILABLE, name = "Demo Two", package_name = "foundation.e.demotwo" ), Application( _id = "113", status = Status.UNAVAILABLE, name = "Demo Three", package_name = "foundation.e.demothree" ) ) val isFusedAppUpdated = appsApi.isAnyFusedAppUpdated(newAppList, oldAppList) assertTrue("isAnyFusedAppUpdated", isFusedAppUpdated) } @Test fun `has any app install status changed when changed`() { val oldAppList = mutableListOf<Application>( Application( _id = "111", status = Status.UNAVAILABLE, name = "Demo One", package_name = "foundation.e.demoone", latest_version_code = 123 ), Application( _id = "112", status = Status.INSTALLED, name = "Demo Two", package_name = "foundation.e.demotwo", latest_version_code = 123 ), Application( _id = "113", status = Status.UNAVAILABLE, name = "Demo Three", package_name = "foundation.e.demothree", latest_version_code = 123 ) ) Mockito.`when`(pkgManagerModule.getPackageStatus(eq("foundation.e.demoone"), eq(123))) .thenReturn( Status.UNAVAILABLE ) Mockito.`when`(pkgManagerModule.getPackageStatus(eq("foundation.e.demotwo"), eq(123))) .thenReturn( Status.UNAVAILABLE ) Mockito.`when`(pkgManagerModule.getPackageStatus(eq("foundation.e.demothree"), eq(123))) .thenReturn( Status.UNAVAILABLE ) val isAppStatusUpdated = appsApi.isAnyAppInstallStatusChanged(oldAppList) assertTrue("hasInstallStatusUpdated", isAppStatusUpdated) } @Test fun `has any app install status changed when not changed`() { val oldAppList = mutableListOf<Application>( Application( _id = "111", status = Status.UNAVAILABLE, name = "Demo One", package_name = "foundation.e.demoone", latest_version_code = 123 ), Application( _id = "112", status = Status.INSTALLED, name = "Demo Two", package_name = "foundation.e.demotwo", latest_version_code = 123 ), Application( _id = "113", status = Status.UNAVAILABLE, name = "Demo Three", package_name = "foundation.e.demothree", latest_version_code = 123 ) ) Mockito.`when`(pkgManagerModule.getPackageStatus(eq("foundation.e.demoone"), eq(123))) .thenReturn( Status.UNAVAILABLE ) Mockito.`when`(pkgManagerModule.getPackageStatus(eq("foundation.e.demotwo"), eq(123))) .thenReturn( Status.INSTALLED ) Mockito.`when`(pkgManagerModule.getPackageStatus(eq("foundation.e.demothree"), eq(123))) .thenReturn( Status.UNAVAILABLE ) val isAppStatusUpdated = appsApi.isAnyAppInstallStatusChanged(oldAppList) assertFalse("hasInstallStatusUpdated", isAppStatusUpdated) } @Test fun `has any app install status changed when installation_issue`() { val oldAppList = mutableListOf<Application>( Application( _id = "111", status = Status.INSTALLATION_ISSUE, name = "Demo One", package_name = "foundation.e.demoone", latest_version_code = 123 ), Application( _id = "112", status = Status.INSTALLED, name = "Demo Two", package_name = "foundation.e.demotwo", latest_version_code = 123 ), Application( _id = "113", status = Status.UNAVAILABLE, name = "Demo Three", package_name = "foundation.e.demothree", latest_version_code = 123 ) ) Mockito.`when`(pkgManagerModule.getPackageStatus(eq("foundation.e.demoone"), eq(123))) .thenReturn( Status.UNAVAILABLE ) Mockito.`when`(pkgManagerModule.getPackageStatus(eq("foundation.e.demotwo"), eq(123))) .thenReturn( Status.INSTALLED ) Mockito.`when`(pkgManagerModule.getPackageStatus(eq("foundation.e.demothree"), eq(123))) .thenReturn( Status.UNAVAILABLE ) val isAppStatusUpdated = appsApi.isAnyAppInstallStatusChanged(oldAppList) assertFalse("hasInstallStatusUpdated", isAppStatusUpdated) } @Test fun getFusedAppInstallationStatusWhenPWA() { val application = Application( _id = "113", status = Status.UNAVAILABLE, name = "Demo Three", package_name = "foundation.e.demothree", latest_version_code = 123, is_pwa = true ) Mockito.`when`(pwaManagerModule.getPwaStatus(application)).thenReturn(application.status) val installationStatus = appsApi.getFusedAppInstallationStatus(application) assertEquals("getFusedAppInstallationStatusWhenPWA", application.status, installationStatus) } @Test fun getFusedAppInstallationStatus() { val application = Application( _id = "113", name = "Demo Three", package_name = "foundation.e.demothree", latest_version_code = 123, ) Mockito.`when`( pkgManagerModule.getPackageStatus( application.package_name, application.latest_version_code ) ).thenReturn(Status.INSTALLED) val installationStatus = appsApi.getFusedAppInstallationStatus(application) assertEquals("getFusedAppInstallationStatusWhenPWA", Status.INSTALLED, installationStatus) } @Test fun `getAppFilterLevel when package name is empty`() = runTest { val application = Application( _id = "113", name = "Demo Three", package_name = "", latest_version_code = 123, ) val filterLevel = appsApi.getAppFilterLevel(application, AUTH_DATA) assertEquals("getAppFilterLevel", FilterLevel.UNKNOWN, filterLevel) } @Test fun `getAppFilterLevel when app is CleanApk`() = runTest { val fusedApp = getFusedAppForFilterLevelTest() val filterLevel = appsApi.getAppFilterLevel(fusedApp, AUTH_DATA) assertEquals("getAppFilterLevel", FilterLevel.NONE, filterLevel) } private fun getFusedAppForFilterLevelTest(isFree: Boolean = true) = Application( _id = "113", name = "Demo Three", package_name = "foundation.e.demothree", latest_version_code = 123, origin = Origin.CLEANAPK, originalSize = -1, isFree = isFree, price = "" ) @Test fun `getAppFilterLevel when Authdata is NULL`() = runTest { val fusedApp = getFusedAppForFilterLevelTest() val filterLevel = appsApi.getAppFilterLevel(fusedApp, null) assertEquals("getAppFilterLevel", FilterLevel.NONE, filterLevel) } @Test fun `getAppFilterLevel when app is restricted and paid and no price`() = runTest { val fusedApp = getFusedAppForFilterLevelTest(false).apply { this.origin = Origin.GPLAY this.restriction = Constants.Restriction.UNKNOWN } val filterLevel = appsApi.getAppFilterLevel(fusedApp, AUTH_DATA) assertEquals("getAppFilterLevel", FilterLevel.UI, filterLevel) } @Test fun `getAppFilterLevel when app is not_restricted and paid and no price`() = runTest { val fusedApp = getFusedAppForFilterLevelTest(false).apply { this.origin = Origin.GPLAY this.restriction = Constants.Restriction.NOT_RESTRICTED } val filterLevel = appsApi.getAppFilterLevel(fusedApp, AUTH_DATA) assertEquals("getAppFilterLevel", FilterLevel.UI, filterLevel) } @Test fun `getAppFilterLevel when app is restricted and getAppDetails and getDownloadDetails returns success`() = runTest { val fusedApp = getFusedAppForFilterLevelTest().apply { this.origin = Origin.GPLAY this.restriction = Constants.Restriction.UNKNOWN } Mockito.`when`(gPlayAPIRepository.getAppDetails(fusedApp.package_name)) .thenReturn(App(fusedApp.package_name)) Mockito.`when`( gPlayAPIRepository.getDownloadInfo( fusedApp.package_name, fusedApp.latest_version_code, fusedApp.offer_type, ) ).thenReturn(listOf()) val filterLevel = appsApi.getAppFilterLevel(fusedApp, AUTH_DATA) assertEquals("getAppFilterLevel", FilterLevel.NONE, filterLevel) } @Test fun `getAppFilterLevel when app is restricted and getAppDetails throws exception`() = runTest { val fusedApp = getFusedAppForFilterLevelTest().apply { this.origin = Origin.GPLAY this.restriction = Constants.Restriction.UNKNOWN } Mockito.`when`(gPlayAPIRepository.getAppDetails(fusedApp.package_name)) .thenThrow(RuntimeException()) Mockito.`when`( gPlayAPIRepository.getDownloadInfo( fusedApp.package_name, fusedApp.latest_version_code, fusedApp.offer_type ) ).thenReturn(listOf()) val filterLevel = appsApi.getAppFilterLevel(fusedApp, AUTH_DATA) assertEquals("getAppFilterLevel", FilterLevel.DATA, filterLevel) } @Test fun `getAppFilterLevel when app is restricted and getDownoadInfo throws exception`() = runTest { val fusedApp = getFusedAppForFilterLevelTest().apply { this.origin = Origin.GPLAY this.restriction = Constants.Restriction.UNKNOWN } Mockito.`when`(gPlayAPIRepository.getAppDetails(fusedApp.package_name)) .thenReturn(App(fusedApp.package_name)) Mockito.`when`( gPlayAPIRepository.getDownloadInfo( fusedApp.package_name, fusedApp.latest_version_code, fusedApp.offer_type ) ).thenThrow(RuntimeException()) val filterLevel = appsApi.getAppFilterLevel(fusedApp, AUTH_DATA) assertEquals("getAppFilterLevel", FilterLevel.UI, filterLevel) } } app/src/test/java/foundation/e/apps/fused/ApplicationApiImplTest.kt +22 −366 File changed.Preview size limit exceeded, changes collapsed. Show changes Loading
app/src/main/java/foundation/e/apps/data/application/ApplicationApiImpl.kt +0 −22 Original line number Diff line number Diff line Loading @@ -19,58 +19,36 @@ package foundation.e.apps.data.application import android.content.Context import android.text.format.Formatter import com.aurora.gplayapi.Constants import com.aurora.gplayapi.SearchSuggestEntry import com.aurora.gplayapi.data.models.App import com.aurora.gplayapi.data.models.Artwork import com.aurora.gplayapi.data.models.AuthData import com.aurora.gplayapi.data.models.SearchBundle import com.aurora.gplayapi.data.models.StreamCluster import dagger.hilt.android.qualifiers.ApplicationContext import foundation.e.apps.R import foundation.e.apps.data.ResultSupreme import foundation.e.apps.data.application.ApplicationApi.Companion.APP_TYPE_ANY import foundation.e.apps.data.application.ApplicationApi.Companion.APP_TYPE_OPEN import foundation.e.apps.data.application.ApplicationApi.Companion.APP_TYPE_PWA import foundation.e.apps.data.application.data.Application import foundation.e.apps.data.application.data.Category import foundation.e.apps.data.application.data.Home import foundation.e.apps.data.application.data.Ratings import foundation.e.apps.data.application.utils.CategoryType import foundation.e.apps.data.application.utils.CategoryUtils import foundation.e.apps.data.application.utils.toApplication import foundation.e.apps.data.cleanapk.CleanApkDownloadInfoFetcher import foundation.e.apps.data.cleanapk.data.categories.Categories import foundation.e.apps.data.cleanapk.data.search.Search import foundation.e.apps.data.cleanapk.repositories.CleanApkRepository import foundation.e.apps.data.enums.AppTag import foundation.e.apps.data.enums.FilterLevel import foundation.e.apps.data.enums.Origin import foundation.e.apps.data.enums.ResultStatus import foundation.e.apps.data.enums.Status import foundation.e.apps.data.enums.Type import foundation.e.apps.data.enums.isUnFiltered import foundation.e.apps.data.fusedDownload.models.FusedDownload import foundation.e.apps.data.handleNetworkResult import foundation.e.apps.data.login.AuthObject import foundation.e.apps.data.playstore.PlayStoreRepository import foundation.e.apps.data.preference.PreferenceManagerModule import foundation.e.apps.install.pkg.PWAManagerModule import foundation.e.apps.install.pkg.PkgManagerModule import foundation.e.apps.ui.applicationlist.ApplicationDiffUtil import foundation.e.apps.utils.eventBus.AppEvent import foundation.e.apps.utils.eventBus.EventBus import kotlinx.coroutines.Deferred import kotlinx.coroutines.MainScope import kotlinx.coroutines.launch import retrofit2.Response import timber.log.Timber import javax.inject.Inject import javax.inject.Named import javax.inject.Singleton import com.aurora.gplayapi.data.models.Category as GplayapiCategory import foundation.e.apps.data.cleanapk.data.app.Application as CleanApkApplication typealias FusedHomeDeferred = Deferred<ResultSupreme<List<Home>>> Loading
app/src/main/java/foundation/e/apps/data/application/AppsApi.kt +3 −5 Original line number Diff line number Diff line Loading @@ -12,8 +12,6 @@ interface AppsApi { /* * Function to search cleanapk using package name. * Will be used to handle f-droid deeplink. * * Issue: https://gitlab.e.foundation/e/backlog/-/issues/5509 */ suspend fun getCleanapkAppDetails(packageName: String): Pair<Application, ResultStatus> Loading
app/src/main/java/foundation/e/apps/data/application/data/Application.kt +3 −3 Original line number Diff line number Diff line Loading @@ -102,9 +102,9 @@ data class Application( fun updateSource(context: Context) { this.apply { source = if (origin == Origin.CLEANAPK && is_pwa) context.getString(R.string.pwa) else if (origin == Origin.CLEANAPK) context.getString(R.string.open_source) else "" source = if (origin != Origin.CLEANAPK) "" else if (is_pwa) context.getString(R.string.pwa) else context.getString(R.string.open_source) } } }
app/src/test/java/foundation/e/apps/apps/AppsApiTest.kt 0 → 100644 +488 −0 Original line number Diff line number Diff line /* * Copyright (C) 2022 ECORP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <https://www.gnu.org/licenses/>. */ package foundation.e.apps.apps import android.content.Context import android.text.format.Formatter import androidx.arch.core.executor.testing.InstantTaskExecutorRule import com.aurora.gplayapi.Constants import com.aurora.gplayapi.data.models.App import com.aurora.gplayapi.data.models.AuthData import foundation.e.apps.FakePreferenceModule import foundation.e.apps.data.cleanapk.repositories.CleanApkRepository import foundation.e.apps.data.enums.FilterLevel import foundation.e.apps.data.enums.Origin import foundation.e.apps.data.enums.Status import foundation.e.apps.data.application.ApplicationDataManager import foundation.e.apps.data.application.AppsApi import foundation.e.apps.data.application.AppsApiImpl import foundation.e.apps.data.application.data.Application import foundation.e.apps.data.playstore.PlayStoreRepository import foundation.e.apps.install.pkg.PWAManagerModule import foundation.e.apps.install.pkg.PkgManagerModule import foundation.e.apps.util.MainCoroutineRule import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runTest import org.junit.After import org.junit.Assert.assertEquals import org.junit.Assert.assertFalse import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Rule import org.junit.Test import org.mockito.Mock import org.mockito.MockedStatic import org.mockito.Mockito import org.mockito.MockitoAnnotations import org.mockito.kotlin.eq @OptIn(ExperimentalCoroutinesApi::class) class AppsApiTest { // Run tasks synchronously @Rule @JvmField val instantExecutorRule = InstantTaskExecutorRule() // Sets the main coroutines dispatcher to a TestCoroutineScope for unit testing. @ExperimentalCoroutinesApi @get:Rule var mainCoroutineRule = MainCoroutineRule() @Mock private lateinit var pwaManagerModule: PWAManagerModule @Mock private lateinit var pkgManagerModule: PkgManagerModule @Mock private lateinit var context: Context @Mock private lateinit var cleanApkAppsRepository: CleanApkRepository @Mock private lateinit var gPlayAPIRepository: PlayStoreRepository private lateinit var appsApi: AppsApi private lateinit var applicationDataManager: ApplicationDataManager private lateinit var preferenceManagerModule: FakePreferenceModule private lateinit var formatterMocked: MockedStatic<Formatter> companion object { private val AUTH_DATA = AuthData("e@e.email", "AtadyMsIAtadyM") } @Before fun setup() { MockitoAnnotations.openMocks(this) formatterMocked = Mockito.mockStatic(Formatter::class.java) preferenceManagerModule = FakePreferenceModule(context) applicationDataManager = ApplicationDataManager(gPlayAPIRepository, pkgManagerModule, pwaManagerModule) appsApi = AppsApiImpl( context, preferenceManagerModule, gPlayAPIRepository, cleanApkAppsRepository, applicationDataManager, ) } @After fun after() { formatterMocked.close() } @Test fun `is any app updated when new list is empty`() { val oldAppList = mutableListOf<Application>( Application( _id = "111", status = Status.UNAVAILABLE, name = "Demo One", package_name = "foundation.e.demoone" ), Application( _id = "112", status = Status.INSTALLED, name = "Demo Two", package_name = "foundation.e.demotwo" ), Application( _id = "113", status = Status.UNAVAILABLE, name = "Demo Three", package_name = "foundation.e.demothree" ) ) val newAppList = mutableListOf<Application>() val isFusedAppUpdated = appsApi.isAnyFusedAppUpdated(newAppList, oldAppList) assertTrue("isAnyAppUpdated", isFusedAppUpdated) } @Test fun `is any app updated when both list are empty`() { val isFusedAppUpdated = appsApi.isAnyFusedAppUpdated(listOf(), listOf()) assertFalse("isAnyAppUpdated", isFusedAppUpdated) } @Test fun `is any app updated when any app is uninstalled`() { val oldAppList = mutableListOf<Application>( Application( _id = "111", status = Status.UNAVAILABLE, name = "Demo One", package_name = "foundation.e.demoone" ), Application( _id = "112", status = Status.INSTALLED, name = "Demo Two", package_name = "foundation.e.demotwo" ), Application( _id = "113", status = Status.UNAVAILABLE, name = "Demo Three", package_name = "foundation.e.demothree" ) ) val newAppList = mutableListOf<Application>( Application( _id = "111", status = Status.UNAVAILABLE, name = "Demo One", package_name = "foundation.e.demoone" ), Application( _id = "112", status = Status.UNAVAILABLE, name = "Demo Two", package_name = "foundation.e.demotwo" ), Application( _id = "113", status = Status.UNAVAILABLE, name = "Demo Three", package_name = "foundation.e.demothree" ) ) val isFusedAppUpdated = appsApi.isAnyFusedAppUpdated(newAppList, oldAppList) assertTrue("isAnyFusedAppUpdated", isFusedAppUpdated) } @Test fun `has any app install status changed when changed`() { val oldAppList = mutableListOf<Application>( Application( _id = "111", status = Status.UNAVAILABLE, name = "Demo One", package_name = "foundation.e.demoone", latest_version_code = 123 ), Application( _id = "112", status = Status.INSTALLED, name = "Demo Two", package_name = "foundation.e.demotwo", latest_version_code = 123 ), Application( _id = "113", status = Status.UNAVAILABLE, name = "Demo Three", package_name = "foundation.e.demothree", latest_version_code = 123 ) ) Mockito.`when`(pkgManagerModule.getPackageStatus(eq("foundation.e.demoone"), eq(123))) .thenReturn( Status.UNAVAILABLE ) Mockito.`when`(pkgManagerModule.getPackageStatus(eq("foundation.e.demotwo"), eq(123))) .thenReturn( Status.UNAVAILABLE ) Mockito.`when`(pkgManagerModule.getPackageStatus(eq("foundation.e.demothree"), eq(123))) .thenReturn( Status.UNAVAILABLE ) val isAppStatusUpdated = appsApi.isAnyAppInstallStatusChanged(oldAppList) assertTrue("hasInstallStatusUpdated", isAppStatusUpdated) } @Test fun `has any app install status changed when not changed`() { val oldAppList = mutableListOf<Application>( Application( _id = "111", status = Status.UNAVAILABLE, name = "Demo One", package_name = "foundation.e.demoone", latest_version_code = 123 ), Application( _id = "112", status = Status.INSTALLED, name = "Demo Two", package_name = "foundation.e.demotwo", latest_version_code = 123 ), Application( _id = "113", status = Status.UNAVAILABLE, name = "Demo Three", package_name = "foundation.e.demothree", latest_version_code = 123 ) ) Mockito.`when`(pkgManagerModule.getPackageStatus(eq("foundation.e.demoone"), eq(123))) .thenReturn( Status.UNAVAILABLE ) Mockito.`when`(pkgManagerModule.getPackageStatus(eq("foundation.e.demotwo"), eq(123))) .thenReturn( Status.INSTALLED ) Mockito.`when`(pkgManagerModule.getPackageStatus(eq("foundation.e.demothree"), eq(123))) .thenReturn( Status.UNAVAILABLE ) val isAppStatusUpdated = appsApi.isAnyAppInstallStatusChanged(oldAppList) assertFalse("hasInstallStatusUpdated", isAppStatusUpdated) } @Test fun `has any app install status changed when installation_issue`() { val oldAppList = mutableListOf<Application>( Application( _id = "111", status = Status.INSTALLATION_ISSUE, name = "Demo One", package_name = "foundation.e.demoone", latest_version_code = 123 ), Application( _id = "112", status = Status.INSTALLED, name = "Demo Two", package_name = "foundation.e.demotwo", latest_version_code = 123 ), Application( _id = "113", status = Status.UNAVAILABLE, name = "Demo Three", package_name = "foundation.e.demothree", latest_version_code = 123 ) ) Mockito.`when`(pkgManagerModule.getPackageStatus(eq("foundation.e.demoone"), eq(123))) .thenReturn( Status.UNAVAILABLE ) Mockito.`when`(pkgManagerModule.getPackageStatus(eq("foundation.e.demotwo"), eq(123))) .thenReturn( Status.INSTALLED ) Mockito.`when`(pkgManagerModule.getPackageStatus(eq("foundation.e.demothree"), eq(123))) .thenReturn( Status.UNAVAILABLE ) val isAppStatusUpdated = appsApi.isAnyAppInstallStatusChanged(oldAppList) assertFalse("hasInstallStatusUpdated", isAppStatusUpdated) } @Test fun getFusedAppInstallationStatusWhenPWA() { val application = Application( _id = "113", status = Status.UNAVAILABLE, name = "Demo Three", package_name = "foundation.e.demothree", latest_version_code = 123, is_pwa = true ) Mockito.`when`(pwaManagerModule.getPwaStatus(application)).thenReturn(application.status) val installationStatus = appsApi.getFusedAppInstallationStatus(application) assertEquals("getFusedAppInstallationStatusWhenPWA", application.status, installationStatus) } @Test fun getFusedAppInstallationStatus() { val application = Application( _id = "113", name = "Demo Three", package_name = "foundation.e.demothree", latest_version_code = 123, ) Mockito.`when`( pkgManagerModule.getPackageStatus( application.package_name, application.latest_version_code ) ).thenReturn(Status.INSTALLED) val installationStatus = appsApi.getFusedAppInstallationStatus(application) assertEquals("getFusedAppInstallationStatusWhenPWA", Status.INSTALLED, installationStatus) } @Test fun `getAppFilterLevel when package name is empty`() = runTest { val application = Application( _id = "113", name = "Demo Three", package_name = "", latest_version_code = 123, ) val filterLevel = appsApi.getAppFilterLevel(application, AUTH_DATA) assertEquals("getAppFilterLevel", FilterLevel.UNKNOWN, filterLevel) } @Test fun `getAppFilterLevel when app is CleanApk`() = runTest { val fusedApp = getFusedAppForFilterLevelTest() val filterLevel = appsApi.getAppFilterLevel(fusedApp, AUTH_DATA) assertEquals("getAppFilterLevel", FilterLevel.NONE, filterLevel) } private fun getFusedAppForFilterLevelTest(isFree: Boolean = true) = Application( _id = "113", name = "Demo Three", package_name = "foundation.e.demothree", latest_version_code = 123, origin = Origin.CLEANAPK, originalSize = -1, isFree = isFree, price = "" ) @Test fun `getAppFilterLevel when Authdata is NULL`() = runTest { val fusedApp = getFusedAppForFilterLevelTest() val filterLevel = appsApi.getAppFilterLevel(fusedApp, null) assertEquals("getAppFilterLevel", FilterLevel.NONE, filterLevel) } @Test fun `getAppFilterLevel when app is restricted and paid and no price`() = runTest { val fusedApp = getFusedAppForFilterLevelTest(false).apply { this.origin = Origin.GPLAY this.restriction = Constants.Restriction.UNKNOWN } val filterLevel = appsApi.getAppFilterLevel(fusedApp, AUTH_DATA) assertEquals("getAppFilterLevel", FilterLevel.UI, filterLevel) } @Test fun `getAppFilterLevel when app is not_restricted and paid and no price`() = runTest { val fusedApp = getFusedAppForFilterLevelTest(false).apply { this.origin = Origin.GPLAY this.restriction = Constants.Restriction.NOT_RESTRICTED } val filterLevel = appsApi.getAppFilterLevel(fusedApp, AUTH_DATA) assertEquals("getAppFilterLevel", FilterLevel.UI, filterLevel) } @Test fun `getAppFilterLevel when app is restricted and getAppDetails and getDownloadDetails returns success`() = runTest { val fusedApp = getFusedAppForFilterLevelTest().apply { this.origin = Origin.GPLAY this.restriction = Constants.Restriction.UNKNOWN } Mockito.`when`(gPlayAPIRepository.getAppDetails(fusedApp.package_name)) .thenReturn(App(fusedApp.package_name)) Mockito.`when`( gPlayAPIRepository.getDownloadInfo( fusedApp.package_name, fusedApp.latest_version_code, fusedApp.offer_type, ) ).thenReturn(listOf()) val filterLevel = appsApi.getAppFilterLevel(fusedApp, AUTH_DATA) assertEquals("getAppFilterLevel", FilterLevel.NONE, filterLevel) } @Test fun `getAppFilterLevel when app is restricted and getAppDetails throws exception`() = runTest { val fusedApp = getFusedAppForFilterLevelTest().apply { this.origin = Origin.GPLAY this.restriction = Constants.Restriction.UNKNOWN } Mockito.`when`(gPlayAPIRepository.getAppDetails(fusedApp.package_name)) .thenThrow(RuntimeException()) Mockito.`when`( gPlayAPIRepository.getDownloadInfo( fusedApp.package_name, fusedApp.latest_version_code, fusedApp.offer_type ) ).thenReturn(listOf()) val filterLevel = appsApi.getAppFilterLevel(fusedApp, AUTH_DATA) assertEquals("getAppFilterLevel", FilterLevel.DATA, filterLevel) } @Test fun `getAppFilterLevel when app is restricted and getDownoadInfo throws exception`() = runTest { val fusedApp = getFusedAppForFilterLevelTest().apply { this.origin = Origin.GPLAY this.restriction = Constants.Restriction.UNKNOWN } Mockito.`when`(gPlayAPIRepository.getAppDetails(fusedApp.package_name)) .thenReturn(App(fusedApp.package_name)) Mockito.`when`( gPlayAPIRepository.getDownloadInfo( fusedApp.package_name, fusedApp.latest_version_code, fusedApp.offer_type ) ).thenThrow(RuntimeException()) val filterLevel = appsApi.getAppFilterLevel(fusedApp, AUTH_DATA) assertEquals("getAppFilterLevel", FilterLevel.UI, filterLevel) } }
app/src/test/java/foundation/e/apps/fused/ApplicationApiImplTest.kt +22 −366 File changed.Preview size limit exceeded, changes collapsed. Show changes