From c5e216783e61dcc37c28bdc896bace516c4740c7 Mon Sep 17 00:00:00 2001 From: Patrick Honkonen <1883101+SaintPatrck@users.noreply.github.com> Date: Mon, 7 Apr 2025 17:58:39 -0400 Subject: [PATCH] [PM-19948] Migrate ServerConfigRepository to data module (#5002) --- .../manager/FeatureFlagManagerImpl.kt | 2 +- .../manager/di/PlatformManagerModule.kt | 2 +- .../network/NetworkConfigManagerImpl.kt | 2 +- .../repository/DebugMenuRepositoryImpl.kt | 1 + .../repository/di/PlatformRepositoryModule.kt | 21 +-- .../network/NetworkConfigManagerTest.kt | 2 +- .../repository/DebugMenuRepositoryTest.kt | 1 + .../util/FakeServerConfigRepository.kt | 2 +- .../bitwarden/authenticator/MainViewModel.kt | 2 +- .../manager/FeatureFlagManagerImpl.kt | 2 +- .../manager/di/PlatformManagerModule.kt | 2 +- .../repository/DebugMenuRepositoryImpl.kt | 1 + .../repository/ServerConfigRepository.kt | 21 --- .../repository/ServerConfigRepositoryImpl.kt | 65 ------- .../repository/di/PlatformRepositoryModule.kt | 21 +-- .../repository/DebugMenuRepositoryTest.kt | 1 + .../repository/ServerConfigRepositoryTest.kt | 169 ------------------ .../util/FakeServerConfigRepository.kt | 2 +- data/build.gradle.kts | 1 + .../repository/ServerConfigRepository.kt | 2 +- .../repository/ServerConfigRepositoryImpl.kt | 4 +- .../data/repository/di/RepositoryModule.kt | 36 ++++ .../repository/ServerConfigRepositoryTest.kt | 2 +- 23 files changed, 56 insertions(+), 308 deletions(-) delete mode 100644 authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/repository/ServerConfigRepository.kt delete mode 100644 authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/repository/ServerConfigRepositoryImpl.kt delete mode 100644 authenticator/src/test/java/com/bitwarden/authenticator/data/platform/repository/ServerConfigRepositoryTest.kt rename {app/src/main/java/com/x8bit/bitwarden/data/platform => data/src/main/kotlin/com/bitwarden/data}/repository/ServerConfigRepository.kt (91%) rename {app/src/main/java/com/x8bit/bitwarden/data/platform => data/src/main/kotlin/com/bitwarden/data}/repository/ServerConfigRepositoryImpl.kt (96%) create mode 100644 data/src/main/kotlin/com/bitwarden/data/repository/di/RepositoryModule.kt rename {app/src/test/java/com/x8bit/bitwarden/data/platform => data/src/test/kotlin/com/bitwarden/data}/repository/ServerConfigRepositoryTest.kt (99%) diff --git a/app/src/main/java/com/x8bit/bitwarden/data/platform/manager/FeatureFlagManagerImpl.kt b/app/src/main/java/com/x8bit/bitwarden/data/platform/manager/FeatureFlagManagerImpl.kt index f1f07ac7e8..3028a581cd 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/platform/manager/FeatureFlagManagerImpl.kt +++ b/app/src/main/java/com/x8bit/bitwarden/data/platform/manager/FeatureFlagManagerImpl.kt @@ -1,8 +1,8 @@ package com.x8bit.bitwarden.data.platform.manager import com.bitwarden.data.datasource.disk.model.ServerConfig +import com.bitwarden.data.repository.ServerConfigRepository import com.x8bit.bitwarden.data.platform.manager.model.FlagKey -import com.x8bit.bitwarden.data.platform.repository.ServerConfigRepository import com.x8bit.bitwarden.data.platform.util.isServerVersionAtLeast import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map diff --git a/app/src/main/java/com/x8bit/bitwarden/data/platform/manager/di/PlatformManagerModule.kt b/app/src/main/java/com/x8bit/bitwarden/data/platform/manager/di/PlatformManagerModule.kt index 775732b93c..e9d29b210a 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/platform/manager/di/PlatformManagerModule.kt +++ b/app/src/main/java/com/x8bit/bitwarden/data/platform/manager/di/PlatformManagerModule.kt @@ -5,6 +5,7 @@ import android.content.Context import androidx.core.content.getSystemService import com.bitwarden.data.manager.DispatcherManager import com.bitwarden.data.manager.DispatcherManagerImpl +import com.bitwarden.data.repository.ServerConfigRepository import com.x8bit.bitwarden.data.auth.datasource.disk.AuthDiskSource import com.x8bit.bitwarden.data.auth.manager.AddTotpItemFromAuthenticatorManager import com.x8bit.bitwarden.data.auth.repository.AuthRepository @@ -67,7 +68,6 @@ import com.x8bit.bitwarden.data.platform.processor.AuthenticatorBridgeProcessorI import com.x8bit.bitwarden.data.platform.repository.AuthenticatorBridgeRepository import com.x8bit.bitwarden.data.platform.repository.DebugMenuRepository import com.x8bit.bitwarden.data.platform.repository.EnvironmentRepository -import com.x8bit.bitwarden.data.platform.repository.ServerConfigRepository import com.x8bit.bitwarden.data.platform.repository.SettingsRepository import com.x8bit.bitwarden.data.vault.datasource.disk.VaultDiskSource import com.x8bit.bitwarden.data.vault.manager.VaultLockManager diff --git a/app/src/main/java/com/x8bit/bitwarden/data/platform/manager/network/NetworkConfigManagerImpl.kt b/app/src/main/java/com/x8bit/bitwarden/data/platform/manager/network/NetworkConfigManagerImpl.kt index 64c3d57d03..e5e6adee93 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/platform/manager/network/NetworkConfigManagerImpl.kt +++ b/app/src/main/java/com/x8bit/bitwarden/data/platform/manager/network/NetworkConfigManagerImpl.kt @@ -1,10 +1,10 @@ package com.x8bit.bitwarden.data.platform.manager.network import com.bitwarden.data.manager.DispatcherManager +import com.bitwarden.data.repository.ServerConfigRepository import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.platform.datasource.network.authenticator.RefreshAuthenticator import com.x8bit.bitwarden.data.platform.repository.EnvironmentRepository -import com.x8bit.bitwarden.data.platform.repository.ServerConfigRepository import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.debounce import kotlinx.coroutines.flow.launchIn diff --git a/app/src/main/java/com/x8bit/bitwarden/data/platform/repository/DebugMenuRepositoryImpl.kt b/app/src/main/java/com/x8bit/bitwarden/data/platform/repository/DebugMenuRepositoryImpl.kt index 65235e7623..1f4c47f380 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/platform/repository/DebugMenuRepositoryImpl.kt +++ b/app/src/main/java/com/x8bit/bitwarden/data/platform/repository/DebugMenuRepositoryImpl.kt @@ -1,6 +1,7 @@ package com.x8bit.bitwarden.data.platform.repository import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow +import com.bitwarden.data.repository.ServerConfigRepository import com.x8bit.bitwarden.BuildConfig import com.x8bit.bitwarden.data.auth.datasource.disk.AuthDiskSource import com.x8bit.bitwarden.data.auth.datasource.disk.model.OnboardingStatus diff --git a/app/src/main/java/com/x8bit/bitwarden/data/platform/repository/di/PlatformRepositoryModule.kt b/app/src/main/java/com/x8bit/bitwarden/data/platform/repository/di/PlatformRepositoryModule.kt index 2f3c4cc6be..dec7a2c288 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/platform/repository/di/PlatformRepositoryModule.kt +++ b/app/src/main/java/com/x8bit/bitwarden/data/platform/repository/di/PlatformRepositoryModule.kt @@ -1,9 +1,8 @@ package com.x8bit.bitwarden.data.platform.repository.di import android.view.autofill.AutofillManager -import com.bitwarden.data.datasource.disk.ConfigDiskSource import com.bitwarden.data.manager.DispatcherManager -import com.bitwarden.network.service.ConfigService +import com.bitwarden.data.repository.ServerConfigRepository import com.x8bit.bitwarden.data.auth.datasource.disk.AuthDiskSource import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.autofill.accessibility.manager.AccessibilityEnabledManager @@ -18,8 +17,6 @@ import com.x8bit.bitwarden.data.platform.repository.DebugMenuRepository import com.x8bit.bitwarden.data.platform.repository.DebugMenuRepositoryImpl import com.x8bit.bitwarden.data.platform.repository.EnvironmentRepository import com.x8bit.bitwarden.data.platform.repository.EnvironmentRepositoryImpl -import com.x8bit.bitwarden.data.platform.repository.ServerConfigRepository -import com.x8bit.bitwarden.data.platform.repository.ServerConfigRepositoryImpl import com.x8bit.bitwarden.data.platform.repository.SettingsRepository import com.x8bit.bitwarden.data.platform.repository.SettingsRepositoryImpl import com.x8bit.bitwarden.data.vault.datasource.disk.VaultDiskSource @@ -29,7 +26,6 @@ import dagger.Module import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent -import java.time.Clock import javax.inject.Singleton /** @@ -55,21 +51,6 @@ object PlatformRepositoryModule { vaultSdkSource = vaultSdkSource, ) - @Provides - @Singleton - fun provideServerConfigRepository( - configDiskSource: ConfigDiskSource, - configService: ConfigService, - clock: Clock, - dispatcherManager: DispatcherManager, - ): ServerConfigRepository = - ServerConfigRepositoryImpl( - configDiskSource = configDiskSource, - configService = configService, - clock = clock, - dispatcherManager = dispatcherManager, - ) - @Provides @Singleton fun provideEnvironmentRepository( diff --git a/app/src/test/java/com/x8bit/bitwarden/data/platform/manager/network/NetworkConfigManagerTest.kt b/app/src/test/java/com/x8bit/bitwarden/data/platform/manager/network/NetworkConfigManagerTest.kt index a046564716..a8222261f8 100644 --- a/app/src/test/java/com/x8bit/bitwarden/data/platform/manager/network/NetworkConfigManagerTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/data/platform/manager/network/NetworkConfigManagerTest.kt @@ -2,11 +2,11 @@ package com.x8bit.bitwarden.data.platform.manager.network import com.bitwarden.data.datasource.disk.base.FakeDispatcherManager import com.bitwarden.data.manager.DispatcherManager +import com.bitwarden.data.repository.ServerConfigRepository import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.auth.repository.model.AuthState import com.x8bit.bitwarden.data.platform.datasource.network.authenticator.RefreshAuthenticator import com.x8bit.bitwarden.data.platform.repository.EnvironmentRepository -import com.x8bit.bitwarden.data.platform.repository.ServerConfigRepository import com.x8bit.bitwarden.data.platform.repository.model.Environment import com.x8bit.bitwarden.data.util.advanceTimeByAndRunCurrent import io.mockk.coEvery diff --git a/app/src/test/java/com/x8bit/bitwarden/data/platform/repository/DebugMenuRepositoryTest.kt b/app/src/test/java/com/x8bit/bitwarden/data/platform/repository/DebugMenuRepositoryTest.kt index 4962a87287..21beaa45cc 100644 --- a/app/src/test/java/com/x8bit/bitwarden/data/platform/repository/DebugMenuRepositoryTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/data/platform/repository/DebugMenuRepositoryTest.kt @@ -2,6 +2,7 @@ package com.x8bit.bitwarden.data.platform.repository import app.cash.turbine.test import com.bitwarden.data.datasource.disk.model.ServerConfig +import com.bitwarden.data.repository.ServerConfigRepository import com.bitwarden.network.model.ConfigResponseJson import com.x8bit.bitwarden.data.auth.datasource.disk.AuthDiskSource import com.x8bit.bitwarden.data.auth.datasource.disk.model.OnboardingStatus diff --git a/app/src/test/java/com/x8bit/bitwarden/data/platform/repository/util/FakeServerConfigRepository.kt b/app/src/test/java/com/x8bit/bitwarden/data/platform/repository/util/FakeServerConfigRepository.kt index b587069455..c871bf8f15 100644 --- a/app/src/test/java/com/x8bit/bitwarden/data/platform/repository/util/FakeServerConfigRepository.kt +++ b/app/src/test/java/com/x8bit/bitwarden/data/platform/repository/util/FakeServerConfigRepository.kt @@ -1,10 +1,10 @@ package com.x8bit.bitwarden.data.platform.repository.util import com.bitwarden.data.datasource.disk.model.ServerConfig +import com.bitwarden.data.repository.ServerConfigRepository import com.bitwarden.network.model.ConfigResponseJson import com.bitwarden.network.model.ConfigResponseJson.EnvironmentJson import com.bitwarden.network.model.ConfigResponseJson.ServerJson -import com.x8bit.bitwarden.data.platform.repository.ServerConfigRepository import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.serialization.json.JsonPrimitive diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/MainViewModel.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/MainViewModel.kt index d15cf30e4f..a0efac250e 100644 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/MainViewModel.kt +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/MainViewModel.kt @@ -3,10 +3,10 @@ package com.bitwarden.authenticator import android.content.Intent import android.os.Parcelable import androidx.lifecycle.viewModelScope -import com.bitwarden.authenticator.data.platform.repository.ServerConfigRepository import com.bitwarden.authenticator.data.platform.repository.SettingsRepository import com.bitwarden.authenticator.ui.platform.base.BaseViewModel import com.bitwarden.authenticator.ui.platform.feature.settings.appearance.model.AppTheme +import com.bitwarden.data.repository.ServerConfigRepository import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/manager/FeatureFlagManagerImpl.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/manager/FeatureFlagManagerImpl.kt index e32cd616ba..c27f3bdc1d 100644 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/manager/FeatureFlagManagerImpl.kt +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/manager/FeatureFlagManagerImpl.kt @@ -1,8 +1,8 @@ package com.bitwarden.authenticator.data.platform.manager import com.bitwarden.authenticator.data.platform.manager.model.FlagKey -import com.bitwarden.authenticator.data.platform.repository.ServerConfigRepository import com.bitwarden.data.datasource.disk.model.ServerConfig +import com.bitwarden.data.repository.ServerConfigRepository import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/manager/di/PlatformManagerModule.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/manager/di/PlatformManagerModule.kt index a3fb9467d1..df1f3e5015 100644 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/manager/di/PlatformManagerModule.kt +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/manager/di/PlatformManagerModule.kt @@ -19,10 +19,10 @@ import com.bitwarden.authenticator.data.platform.manager.clipboard.BitwardenClip import com.bitwarden.authenticator.data.platform.manager.imports.ImportManager import com.bitwarden.authenticator.data.platform.manager.imports.ImportManagerImpl import com.bitwarden.authenticator.data.platform.repository.DebugMenuRepository -import com.bitwarden.authenticator.data.platform.repository.ServerConfigRepository import com.bitwarden.authenticator.data.platform.repository.SettingsRepository import com.bitwarden.data.manager.DispatcherManager import com.bitwarden.data.manager.DispatcherManagerImpl +import com.bitwarden.data.repository.ServerConfigRepository import dagger.Module import dagger.Provides import dagger.hilt.InstallIn diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/repository/DebugMenuRepositoryImpl.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/repository/DebugMenuRepositoryImpl.kt index cda1c42469..0bc7cd6590 100644 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/repository/DebugMenuRepositoryImpl.kt +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/repository/DebugMenuRepositoryImpl.kt @@ -5,6 +5,7 @@ import com.bitwarden.authenticator.data.platform.datasource.disk.FeatureFlagOver import com.bitwarden.authenticator.data.platform.manager.getFlagValueOrDefault import com.bitwarden.authenticator.data.platform.manager.model.FlagKey import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow +import com.bitwarden.data.repository.ServerConfigRepository import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.onSubscription diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/repository/ServerConfigRepository.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/repository/ServerConfigRepository.kt deleted file mode 100644 index 48e6d77b62..0000000000 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/repository/ServerConfigRepository.kt +++ /dev/null @@ -1,21 +0,0 @@ -package com.bitwarden.authenticator.data.platform.repository - -import com.bitwarden.data.datasource.disk.model.ServerConfig -import kotlinx.coroutines.flow.StateFlow - -/** - * Provides an API for observing the server config state. - */ -interface ServerConfigRepository { - - /** - * Emits updates that track [ServerConfig]. - */ - val serverConfigStateFlow: StateFlow - - /** - * Gets the state [ServerConfig]. If needed or forced by [forceRefresh], - * updates the values using server side data. - */ - suspend fun getServerConfig(forceRefresh: Boolean): ServerConfig? -} diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/repository/ServerConfigRepositoryImpl.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/repository/ServerConfigRepositoryImpl.kt deleted file mode 100644 index cab86e1bc1..0000000000 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/repository/ServerConfigRepositoryImpl.kt +++ /dev/null @@ -1,65 +0,0 @@ -package com.bitwarden.authenticator.data.platform.repository - -import com.bitwarden.data.datasource.disk.ConfigDiskSource -import com.bitwarden.data.datasource.disk.model.ServerConfig -import com.bitwarden.data.manager.DispatcherManager -import com.bitwarden.network.service.ConfigService -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.flow.SharingStarted -import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.flow.stateIn -import java.time.Clock -import java.time.Instant - -/** - * Primary implementation of [ServerConfigRepositoryImpl]. - */ -class ServerConfigRepositoryImpl( - private val configDiskSource: ConfigDiskSource, - private val configService: ConfigService, - private val clock: Clock, - dispatcherManager: DispatcherManager, -) : ServerConfigRepository { - - private val unconfinedScope = CoroutineScope(dispatcherManager.unconfined) - - override val serverConfigStateFlow: StateFlow - get() = configDiskSource - .serverConfigFlow - .stateIn( - scope = unconfinedScope, - started = SharingStarted.Eagerly, - initialValue = configDiskSource.serverConfig, - ) - - override suspend fun getServerConfig(forceRefresh: Boolean): ServerConfig? { - val localConfig = configDiskSource.serverConfig - val needsRefresh = localConfig == null || - Instant - .ofEpochMilli(localConfig.lastSync) - .isAfter( - clock.instant().plusSeconds(MINIMUM_CONFIG_SYNC_INTERVAL_SEC), - ) - - if (needsRefresh || forceRefresh) { - configService - .getConfig() - .onSuccess { configResponse -> - val serverConfig = ServerConfig( - lastSync = clock.instant().toEpochMilli(), - serverData = configResponse, - ) - configDiskSource.serverConfig = serverConfig - return serverConfig - } - } - - // If we are unable to retrieve a configuration from the server, - // fall back to the local configuration. - return localConfig - } - - private companion object { - private const val MINIMUM_CONFIG_SYNC_INTERVAL_SEC: Long = 60 * 60 - } -} diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/repository/di/PlatformRepositoryModule.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/repository/di/PlatformRepositoryModule.kt index beb6aa08e8..93ace9a5e0 100644 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/repository/di/PlatformRepositoryModule.kt +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/repository/di/PlatformRepositoryModule.kt @@ -7,18 +7,14 @@ import com.bitwarden.authenticator.data.platform.datasource.disk.SettingsDiskSou import com.bitwarden.authenticator.data.platform.manager.BiometricsEncryptionManager import com.bitwarden.authenticator.data.platform.repository.DebugMenuRepository import com.bitwarden.authenticator.data.platform.repository.DebugMenuRepositoryImpl -import com.bitwarden.authenticator.data.platform.repository.ServerConfigRepository -import com.bitwarden.authenticator.data.platform.repository.ServerConfigRepositoryImpl import com.bitwarden.authenticator.data.platform.repository.SettingsRepository import com.bitwarden.authenticator.data.platform.repository.SettingsRepositoryImpl -import com.bitwarden.data.datasource.disk.ConfigDiskSource import com.bitwarden.data.manager.DispatcherManager -import com.bitwarden.network.service.ConfigService +import com.bitwarden.data.repository.ServerConfigRepository import dagger.Module import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent -import java.time.Clock import javax.inject.Singleton /** @@ -45,21 +41,6 @@ object PlatformRepositoryModule { authenticatorSdkSource = authenticatorSdkSource, ) - @Provides - @Singleton - fun provideServerConfigRepository( - configDiskSource: ConfigDiskSource, - configService: ConfigService, - clock: Clock, - dispatcherManager: DispatcherManager, - ): ServerConfigRepository = - ServerConfigRepositoryImpl( - configDiskSource = configDiskSource, - configService = configService, - clock = clock, - dispatcherManager = dispatcherManager, - ) - @Provides @Singleton fun provideDebugMenuRepository( diff --git a/authenticator/src/test/java/com/bitwarden/authenticator/data/platform/repository/DebugMenuRepositoryTest.kt b/authenticator/src/test/java/com/bitwarden/authenticator/data/platform/repository/DebugMenuRepositoryTest.kt index fb39610c6b..3a9fd2dc0e 100644 --- a/authenticator/src/test/java/com/bitwarden/authenticator/data/platform/repository/DebugMenuRepositoryTest.kt +++ b/authenticator/src/test/java/com/bitwarden/authenticator/data/platform/repository/DebugMenuRepositoryTest.kt @@ -4,6 +4,7 @@ import app.cash.turbine.test import com.bitwarden.authenticator.data.platform.datasource.disk.FeatureFlagOverrideDiskSource import com.bitwarden.authenticator.data.platform.manager.model.FlagKey import com.bitwarden.data.datasource.disk.model.ServerConfig +import com.bitwarden.data.repository.ServerConfigRepository import com.bitwarden.network.model.ConfigResponseJson import io.mockk.every import io.mockk.just diff --git a/authenticator/src/test/java/com/bitwarden/authenticator/data/platform/repository/ServerConfigRepositoryTest.kt b/authenticator/src/test/java/com/bitwarden/authenticator/data/platform/repository/ServerConfigRepositoryTest.kt deleted file mode 100644 index 5da7e7e261..0000000000 --- a/authenticator/src/test/java/com/bitwarden/authenticator/data/platform/repository/ServerConfigRepositoryTest.kt +++ /dev/null @@ -1,169 +0,0 @@ -package com.bitwarden.authenticator.data.platform.repository - -import app.cash.turbine.test -import com.bitwarden.core.data.util.asSuccess -import com.bitwarden.data.datasource.disk.base.FakeDispatcherManager -import com.bitwarden.data.datasource.disk.model.ServerConfig -import com.bitwarden.data.datasource.disk.util.FakeConfigDiskSource -import com.bitwarden.data.manager.DispatcherManager -import com.bitwarden.network.model.ConfigResponseJson -import com.bitwarden.network.model.ConfigResponseJson.EnvironmentJson -import com.bitwarden.network.model.ConfigResponseJson.ServerJson -import com.bitwarden.network.service.ConfigService -import io.mockk.coEvery -import io.mockk.mockk -import kotlinx.coroutines.test.runTest -import kotlinx.serialization.json.JsonPrimitive -import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.api.Assertions.assertNotEquals -import org.junit.jupiter.api.Assertions.assertNull -import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.Test -import java.time.Clock -import java.time.Instant -import java.time.ZoneOffset - -class ServerConfigRepositoryTest { - private val fakeDispatcherManager: DispatcherManager = FakeDispatcherManager() - private val fakeConfigDiskSource = FakeConfigDiskSource() - private val configService: ConfigService = mockk { - coEvery { - getConfig() - } returns CONFIG_RESPONSE_JSON.asSuccess() - } - - private val fixedClock: Clock = Clock.fixed( - Instant.parse("2023-10-27T12:00:00Z"), - ZoneOffset.UTC, - ) - - private val repository = ServerConfigRepositoryImpl( - configDiskSource = fakeConfigDiskSource, - configService = configService, - clock = fixedClock, - dispatcherManager = fakeDispatcherManager, - ) - - @BeforeEach - fun setUp() { - fakeConfigDiskSource.serverConfig = null - } - - @Test - fun `getServerConfig should fetch a new server configuration with force refresh as true`() = - runTest { - coEvery { - configService.getConfig() - } returns CONFIG_RESPONSE_JSON.copy(version = "NEW VERSION").asSuccess() - - fakeConfigDiskSource.serverConfig = SERVER_CONFIG.copy( - lastSync = fixedClock.instant().toEpochMilli(), - ) - - assertEquals( - fakeConfigDiskSource.serverConfig, - SERVER_CONFIG, - ) - - repository.getServerConfig(forceRefresh = true) - - assertNotEquals( - fakeConfigDiskSource.serverConfig, - SERVER_CONFIG, - ) - } - - @Test - fun `getServerConfig should fetch a new server configuration if there is none in state`() = - runTest { - assertNull( - fakeConfigDiskSource.serverConfig, - ) - - repository.getServerConfig(forceRefresh = false) - - assertEquals( - fakeConfigDiskSource.serverConfig, - SERVER_CONFIG, - ) - } - - @Test - fun `getServerConfig should return state server config if refresh is not necessary`() = - runTest { - val testConfig = SERVER_CONFIG.copy( - lastSync = fixedClock.instant().plusSeconds(1000L).toEpochMilli(), - serverData = CONFIG_RESPONSE_JSON.copy( - version = "new version!!", - ), - ) - fakeConfigDiskSource.serverConfig = testConfig - - coEvery { - configService.getConfig() - } returns CONFIG_RESPONSE_JSON.asSuccess() - - repository.getServerConfig(forceRefresh = false) - - assertEquals( - fakeConfigDiskSource.serverConfig, - testConfig, - ) - } - - @Test - fun `serverConfigStateFlow should react to new server configurations`() = runTest { - repository.getServerConfig(forceRefresh = true) - - repository.serverConfigStateFlow.test { - assertEquals(fakeConfigDiskSource.serverConfig, awaitItem()) - } - } -} - -private val SERVER_CONFIG = ServerConfig( - lastSync = Instant.parse("2023-10-27T12:00:00Z").toEpochMilli(), - serverData = ConfigResponseJson( - type = null, - version = "2024.7.0", - gitHash = "25cf6119-dirty", - server = ServerJson( - name = "example", - url = "https://localhost:8080", - ), - environment = EnvironmentJson( - cloudRegion = null, - vaultUrl = "https://localhost:8080", - apiUrl = "http://localhost:4000", - identityUrl = "http://localhost:33656", - notificationsUrl = "http://localhost:61840", - ssoUrl = "http://localhost:51822", - ), - featureStates = mapOf( - "duo-redirect" to JsonPrimitive(true), - "flexible-collections-v-1" to JsonPrimitive(false), - ), - ), -) - -private val CONFIG_RESPONSE_JSON = ConfigResponseJson( - type = null, - version = "2024.7.0", - gitHash = "25cf6119-dirty", - server = ServerJson( - name = "example", - url = "https://localhost:8080", - ), - environment = EnvironmentJson( - cloudRegion = null, - vaultUrl = "https://localhost:8080", - apiUrl = "http://localhost:4000", - identityUrl = "http://localhost:33656", - notificationsUrl = "http://localhost:61840", - ssoUrl = "http://localhost:51822", - ), - featureStates = mapOf( - "duo-redirect" to JsonPrimitive(true), - "flexible-collections-v-1" to JsonPrimitive(false), - ), -) diff --git a/authenticator/src/test/java/com/bitwarden/authenticator/data/platform/repository/util/FakeServerConfigRepository.kt b/authenticator/src/test/java/com/bitwarden/authenticator/data/platform/repository/util/FakeServerConfigRepository.kt index 6629ec124f..58f41e9141 100644 --- a/authenticator/src/test/java/com/bitwarden/authenticator/data/platform/repository/util/FakeServerConfigRepository.kt +++ b/authenticator/src/test/java/com/bitwarden/authenticator/data/platform/repository/util/FakeServerConfigRepository.kt @@ -1,7 +1,7 @@ package com.bitwarden.authenticator.data.platform.repository.util -import com.bitwarden.authenticator.data.platform.repository.ServerConfigRepository import com.bitwarden.data.datasource.disk.model.ServerConfig +import com.bitwarden.data.repository.ServerConfigRepository import com.bitwarden.network.model.ConfigResponseJson import com.bitwarden.network.model.ConfigResponseJson.EnvironmentJson import com.bitwarden.network.model.ConfigResponseJson.ServerJson diff --git a/data/build.gradle.kts b/data/build.gradle.kts index e0ba81d388..d3b768202b 100644 --- a/data/build.gradle.kts +++ b/data/build.gradle.kts @@ -59,6 +59,7 @@ dependencies { testImplementation(libs.junit.junit5) testImplementation(libs.junit.vintage) testImplementation(libs.kotlinx.coroutines.test) + testImplementation(libs.mockk.mockk) testImplementation(libs.square.turbine) testFixturesImplementation(project(":core")) diff --git a/app/src/main/java/com/x8bit/bitwarden/data/platform/repository/ServerConfigRepository.kt b/data/src/main/kotlin/com/bitwarden/data/repository/ServerConfigRepository.kt similarity index 91% rename from app/src/main/java/com/x8bit/bitwarden/data/platform/repository/ServerConfigRepository.kt rename to data/src/main/kotlin/com/bitwarden/data/repository/ServerConfigRepository.kt index 597af369dd..2553d53698 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/platform/repository/ServerConfigRepository.kt +++ b/data/src/main/kotlin/com/bitwarden/data/repository/ServerConfigRepository.kt @@ -1,4 +1,4 @@ -package com.x8bit.bitwarden.data.platform.repository +package com.bitwarden.data.repository import com.bitwarden.data.datasource.disk.model.ServerConfig import kotlinx.coroutines.flow.StateFlow diff --git a/app/src/main/java/com/x8bit/bitwarden/data/platform/repository/ServerConfigRepositoryImpl.kt b/data/src/main/kotlin/com/bitwarden/data/repository/ServerConfigRepositoryImpl.kt similarity index 96% rename from app/src/main/java/com/x8bit/bitwarden/data/platform/repository/ServerConfigRepositoryImpl.kt rename to data/src/main/kotlin/com/bitwarden/data/repository/ServerConfigRepositoryImpl.kt index c6d8f14d60..20e0b689a0 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/platform/repository/ServerConfigRepositoryImpl.kt +++ b/data/src/main/kotlin/com/bitwarden/data/repository/ServerConfigRepositoryImpl.kt @@ -1,4 +1,4 @@ -package com.x8bit.bitwarden.data.platform.repository +package com.bitwarden.data.repository import com.bitwarden.data.datasource.disk.ConfigDiskSource import com.bitwarden.data.datasource.disk.model.ServerConfig @@ -14,7 +14,7 @@ import java.time.Instant /** * Primary implementation of [ServerConfigRepositoryImpl]. */ -class ServerConfigRepositoryImpl( +internal class ServerConfigRepositoryImpl( private val configDiskSource: ConfigDiskSource, private val configService: ConfigService, private val clock: Clock, diff --git a/data/src/main/kotlin/com/bitwarden/data/repository/di/RepositoryModule.kt b/data/src/main/kotlin/com/bitwarden/data/repository/di/RepositoryModule.kt new file mode 100644 index 0000000000..214b623df8 --- /dev/null +++ b/data/src/main/kotlin/com/bitwarden/data/repository/di/RepositoryModule.kt @@ -0,0 +1,36 @@ +package com.bitwarden.data.repository.di + +import com.bitwarden.data.datasource.disk.ConfigDiskSource +import com.bitwarden.data.manager.DispatcherManager +import com.bitwarden.data.repository.ServerConfigRepository +import com.bitwarden.data.repository.ServerConfigRepositoryImpl +import com.bitwarden.network.service.ConfigService +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import java.time.Clock +import javax.inject.Singleton + +/** + * Provides repositories in the data module. + */ +@Module +@InstallIn(SingletonComponent::class) +object RepositoryModule { + + @Provides + @Singleton + fun provideServerConfigRepository( + configDiskSource: ConfigDiskSource, + configService: ConfigService, + clock: Clock, + dispatcherManager: DispatcherManager, + ): ServerConfigRepository = + ServerConfigRepositoryImpl( + configDiskSource = configDiskSource, + configService = configService, + clock = clock, + dispatcherManager = dispatcherManager, + ) +} diff --git a/app/src/test/java/com/x8bit/bitwarden/data/platform/repository/ServerConfigRepositoryTest.kt b/data/src/test/kotlin/com/bitwarden/data/repository/ServerConfigRepositoryTest.kt similarity index 99% rename from app/src/test/java/com/x8bit/bitwarden/data/platform/repository/ServerConfigRepositoryTest.kt rename to data/src/test/kotlin/com/bitwarden/data/repository/ServerConfigRepositoryTest.kt index e1218a4e67..8fb6e6306f 100644 --- a/app/src/test/java/com/x8bit/bitwarden/data/platform/repository/ServerConfigRepositoryTest.kt +++ b/data/src/test/kotlin/com/bitwarden/data/repository/ServerConfigRepositoryTest.kt @@ -1,4 +1,4 @@ -package com.x8bit.bitwarden.data.platform.repository +package com.bitwarden.data.repository import app.cash.turbine.test import com.bitwarden.core.data.util.asSuccess