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

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

test: add coverage for login refactor

parent d43c1365
Loading
Loading
Loading
Loading
+0 −45
Original line number Diff line number Diff line
package foundation.e.apps.data.login.state

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 loginPreferencesManager: LoginPreferencesManager = LoginPreferencesManager(preference)
    private val loginCoordinator: LoginCoordinator = LoginCoordinator(dataStore, loginPreferencesManager)

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

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

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

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

    @Test
    fun logout_clearsCredentialsAndResetsSources() = runTest {
        loginCoordinator.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() }
    }
}
+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)
    }
}
+50 −0
Original line number Diff line number Diff line
package foundation.e.apps.data.login.playstore

import com.aurora.gplayapi.data.models.PlayResponse
import com.google.common.truth.Truth.assertThat
import foundation.e.apps.data.ResultSupreme
import foundation.e.apps.data.enums.User
import foundation.e.apps.data.login.exceptions.GPlayLoginException
import io.mockk.coEvery
import io.mockk.mockk
import kotlinx.coroutines.test.runTest
import org.junit.Test

class OauthToAasTokenConverterTest {

    private val googleLoginManager: GoogleLoginManager = mockk()
    private val aasTokenExchange = OauthToAasTokenConverter()

    @Test
    fun fetch_returnsTokenWhenResponseIsSuccessful() = runTest {
        val response = PlayResponse(
            responseBytes = "Token=aas-token".toByteArray(),
            isSuccessful = true,
            errorString = "No Error"
        )
        coEvery { googleLoginManager.getAC2DMResponse("email", "oauth") } returns response

        val result = aasTokenExchange.fetch(googleLoginManager, "email", "oauth")

        assertThat(result).isInstanceOf(ResultSupreme.Success::class.java)
        assertThat(result.data).isEqualTo("aas-token")
        assertThat(result.exception).isNull()
    }

    @Test
    fun fetch_setsGPlayLoginExceptionOnError() = runTest {
        val response = PlayResponse(
            responseBytes = byteArrayOf(),
            isSuccessful = false,
            errorString = "Bad request"
        )
        coEvery { googleLoginManager.getAC2DMResponse("email", "oauth") } returns response

        val result = aasTokenExchange.fetch(googleLoginManager, "email", "oauth")

        assertThat(result).isInstanceOf(ResultSupreme.Error::class.java)
        val exception = result.exception as GPlayLoginException
        assertThat(exception.user).isEqualTo(User.GOOGLE)
        assertThat(exception.isTimeout).isFalse()
    }
}
+48 −0
Original line number Diff line number Diff line
package foundation.e.apps.data.login.playstore

import com.aurora.gplayapi.data.models.AuthData
import com.google.common.truth.Truth.assertThat
import foundation.e.apps.data.enums.User
import foundation.e.apps.data.login.api.LoginManager
import foundation.e.apps.data.preference.AppLoungeDataStore
import io.mockk.mockk
import org.junit.Test
import java.util.Locale

class PlayStoreAuthDataProviderFactoryTest {

    private val appLoungeDataStore: AppLoungeDataStore = mockk()
    private val authDataCache: AuthDataCache = mockk()
    private val googleLoginManager: GoogleLoginManager = mockk()
    private val aasTokenExchange: OauthToAasTokenConverter = mockk()
    private val loginManager: LoginManager<AuthData?> = mockk()
    private val session = PlayStoreSession(loginManager, User.GOOGLE, Locale.US)

    private val factory = PlayStoreAuthDataProviderFactory(
        appLoungeDataStore = appLoungeDataStore,
        authDataCache = authDataCache,
        googleLoginManager = googleLoginManager,
        aasTokenExchange = aasTokenExchange
    )

    @Test
    fun create_returnsAnonymousProviderForAnonymousUser() {
        val provider = factory.create(User.ANONYMOUS, session)

        assertThat(provider).isInstanceOf(AnonymousAuthDataProvider::class.java)
    }

    @Test
    fun create_returnsGoogleProviderForGoogleUser() {
        val provider = factory.create(User.GOOGLE, session)

        assertThat(provider).isInstanceOf(GoogleAuthDataProvider::class.java)
    }

    @Test
    fun create_returnsNullForNoGoogleUser() {
        val provider = factory.create(User.NO_GOOGLE, session)

        assertThat(provider).isNull()
    }
}
Loading