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

Commit 1db4575f authored by Jonathan Klee's avatar Jonathan Klee
Browse files

refactor: extract data, domain & ui in separate modules

parent 54ae789e
Loading
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -8,3 +8,6 @@
.externalNativeBuild
.cxx
local.properties
data/build
domain/build
ui/build
+44 −15
Original line number Diff line number Diff line
@@ -161,26 +161,53 @@ android.applicationVariants.configureEach { variant ->
            html.required = true
        }

        def javaClasses = fileTree("${buildDir}/intermediates/javac/${variant.name}/classes") {
        def moduleProjects = [
                project(":app"),
                project(":data"),
                project(":domain"),
                project(":ui")
        ]

        moduleProjects.each { moduleProject ->
            def moduleTestTask = moduleProject.tasks.findByName(unitTestTaskName)
            if (moduleTestTask != null) {
                dependsOn(moduleTestTask)
            }
        }

        def classTrees = moduleProjects.collectMany { moduleProject ->
            def javaClasses = fileTree("${moduleProject.buildDir}/intermediates/javac/${variant.name}/classes") {
                exclude jacocoFileFilter
            }
        def kotlinClasses = fileTree("${buildDir}/tmp/kotlin-classes/${variant.name}") {
            def kotlinClasses = fileTree("${moduleProject.buildDir}/tmp/kotlin-classes/${variant.name}") {
                exclude jacocoFileFilter
            }
            [javaClasses, kotlinClasses]
        }

        classDirectories.from = files(javaClasses, kotlinClasses)
        classDirectories.from = files(classTrees)

        def sourceDirs = variant.sourceSets.collect { sourceSet ->
        def sourceDirs = moduleProjects.collectMany { moduleProject ->
            def androidExtension = moduleProject.extensions.findByName("android")
            if (androidExtension == null) {
                return []
            }
            androidExtension.sourceSets.collectMany { sourceSet ->
                def dirs = []
                dirs.addAll(sourceSet.java.srcDirs)
                if (sourceSet.hasProperty('kotlin')) {
                    dirs.addAll(sourceSet.kotlin.srcDirs)
                }
            return dirs
        }.flatten()
                dirs
            }
        }

        sourceDirectories.from = files(sourceDirs)
        executionData.from = file("${buildDir}/jacoco/${unitTestTaskName}.exec")

        def execFiles = moduleProjects.collect { moduleProject ->
            file("${moduleProject.buildDir}/jacoco/${unitTestTaskName}.exec")
        }
        executionData.from = files(execFiles)
    }
}

@@ -193,8 +220,8 @@ allOpen {
dependencies {

    // Project dependencies
    implementation(project(":auth-data-lib"))
    implementation(project(":parental-control-data"))
    implementation(project(":data"))
    implementation(project(":ui"))

    // eFoundation libraries
    implementation(libs.telemetry)
@@ -253,6 +280,8 @@ dependencies {
    // Testing dependencies
    testImplementation(libs.truth)
    testImplementation(libs.junit)
    testImplementation(project(":domain"))
    testImplementation(project(":parental-control-data"))
    androidTestImplementation(libs.ext.junit)
    androidTestImplementation(libs.espresso.core)
    testImplementation(libs.core)
+1 −1
Original line number Diff line number Diff line
@@ -29,7 +29,6 @@ import dagger.hilt.android.HiltAndroidApp
import foundation.e.apps.data.Constants.TAG_APP_INSTALL_STATE
import foundation.e.apps.data.Constants.TAG_AUTHDATA_DUMP
import foundation.e.apps.data.di.qualifiers.IoCoroutineScope
import foundation.e.apps.data.enums.Status
import foundation.e.apps.data.install.AppInstallDAO
import foundation.e.apps.data.install.pkg.AppLoungePackageManager
import foundation.e.apps.data.install.pkg.PkgManagerBR
@@ -38,6 +37,7 @@ import foundation.e.apps.data.install.workmanager.InstallWorkManager
import foundation.e.apps.data.preference.AppLoungeDataStore
import foundation.e.apps.data.preference.AppLoungePreference
import foundation.e.apps.data.system.CustomUncaughtExceptionHandler
import foundation.e.apps.domain.enums.Status
import foundation.e.apps.ui.setup.tos.TOS_VERSION
import foundation.e.lib.telemetry.Telemetry
import kotlinx.coroutines.CoroutineScope
+0 −30
Original line number Diff line number Diff line
package foundation.e.apps.data.enums

import com.google.common.truth.Truth.assertThat
import foundation.e.apps.R
import org.junit.Test

class SourceTest {

    @Test
    fun toStringUsesLocalizedResource() {
        val strings = mapOf(
            R.string.open_source to "Open Source",
            R.string.pwa to "PWA",
            R.string.system_app to "System app"
        )

        assertThat(Source.OPEN_SOURCE.toString(strings::getValue)).isEqualTo("Open Source")
        assertThat(Source.PWA.toString(strings::getValue)).isEqualTo("PWA")
        assertThat(Source.SYSTEM_APP.toString(strings::getValue)).isEqualTo("System app")
        assertThat(Source.PLAY_STORE.toString(strings::getValue)).isEqualTo("")
    }

    @Test
    fun fromStringParsesKnownResourceIds() {
        assertThat(Source.fromStringResId(R.string.open_source)).isEqualTo(Source.OPEN_SOURCE)
        assertThat(Source.fromStringResId(R.string.pwa)).isEqualTo(Source.PWA)
        assertThat(Source.fromStringResId(R.string.system_app)).isEqualTo(Source.SYSTEM_APP)
        assertThat(Source.fromStringResId(R.string.app_name)).isEqualTo(Source.PLAY_STORE)
    }
}
+0 −75
Original line number Diff line number Diff line
package foundation.e.apps.domain.login

import android.accounts.Account
import android.accounts.AccountManager
import android.app.Application
import android.os.Bundle
import com.google.common.truth.Truth.assertThat
import foundation.e.apps.data.login.microg.MicrogCertUtil
import foundation.e.apps.data.login.microg.MicrogLoginManager
import foundation.e.apps.data.login.playstore.OauthAuthDataBuilder
import foundation.e.apps.data.preference.AppLoungeDataStore
import kotlinx.coroutines.runBlocking
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.kotlin.any
import org.mockito.kotlin.eq
import org.mockito.kotlin.isNull
import org.mockito.kotlin.mock
import org.mockito.kotlin.whenever
import org.robolectric.RobolectricTestRunner
import org.robolectric.RuntimeEnvironment
import org.robolectric.annotation.Config
import java.util.concurrent.TimeUnit

@RunWith(RobolectricTestRunner::class)
@Config(sdk = [30])
class FetchMicrogAccountUseCaseTest {

    @Test
    fun invoke_returnsFetchResult() = runBlocking {
        val context: Application = RuntimeEnvironment.getApplication()
        val account = Account("user@gmail.com", MicrogCertUtil.GOOGLE_ACCOUNT_TYPE)
        val accountManager = mock<AccountManager>()
        whenever(accountManager.getAccountsByType(eq(MicrogCertUtil.GOOGLE_ACCOUNT_TYPE)))
            .thenReturn(arrayOf(account))
        whenever(
            accountManager.getAuthToken(
                eq(account),
                eq(MicrogCertUtil.PLAY_AUTH_SCOPE),
                any<Bundle>(),
                eq(false),
                isNull(),
                isNull()
            )
        ).thenReturn(ImmediateAccountManagerFuture(Bundle().apply {
            putString(AccountManager.KEY_AUTHTOKEN, "token123")
        }))
        val oauthAuthDataBuilder = mock<OauthAuthDataBuilder>()
        val appLoungeDataStore = mock<AppLoungeDataStore>()
        val microgAccountManager = MicrogLoginManager(
            context,
            accountManager,
            oauthAuthDataBuilder,
            appLoungeDataStore
        )
        val useCase = FetchMicrogAccountUseCase(microgAccountManager)

        val response = useCase(account.name)

        assertThat(response).isInstanceOf(MicrogLoginManager.FetchResult.Success::class.java)
        val success = response as MicrogLoginManager.FetchResult.Success
        assertThat(success.microgAccount.oauthToken).isEqualTo("token123")
        assertThat(success.microgAccount.account.name).isEqualTo(account.name)
    }

    private class ImmediateAccountManagerFuture(
        private val bundle: Bundle
    ) : android.accounts.AccountManagerFuture<Bundle> {
        override fun cancel(mayInterruptIfRunning: Boolean): Boolean = false
        override fun isCancelled(): Boolean = false
        override fun isDone(): Boolean = true
        override fun getResult(): Bundle = bundle
        override fun getResult(timeout: Long, unit: TimeUnit): Bundle = bundle
    }
}
Loading