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

Commit 12e3f609 authored by Abhishek Aggarwal's avatar Abhishek Aggarwal
Browse files

login: Depreceate AppLoginRepository and move its code to usecases

parent e14aba82
Loading
Loading
Loading
Loading
+5 −5
Original line number Diff line number Diff line
@@ -22,9 +22,9 @@ import dagger.Module
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import foundation.e.apps.data.login.microg.MicrogLoginManager
import foundation.e.apps.data.login.repository.AppLoginRepository
import foundation.e.apps.data.login.repository.AuthenticatorRepository
import foundation.e.apps.domain.login.LoginRepository
import foundation.e.apps.data.login.repository.OkHttpLoginCacheRepository
import foundation.e.apps.domain.login.LoginCacheRepository
import foundation.e.apps.login.MicrogAccountFetcher
import foundation.e.apps.login.PlayStoreAuthManager
import foundation.e.apps.login.StoreAuthCoordinator
@@ -36,9 +36,9 @@ interface LoginBindingModule {

    @Binds
    @Singleton
    fun bindLoginRepository(
        appLoginRepository: AppLoginRepository,
    ): LoginRepository
    fun bindLoginCacheRepository(
        okHttpLoginCacheRepository: OkHttpLoginCacheRepository,
    ): LoginCacheRepository

    @Binds
    @Singleton
+7 −0
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ import foundation.e.apps.data.preference.AppLoungePreference
import foundation.e.apps.data.preference.PlayStoreAuthStore
import foundation.e.apps.data.preference.SessionDataStore
import foundation.e.apps.data.preference.updateinterval.UpdatePreferencesRepositoryImpl
import foundation.e.apps.domain.login.PlayStoreCredentialsRepository
import foundation.e.apps.domain.preferences.AppPreferencesRepository
import foundation.e.apps.domain.preferences.SessionRepository
import foundation.e.apps.domain.preferences.updateinterval.UpdatePreferencesRepository
@@ -58,4 +59,10 @@ interface PreferenceBindingModule {
    fun bindPlayStoreAuthStore(
        sessionDataStore: SessionDataStore
    ): PlayStoreAuthStore

    @Binds
    @Singleton
    fun bindPlayStoreCredentialsRepository(
        sessionDataStore: SessionDataStore
    ): PlayStoreCredentialsRepository
}
+32 −0
Original line number Diff line number Diff line
@@ -17,57 +17,16 @@

package foundation.e.apps.data.login.repository

import foundation.e.apps.data.Stores
import foundation.e.apps.data.enums.Source
import foundation.e.apps.data.preference.PlayStoreAuthStore
import foundation.e.apps.domain.login.LoginRepository
import foundation.e.apps.domain.model.PlayStoreAuthSource
import foundation.e.apps.domain.model.User
import foundation.e.apps.domain.preferences.SessionRepository
import foundation.e.apps.domain.login.LoginCacheRepository
import okhttp3.Cache
import javax.inject.Inject
import javax.inject.Singleton

@Singleton
class AppLoginRepository @Inject constructor(
    private val stores: Stores,
    private val sessionRepository: SessionRepository,
    private val playStoreAuthStore: PlayStoreAuthStore,
class OkHttpLoginCacheRepository @Inject constructor(
    private val cache: Cache,
) : LoginRepository {

    override suspend fun initializeAnonymousLogin() {
        stores.enableStore(Source.PLAY_STORE)
        sessionRepository.saveUserType(User.ANONYMOUS)
    }

    override suspend fun initializeGoogleLogin(
        email: String,
        oauthToken: String,
        authSource: PlayStoreAuthSource,
    ) {
        stores.enableStore(Source.PLAY_STORE)
        playStoreAuthStore.saveGoogleLogin(email, oauthToken)
        playStoreAuthStore.savePlayStoreAuthSource(authSource)
        if (authSource == PlayStoreAuthSource.MICROG) {
            playStoreAuthStore.saveAasToken("")
        }
        sessionRepository.saveUserType(User.GOOGLE)
    }

    override suspend fun initializeNoGoogleLogin() {
        stores.disableStore(Source.PLAY_STORE)
        stores.enableStore(Source.OPEN_SOURCE)
        stores.enableStore(Source.PWA)
        sessionRepository.saveUserType(User.NO_GOOGLE)
    }

    override suspend fun logout() {
) : LoginCacheRepository {
    override fun clear() {
        cache.evictAll()
        playStoreAuthStore.destroyCredentials()
        sessionRepository.saveUserType(null)
        stores.enableStore(Source.OPEN_SOURCE)
        stores.enableStore(Source.PWA)
        stores.enableStore(Source.PLAY_STORE)
    }
}
+0 −94
Original line number Diff line number Diff line
package foundation.e.apps.data.login.repository

import foundation.e.apps.data.Stores
import foundation.e.apps.data.enums.Source
import foundation.e.apps.data.preference.PlayStoreAuthStore
import foundation.e.apps.domain.model.PlayStoreAuthSource
import foundation.e.apps.domain.model.User
import foundation.e.apps.domain.preferences.SessionRepository
import kotlinx.coroutines.test.runTest
import okhttp3.Cache
import org.junit.Test
import org.mockito.kotlin.any
import org.mockito.kotlin.mock
import org.mockito.kotlin.never
import org.mockito.kotlin.verify
import org.mockito.kotlin.verifyNoInteractions

class AppLoginRepositoryTest {

    private val stores: Stores = mock()
    private val sessionRepository: SessionRepository = mock()
    private val playStoreAuthStore: PlayStoreAuthStore = mock()
    private val cache: Cache = mock()

    private val repository = AppLoginRepository(
        stores = stores,
        sessionRepository = sessionRepository,
        playStoreAuthStore = playStoreAuthStore,
        cache = cache,
    )

    @Test
    fun initializeAnonymousLogin_enablesPlayStoreAndSavesAnonymousUser() = runTest {
        repository.initializeAnonymousLogin()

        verify(stores).enableStore(Source.PLAY_STORE)
        verify(sessionRepository).saveUserType(User.ANONYMOUS)
        verifyNoInteractions(playStoreAuthStore, cache)
    }

    @Test
    fun initializeGoogleLogin_persistsGoogleCredentials() = runTest {
        repository.initializeGoogleLogin(
            email = "email",
            oauthToken = "oauth",
            authSource = PlayStoreAuthSource.GOOGLE,
        )

        verify(stores).enableStore(Source.PLAY_STORE)
        verify(playStoreAuthStore).saveGoogleLogin("email", "oauth")
        verify(playStoreAuthStore).savePlayStoreAuthSource(PlayStoreAuthSource.GOOGLE)
        verify(playStoreAuthStore, never()).saveAasToken(any<String>())
        verify(sessionRepository).saveUserType(User.GOOGLE)
        verifyNoInteractions(cache)
    }

    @Test
    fun initializeGoogleLogin_clearsAasTokenForMicrog() = runTest {
        repository.initializeGoogleLogin(
            email = "email",
            oauthToken = "oauth",
            authSource = PlayStoreAuthSource.MICROG,
        )

        verify(stores).enableStore(Source.PLAY_STORE)
        verify(playStoreAuthStore).saveGoogleLogin("email", "oauth")
        verify(playStoreAuthStore).savePlayStoreAuthSource(PlayStoreAuthSource.MICROG)
        verify(playStoreAuthStore).saveAasToken("")
        verify(sessionRepository).saveUserType(User.GOOGLE)
    }

    @Test
    fun initializeNoGoogleLogin_disablesPlayStoreAndEnablesOtherSources() = runTest {
        repository.initializeNoGoogleLogin()

        verify(stores).disableStore(Source.PLAY_STORE)
        verify(stores).enableStore(Source.OPEN_SOURCE)
        verify(stores).enableStore(Source.PWA)
        verify(sessionRepository).saveUserType(User.NO_GOOGLE)
        verifyNoInteractions(playStoreAuthStore, cache)
    }

    @Test
    fun logout_clearsSessionAndResetsEnabledSources() = runTest {
        repository.logout()

        verify(cache).evictAll()
        verify(playStoreAuthStore).destroyCredentials()
        verify(sessionRepository).saveUserType(null as User?)
        verify(stores).enableStore(Source.OPEN_SOURCE)
        verify(stores).enableStore(Source.PWA)
        verify(stores).enableStore(Source.PLAY_STORE)
    }
}
+19 −0
Original line number Diff line number Diff line
package foundation.e.apps.data.login.repository

import okhttp3.Cache
import org.junit.Test
import org.mockito.kotlin.mock
import org.mockito.kotlin.verify

class OkHttpLoginCacheRepositoryTest {

    private val cache: Cache = mock()
    private val repository = OkHttpLoginCacheRepository(cache)

    @Test
    fun clear_evictsUnderlyingCache() {
        repository.clear()

        verify(cache).evictAll()
    }
}
Loading