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

Commit 23cc1506 authored by dev-12's avatar dev-12
Browse files

test: expend coverage for `waitForTaskCompletion`

parent 99eb645c
Loading
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -162,7 +162,8 @@ class AppInstallProcessor @Inject constructor(
        }
    }

    private suspend fun waitForTaskCompletionOrCancelOnTimeout(
    @VisibleForTesting
    suspend fun waitForTaskCompletionOrCancelOnTimeout(
        workManager: WorkManager = WorkManager.getInstance(context),
        timeout: Duration = INSTALL_TASK_TIMEOUT,
        workId: UUID
+69 −0
Original line number Diff line number Diff line
@@ -23,6 +23,8 @@ import android.net.ConnectivityManager
import android.net.Network
import android.net.NetworkCapabilities
import androidx.arch.core.executor.testing.InstantTaskExecutorRule
import androidx.work.WorkInfo
import androidx.work.WorkManager
import foundation.e.apps.data.ResultSupreme
import foundation.e.apps.data.enums.Status
import foundation.e.apps.data.fdroid.FDroidRepository
@@ -42,10 +44,14 @@ import foundation.e.apps.utils.StorageComputer
import foundation.e.apps.util.MainCoroutineRule
import io.mockk.coEvery
import io.mockk.coVerify
import io.mockk.every
import io.mockk.mockk
import io.mockk.mockkObject
import io.mockk.unmockkObject
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.awaitCancellation
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.test.runTest
import org.junit.Assert.assertEquals
import org.junit.Assert.assertTrue
@@ -57,6 +63,9 @@ import org.mockito.Mockito
import org.mockito.MockitoAnnotations
import org.mockito.kotlin.mock
import org.mockito.kotlin.whenever
import java.time.Duration
import java.util.UUID
import io.mockk.verify

@OptIn(ExperimentalCoroutinesApi::class)
class AppInstallProcessorTest {
@@ -370,6 +379,66 @@ class AppInstallProcessorTest {
        }
    }

    @Test
    fun waitForTaskCompletionOrCancelOnTimeout_returnsTrueWhenWorkSucceeds() = runTest {
        val workManager = mockk<WorkManager>()
        val workId = UUID.randomUUID()
        val workInfo = mockk<WorkInfo>()

        every { workInfo.state } returns WorkInfo.State.SUCCEEDED
        every { workManager.getWorkInfoByIdFlow(workId) } returns flowOf(workInfo)

        val result = appInstallProcessor.waitForTaskCompletionOrCancelOnTimeout(
            workManager = workManager,
            timeout = Duration.ofMillis(100),
            workId = workId
        )

        assertTrue(result)
        verify(exactly = 0) { workManager.cancelWorkById(workId) }
    }

    @Test
    fun waitForTaskCompletionOrCancelOnTimeout_returnsFalseWhenWorkFailed() = runTest {
        val workManager = mockk<WorkManager>()
        val workId = UUID.randomUUID()
        val workInfo = mockk<WorkInfo>()

        every { workInfo.state } returns WorkInfo.State.FAILED
        every { workManager.getWorkInfoByIdFlow(workId) } returns flowOf(workInfo)

        val result = appInstallProcessor.waitForTaskCompletionOrCancelOnTimeout(
            workManager = workManager,
            timeout = Duration.ofMillis(100),
            workId = workId
        )

        assertEquals(false, result)
        verify(exactly = 0) { workManager.cancelWorkById(workId) }
    }

    @Test
    fun waitForTaskCompletionOrCancelOnTimeout_cancelsWorkOnTimeout() = runTest {
        val workManager = mockk<WorkManager>(relaxed = true)
        val workId = UUID.randomUUID()
        val workInfo = mockk<WorkInfo>()

        every { workInfo.state } returns WorkInfo.State.RUNNING
        every { workManager.getWorkInfoByIdFlow(workId) } returns flow {
            emit(workInfo)
            awaitCancellation()
        }

        val result = appInstallProcessor.waitForTaskCompletionOrCancelOnTimeout(
            workManager = workManager,
            timeout = Duration.ofMillis(1),
            workId = workId
        )

        assertEquals(false, result)
        verify { workManager.cancelWorkById(workId) }
    }

    private suspend fun runProcessInstall(appInstall: AppInstall): AppInstall? {
        appInstallProcessor.processInstall(appInstall.id, false) {
            // _ignored_