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

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

test: add coverage for login refactor

parent a12894be
Loading
Loading
Loading
Loading
Loading
+0 −44
Original line number Diff line number Diff line
package foundation.e.apps.data.login

import foundation.e.apps.data.enums.User
import foundation.e.apps.data.preference.AppLoungeDataStore
import foundation.e.apps.data.preference.AppLoungePreference
import io.mockk.coVerify
import io.mockk.mockk
import kotlinx.coroutines.test.runTest
import org.junit.Test

class LoginCommonTest {

    private val dataStore: AppLoungeDataStore = mockk(relaxed = true)
    private val preference: AppLoungePreference = mockk(relaxed = true)
    private val loginCommon = LoginCommon(dataStore, preference)

    @Test
    fun saveUserType_delegatesToDataStore() = runTest {
        loginCommon.saveUserType(User.ANONYMOUS)

        coVerify { dataStore.saveUserType(User.ANONYMOUS) }
    }

    @Test
    fun setNoGoogleMode_updatesPreferencesAndUser() = runTest {
        loginCommon.setNoGoogleMode()

        coVerify { preference.disablePlayStore() }
        coVerify { preference.enableOpenSource() }
        coVerify { preference.enablePwa() }
        coVerify { dataStore.saveUserType(User.NO_GOOGLE) }
    }

    @Test
    fun logout_clearsCredentialsAndResetsSources() = runTest {
        loginCommon.logout()

        coVerify { dataStore.destroyCredentials() }
        coVerify { dataStore.saveUserType(null) }
        coVerify { preference.enableOpenSource() }
        coVerify { preference.enablePwa() }
        coVerify { preference.enablePlayStore() }
    }
}
+31 −0
Original line number Diff line number Diff line
package foundation.e.apps.data.login

import foundation.e.apps.data.login.state.LoginPreferencesManager
import foundation.e.apps.data.preference.AppLoungePreference
import io.mockk.mockk
import io.mockk.verify
import org.junit.Test

class LoginPreferencesManagerTest {

    private val preference: AppLoungePreference = mockk(relaxed = true)
    private val manager = LoginPreferencesManager(preference)

    @Test
    fun applyNoGoogleMode_updatesPreferences() {
        manager.applyNoGoogleMode()

        verify { preference.disablePlayStore() }
        verify { preference.enableOpenSource() }
        verify { preference.enablePwa() }
    }

    @Test
    fun resetAfterLogout_resetsPreferences() {
        manager.resetAfterLogout()

        verify { preference.enableOpenSource() }
        verify { preference.enablePwa() }
        verify { preference.enablePlayStore() }
    }
}
+9 −10
Original line number Diff line number Diff line
@@ -24,9 +24,8 @@ import android.accounts.AccountManagerFuture
import android.app.Application
import android.content.Intent
import android.os.Bundle
import foundation.e.apps.data.login.microg.MicrogAccountFetchResult
import foundation.e.apps.data.login.microg.MicrogAccountManager
import foundation.e.apps.data.login.microg.MicrogCertUtil
import foundation.e.apps.data.login.playstore.MicrogAccountManager
import java.util.concurrent.TimeUnit
import kotlinx.coroutines.runBlocking
import org.junit.Assert.assertEquals
@@ -72,8 +71,8 @@ class MicrogAccountManagerTest {

        val result = MicrogAccountManager(context, accountManager).fetchMicrogAccount()

        assertTrue(result is MicrogAccountFetchResult.Success)
        val success = result as MicrogAccountFetchResult.Success
        assertTrue(result is MicrogAccountManager.FetchResult.Success)
        val success = result as MicrogAccountManager.FetchResult.Success
        assertEquals("token123", success.microgAccount.oauthToken)
        assertEquals(account.name, success.microgAccount.account.name)
    }
@@ -86,7 +85,7 @@ class MicrogAccountManagerTest {

        val result = MicrogAccountManager(context, accountManager).fetchMicrogAccount()

        assertTrue(result is MicrogAccountFetchResult.Error)
        assertTrue(result is MicrogAccountManager.FetchResult.Error)
    }

    @Test
@@ -108,7 +107,7 @@ class MicrogAccountManagerTest {

        val result = MicrogAccountManager(context, accountManager).fetchMicrogAccount()

        assertTrue(result is MicrogAccountFetchResult.Error)
        assertTrue(result is MicrogAccountManager.FetchResult.Error)
    }

    @Test
@@ -165,11 +164,11 @@ class MicrogAccountManagerTest {

        val result = MicrogAccountManager(context, accountManager).fetchMicrogAccount()

        if (result is MicrogAccountFetchResult.Error) {
        if (result is MicrogAccountManager.FetchResult.Error) {
            throw AssertionError(result.throwable)
        }
        assertTrue(result is MicrogAccountFetchResult.RequiresUserAction)
        val requiresUserAction = result as MicrogAccountFetchResult.RequiresUserAction
        assertTrue(result is MicrogAccountManager.FetchResult.RequiresUserAction)
        val requiresUserAction = result as MicrogAccountManager.FetchResult.RequiresUserAction
        assertEquals(intent, requiresUserAction.intent)
    }

@@ -192,7 +191,7 @@ class MicrogAccountManagerTest {

        val result = MicrogAccountManager(context, accountManager).fetchMicrogAccount()

        assertTrue(result is MicrogAccountFetchResult.Error)
        assertTrue(result is MicrogAccountManager.FetchResult.Error)
    }

    private class ImmediateAccountManagerFuture(
+5 −5
Original line number Diff line number Diff line
@@ -20,9 +20,9 @@ package foundation.e.apps.data.login

import android.accounts.Account
import android.content.Intent
import foundation.e.apps.data.login.microg.MicrogAccount
import foundation.e.apps.data.login.microg.MicrogAccountFetchResult
import foundation.e.apps.data.login.microg.MicrogCertUtil
import foundation.e.apps.data.login.playstore.MicrogAccount
import foundation.e.apps.data.login.playstore.MicrogAccountManager
import org.junit.Assert.assertEquals
import org.junit.Assert.assertSame
import org.junit.Test
@@ -50,7 +50,7 @@ class MicrogAccountModelsTest {
        val account = Account("user@gmail.com", MicrogCertUtil.GOOGLE_ACCOUNT_TYPE)
        val microgAccount = MicrogAccount(account, "token")

        val result = MicrogAccountFetchResult.Success(microgAccount)
        val result = MicrogAccountManager.FetchResult.Success(microgAccount)

        assertSame(microgAccount, result.microgAccount)
    }
@@ -59,7 +59,7 @@ class MicrogAccountModelsTest {
    fun `microg account fetch result exposes requires user action intent`() {
        val intent = Intent("foundation.e.apps.ACTION_LOGIN")

        val result = MicrogAccountFetchResult.RequiresUserAction(intent)
        val result = MicrogAccountManager.FetchResult.RequiresUserAction(intent)

        assertSame(intent, result.intent)
    }
@@ -68,7 +68,7 @@ class MicrogAccountModelsTest {
    fun `microg account fetch result exposes error throwable`() {
        val error = IllegalStateException("boom")

        val result = MicrogAccountFetchResult.Error(error)
        val result = MicrogAccountManager.FetchResult.Error(error)

        assertSame(error, result.throwable)
    }
+167 −0
Original line number Diff line number Diff line
package foundation.e.apps.data.login.playstore

import com.aurora.gplayapi.data.models.AuthData
import foundation.e.apps.data.ResultSupreme
import foundation.e.apps.data.login.playstore.GoogleLoginManager
import foundation.e.apps.data.preference.AppLoungeDataStore
import io.mockk.coEvery
import io.mockk.coVerify
import io.mockk.every
import io.mockk.mockk
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.test.runTest
import org.junit.Test
import com.google.common.truth.Truth.assertThat

class AuthDataProvidersTest {

    private val appLoungeDataStore: AppLoungeDataStore = mockk(relaxed = true)

    @Test
    fun googleAasAuthDataProvider_fetchesWhenAasTokenExists() = runTest {
        val authData = AuthData("email", "token")
        val result: ResultSupreme<AuthData?> = ResultSupreme.Success(authData)
        every { appLoungeDataStore.aasToken } returns flowOf("aas")

        val provider = GoogleAasAuthDataProvider(
            appLoungeDataStore = appLoungeDataStore,
            loginProvider = { result }
        )

        assertThat(provider.fetch()).isSameInstanceAs(result)
    }

    @Test
    fun googleAasAuthDataProvider_returnsErrorWhenAasTokenMissing() = runTest {
        every { appLoungeDataStore.aasToken } returns flowOf("")

        val provider = GoogleAasAuthDataProvider(
            appLoungeDataStore = appLoungeDataStore,
            loginProvider = { error("login should not be called") }
        )

        val result = provider.fetch()
        assertThat(result).isInstanceOf(ResultSupreme.Error::class.java)
        assertThat(result.message).isEqualTo("AAS token is missing")
    }

    @Test
    fun googleOauthAuthDataProvider_usesFallbackWhenAasFetchFails() = runTest {
        val authData = AuthData("email", "token")
        val formattedAuthData = AuthData("email", "formatted")
        val googleLoginManager: GoogleLoginManager = mockk()
        every { appLoungeDataStore.emailData } returns flowOf("email")
        every { appLoungeDataStore.oauthToken } returns flowOf("oauth")
        coEvery { googleLoginManager.buildAuthDataFromOauthToken("oauth") } returns authData

        val provider = GoogleOauthAuthDataProvider(
            appLoungeDataStore = appLoungeDataStore,
            loginProvider = { error("login should not be called") },
            googleLoginManager = googleLoginManager,
            aasTokenProvider = { _, _, _ -> ResultSupreme.Error("fail") },
            formatter = { formattedAuthData }
        )

        val result = provider.fetch()
        assertThat(result).isInstanceOf(ResultSupreme.Success::class.java)
        assertThat(result.data).isSameInstanceAs(formattedAuthData)
    }

    @Test
    fun googleOauthAuthDataProvider_returnsErrorWhenAasTokenBlank() = runTest {
        every { appLoungeDataStore.emailData } returns flowOf("email")
        every { appLoungeDataStore.oauthToken } returns flowOf("oauth")

        val provider = GoogleOauthAuthDataProvider(
            appLoungeDataStore = appLoungeDataStore,
            loginProvider = { error("login should not be called") },
            googleLoginManager = mockk(),
            aasTokenProvider = { _, _, _ -> ResultSupreme.Success("") },
            formatter = { it }
        )

        val result = provider.fetch()
        assertThat(result).isInstanceOf(ResultSupreme.Error::class.java)
        assertThat(result.message).isEqualTo("Fetched AAS Token is blank")
    }

    @Test
    fun googleOauthAuthDataProvider_savesAasTokenAndFetchesAuthData() = runTest {
        val authData = AuthData("email", "token")
        val formattedAuthData = AuthData("email", "formatted")
        every { appLoungeDataStore.emailData } returns flowOf("email")
        every { appLoungeDataStore.oauthToken } returns flowOf("oauth")
        coEvery { appLoungeDataStore.saveAasToken("aas") } returns Unit

        val provider = GoogleOauthAuthDataProvider(
            appLoungeDataStore = appLoungeDataStore,
            loginProvider = { ResultSupreme.Success(authData) },
            googleLoginManager = mockk(),
            aasTokenProvider = { _, _, _ -> ResultSupreme.Success("aas") },
            formatter = { formattedAuthData }
        )

        val result = provider.fetch()
        assertThat(result).isInstanceOf(ResultSupreme.Success::class.java)
        assertThat(result.data).isSameInstanceAs(formattedAuthData)
        coVerify { appLoungeDataStore.saveAasToken("aas") }
    }

    @Test
    fun googleAuthDataProvider_usesAasProviderWhenTokenExists() = runTest {
        var aasCalls = 0
        var oauthCalls = 0
        val aasProvider: AuthDataProvider = object : AuthDataProvider {
            override suspend fun fetch(): ResultSupreme<AuthData?> {
                aasCalls++
                return ResultSupreme.Success(null)
            }
        }
        val oauthProvider: AuthDataProvider = object : AuthDataProvider {
            override suspend fun fetch(): ResultSupreme<AuthData?> {
                oauthCalls++
                return ResultSupreme.Success(null)
            }
        }
        every { appLoungeDataStore.aasToken } returns flowOf("aas")

        val provider = GoogleAuthDataProvider(
            appLoungeDataStore = appLoungeDataStore,
            aasProvider = aasProvider,
            oauthProvider = oauthProvider
        )

        provider.fetch()
        assertThat(aasCalls).isEqualTo(1)
        assertThat(oauthCalls).isEqualTo(0)
    }

    @Test
    fun googleAuthDataProvider_usesOauthProviderWhenTokenMissing() = runTest {
        var aasCalls = 0
        var oauthCalls = 0
        val aasProvider: AuthDataProvider = object : AuthDataProvider {
            override suspend fun fetch(): ResultSupreme<AuthData?> {
                aasCalls++
                return ResultSupreme.Success(null)
            }
        }
        val oauthProvider: AuthDataProvider = object : AuthDataProvider {
            override suspend fun fetch(): ResultSupreme<AuthData?> {
                oauthCalls++
                return ResultSupreme.Success(null)
            }
        }
        every { appLoungeDataStore.aasToken } returns flowOf("")

        val provider = GoogleAuthDataProvider(
            appLoungeDataStore = appLoungeDataStore,
            aasProvider = aasProvider,
            oauthProvider = oauthProvider
        )

        provider.fetch()
        assertThat(oauthCalls).isEqualTo(1)
        assertThat(aasCalls).isEqualTo(0)
    }
}
Loading