From 83caf32d5cb10824a7e6205269f7afd2324a4fe5 Mon Sep 17 00:00:00 2001 From: Sergejs Luhmirins Date: Wed, 7 Jan 2026 14:32:55 +0200 Subject: [PATCH 1/3] MS-448 Move the business logic from config manager directly to config repo --- .../CollectConfigurationDetailsUseCase.kt | 2 +- .../CollectConfigurationDetailsUseCaseTest.kt | 2 +- .../infra/config/store/ConfigRepository.kt | 4 +- .../config/store/ConfigRepositoryImpl.kt | 101 ++++-- .../infra/config/store}/ConfigSyncCache.kt | 2 +- .../config/store/ConfigRepositoryImplTest.kt | 318 ++++++++++++++---- .../config/store}/ConfigSyncCacheTest.kt | 13 +- .../infra/config/sync/ConfigManager.kt | 5 +- .../infra/config/sync/ConfigManagerTest.kt | 6 - .../migration/RealmToRoomMigrationWorker.kt | 2 +- .../infra/eventsync/EventSyncManagerImpl.kt | 5 +- .../BaseEventDownSyncDownloaderWorker.kt | 38 ++- .../InsertEnrollmentRecordsUseCase.kt | 4 +- 13 files changed, 360 insertions(+), 142 deletions(-) rename infra/{config-sync/src/main/java/com/simprints/infra/config/sync => config-store/src/main/java/com/simprints/infra/config/store}/ConfigSyncCache.kt (96%) rename infra/{config-sync/src/test/java/com/simprints/infra/config/sync => config-store/src/test/java/com/simprints/infra/config/store}/ConfigSyncCacheTest.kt (88%) diff --git a/feature/troubleshooting/src/main/java/com/simprints/feature/troubleshooting/overview/usecase/CollectConfigurationDetailsUseCase.kt b/feature/troubleshooting/src/main/java/com/simprints/feature/troubleshooting/overview/usecase/CollectConfigurationDetailsUseCase.kt index b90c8666ca..4d5c6f5911 100644 --- a/feature/troubleshooting/src/main/java/com/simprints/feature/troubleshooting/overview/usecase/CollectConfigurationDetailsUseCase.kt +++ b/feature/troubleshooting/src/main/java/com/simprints/feature/troubleshooting/overview/usecase/CollectConfigurationDetailsUseCase.kt @@ -1,7 +1,7 @@ package com.simprints.feature.troubleshooting.overview.usecase import com.simprints.infra.config.store.ConfigRepository -import com.simprints.infra.config.sync.ConfigSyncCache +import com.simprints.infra.config.store.ConfigSyncCache import javax.inject.Inject internal class CollectConfigurationDetailsUseCase @Inject constructor( diff --git a/feature/troubleshooting/src/test/java/com/simprints/feature/troubleshooting/overview/usecase/CollectConfigurationDetailsUseCaseTest.kt b/feature/troubleshooting/src/test/java/com/simprints/feature/troubleshooting/overview/usecase/CollectConfigurationDetailsUseCaseTest.kt index 1e426b7dee..2538ee1c1d 100644 --- a/feature/troubleshooting/src/test/java/com/simprints/feature/troubleshooting/overview/usecase/CollectConfigurationDetailsUseCaseTest.kt +++ b/feature/troubleshooting/src/test/java/com/simprints/feature/troubleshooting/overview/usecase/CollectConfigurationDetailsUseCaseTest.kt @@ -2,7 +2,7 @@ package com.simprints.feature.troubleshooting.overview.usecase import com.google.common.truth.Truth.assertThat import com.simprints.infra.config.store.ConfigRepository -import com.simprints.infra.config.sync.ConfigSyncCache +import com.simprints.infra.config.store.ConfigSyncCache import io.mockk.MockKAnnotations import io.mockk.coEvery import io.mockk.every diff --git a/infra/config-store/src/main/java/com/simprints/infra/config/store/ConfigRepository.kt b/infra/config-store/src/main/java/com/simprints/infra/config/store/ConfigRepository.kt index e8f633a25e..f4f037eb15 100644 --- a/infra/config-store/src/main/java/com/simprints/infra/config/store/ConfigRepository.kt +++ b/infra/config-store/src/main/java/com/simprints/infra/config/store/ConfigRepository.kt @@ -11,7 +11,9 @@ import kotlinx.coroutines.flow.Flow interface ConfigRepository { suspend fun refreshProject(projectId: String): ProjectWithConfig - suspend fun getProject(): Project + fun observeIsProjectRefreshing(): Flow + + suspend fun getProject(): Project? suspend fun getProjectConfiguration(): ProjectConfiguration diff --git a/infra/config-store/src/main/java/com/simprints/infra/config/store/ConfigRepositoryImpl.kt b/infra/config-store/src/main/java/com/simprints/infra/config/store/ConfigRepositoryImpl.kt index eae0361ebd..675a52ebde 100644 --- a/infra/config-store/src/main/java/com/simprints/infra/config/store/ConfigRepositoryImpl.kt +++ b/infra/config-store/src/main/java/com/simprints/infra/config/store/ConfigRepositoryImpl.kt @@ -2,7 +2,7 @@ package com.simprints.infra.config.store import androidx.annotation.VisibleForTesting import com.simprints.core.DeviceID -import com.simprints.core.domain.tokenization.TokenizableString +import com.simprints.infra.authstore.AuthStore import com.simprints.infra.config.store.local.ConfigLocalDataSource import com.simprints.infra.config.store.models.DeviceConfiguration import com.simprints.infra.config.store.models.DeviceState @@ -22,45 +22,93 @@ import com.simprints.infra.network.SimNetwork import com.simprints.infra.network.exceptions.BackendMaintenanceException import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.FlowCollector +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.onStart import retrofit2.HttpException import java.net.HttpURLConnection import javax.inject.Inject +import javax.inject.Singleton +@Singleton internal class ConfigRepositoryImpl @Inject constructor( + private val authStore: AuthStore, private val localDataSource: ConfigLocalDataSource, private val remoteDataSource: ConfigRemoteDataSource, private val simNetwork: SimNetwork, private val tokenizationProcessor: TokenizationProcessor, + private val configSyncCache: ConfigSyncCache, @param:DeviceID private val deviceId: String, ) : ConfigRepository { - companion object { - @VisibleForTesting - const val PRIVACY_NOTICE_FILE = "privacy_notice" + private val isProjectRefreshingFlow: MutableStateFlow = MutableStateFlow(false) + + override suspend fun getProject(): Project? = try { + localDataSource.getProject() + } catch (_: NoSuchElementException) { + val projectId = authStore.signedInProjectId + if (projectId.isEmpty()) { + null + } else { + try { + refreshProject(projectId).project + } catch (_: Exception) { + null + } + } } - override suspend fun getProject(): Project = localDataSource.getProject() + override suspend fun refreshProject(projectId: String): ProjectWithConfig { + isProjectRefreshingFlow.tryEmit(true) + return try { + remoteDataSource + .getProject(projectId) + .also { (project, configuration) -> + localDataSource.saveProject(project) + localDataSource.saveProjectConfiguration(configuration) + + if (!project.baseUrl.isNullOrBlank()) { + simNetwork.setApiBaseUrl(project.baseUrl) + } + configSyncCache.saveUpdateTime() + } + } finally { + isProjectRefreshingFlow.tryEmit(false) + } + } - override suspend fun refreshProject(projectId: String): ProjectWithConfig = remoteDataSource - .getProject(projectId) - .also { (project, configuration) -> - localDataSource.saveProject(project) - localDataSource.saveProjectConfiguration(configuration) + override fun observeIsProjectRefreshing(): Flow = isProjectRefreshingFlow.asStateFlow() - if (!project.baseUrl.isNullOrBlank()) { - simNetwork.setApiBaseUrl(project.baseUrl) + override suspend fun getProjectConfiguration(): ProjectConfiguration { + val localConfig = localDataSource.getProjectConfiguration() + + // If projectId is empty, configuration hasn't been downloaded yet + val config = if (localConfig.projectId.isEmpty()) { + val signedProjectId = authStore.signedInProjectId.takeUnless { it.isEmpty() } ?: return localConfig + + try { + // Try to refresh it with logged in projectId (if any) + refreshProject(signedProjectId).configuration + } catch (_: Exception) { + // If not logged in the above will fail. However we still depend on the 'default' + // configuration to create the session when login is attempted. Possibly in other + // places, too. + localConfig } + } else { + localConfig } - override suspend fun getProjectConfiguration(): ProjectConfiguration { - val config = localDataSource.getProjectConfiguration() return tokenizeModules(config) } - override fun observeProjectConfiguration(): Flow = localDataSource.observeProjectConfiguration().map { config -> - tokenizeModules(config) - } + override fun observeProjectConfiguration(): Flow = localDataSource + .observeProjectConfiguration() + .onStart { getProjectConfiguration() } + .map { config -> + tokenizeModules(config) + } override suspend fun getDeviceState(): DeviceState { val projectId = localDataSource.getProject().id @@ -103,15 +151,11 @@ internal class ConfigRepositoryImpl @Inject constructor( down = config.synchronization.down.copy( simprints = config.synchronization.down.simprints?.copy( moduleOptions = config.synchronization.down.simprints.moduleOptions.map { moduleId -> - when (moduleId) { - is TokenizableString.Raw -> tokenizationProcessor.encrypt( - decrypted = moduleId, - tokenKeyType = TokenKeyType.ModuleId, - project = project, - ) - - is TokenizableString.Tokenized -> moduleId - } + tokenizationProcessor.tokenizeIfNecessary( + tokenizableString = moduleId, + tokenKeyType = TokenKeyType.ModuleId, + project = project, + ) }, ), ), @@ -144,4 +188,9 @@ internal class ConfigRepositoryImpl @Inject constructor( ) } } + + companion object { + @VisibleForTesting + const val PRIVACY_NOTICE_FILE = "privacy_notice" + } } diff --git a/infra/config-sync/src/main/java/com/simprints/infra/config/sync/ConfigSyncCache.kt b/infra/config-store/src/main/java/com/simprints/infra/config/store/ConfigSyncCache.kt similarity index 96% rename from infra/config-sync/src/main/java/com/simprints/infra/config/sync/ConfigSyncCache.kt rename to infra/config-store/src/main/java/com/simprints/infra/config/store/ConfigSyncCache.kt index 9825009499..51623f1d6b 100644 --- a/infra/config-sync/src/main/java/com/simprints/infra/config/sync/ConfigSyncCache.kt +++ b/infra/config-store/src/main/java/com/simprints/infra/config/store/ConfigSyncCache.kt @@ -1,4 +1,4 @@ -package com.simprints.infra.config.sync +package com.simprints.infra.config.store import androidx.core.content.edit import com.simprints.core.DispatcherIO diff --git a/infra/config-store/src/test/java/com/simprints/infra/config/store/ConfigRepositoryImplTest.kt b/infra/config-store/src/test/java/com/simprints/infra/config/store/ConfigRepositoryImplTest.kt index 608ecff2f5..ab3a2da932 100644 --- a/infra/config-store/src/test/java/com/simprints/infra/config/store/ConfigRepositoryImplTest.kt +++ b/infra/config-store/src/test/java/com/simprints/infra/config/store/ConfigRepositoryImplTest.kt @@ -1,6 +1,9 @@ package com.simprints.infra.config.store -import com.google.common.truth.Truth.assertThat +import com.google.common.truth.Truth.* +import com.simprints.core.domain.tokenization.asTokenizableEncrypted +import com.simprints.core.domain.tokenization.asTokenizableRaw +import com.simprints.infra.authstore.AuthStore import com.simprints.infra.config.store.ConfigRepositoryImpl.Companion.PRIVACY_NOTICE_FILE import com.simprints.infra.config.store.local.ConfigLocalDataSource import com.simprints.infra.config.store.models.DeviceConfiguration @@ -18,52 +21,62 @@ import com.simprints.infra.config.store.testtools.project import com.simprints.infra.config.store.testtools.projectConfiguration import com.simprints.infra.config.store.tokenization.TokenizationProcessor import com.simprints.infra.logging.Simber -import com.simprints.core.domain.tokenization.asTokenizableEncrypted import com.simprints.infra.network.SimNetwork import com.simprints.infra.network.exceptions.BackendMaintenanceException -import com.simprints.testtools.common.syntax.assertThrows -import io.mockk.mockkStatic -import io.mockk.unmockkStatic -import okhttp3.ResponseBody.Companion.toResponseBody -import retrofit2.HttpException -import retrofit2.Response -import io.mockk.coEvery -import io.mockk.coVerify -import io.mockk.every -import io.mockk.mockk -import io.mockk.verify +import io.mockk.* +import io.mockk.impl.annotations.MockK +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.toList +import kotlinx.coroutines.launch +import kotlinx.coroutines.test.advanceTimeBy import kotlinx.coroutines.test.runTest +import okhttp3.ResponseBody.Companion.toResponseBody import org.junit.After import org.junit.Before import org.junit.Test +import retrofit2.HttpException +import retrofit2.Response import java.net.HttpURLConnection class ConfigRepositoryImplTest { - companion object { - private const val PROJECT_ID = "projectId" - private const val DEVICE_ID = "deviceId" - private const val LANGUAGE = "fr" - private const val PRIVACY_NOTICE = "privacy notice" - } + @MockK + private lateinit var authStore: AuthStore + + @MockK + private lateinit var localDataSource: ConfigLocalDataSource + + @MockK + private lateinit var remoteDataSource: ConfigRemoteDataSource + + @MockK + private lateinit var simNetwork: SimNetwork - private val localDataSource = mockk(relaxed = true) - private val remoteDataSource = mockk() - private val simNetwork = mockk(relaxed = true) - private val tokenizationProcessor = mockk(relaxed = true) + @MockK + private lateinit var tokenizationProcessor: TokenizationProcessor - private lateinit var configServiceImpl: ConfigRepositoryImpl + @MockK + private lateinit var configSyncCache: ConfigSyncCache + + private lateinit var configRepository: ConfigRepositoryImpl @Before fun setup() { + MockKAnnotations.init(this, relaxed = true) + + every { tokenizationProcessor.tokenizeIfNecessary(any(), any(), any()) } answers { firstArg() } + mockkStatic(Simber::class) - configServiceImpl = ConfigRepositoryImpl( - localDataSource, - remoteDataSource, - simNetwork, - tokenizationProcessor, - DEVICE_ID, + configRepository = ConfigRepositoryImpl( + authStore = authStore, + localDataSource = localDataSource, + remoteDataSource = remoteDataSource, + simNetwork = simNetwork, + tokenizationProcessor = tokenizationProcessor, + configSyncCache = configSyncCache, + deviceId = DEVICE_ID, ) } @@ -73,39 +86,59 @@ class ConfigRepositoryImplTest { } @Test - fun `should get the project locally if available`() = runTest { + fun `getProject should get the project locally if available`() = runTest { coEvery { localDataSource.getProject() } returns project - val receivedProject = configServiceImpl.getProject() + val result = configRepository.getProject() - assertThat(receivedProject).isEqualTo(project) + assertThat(result).isEqualTo(project) coVerify(exactly = 1) { localDataSource.getProject() } coVerify(exactly = 0) { remoteDataSource.getProject(any()) } } @Test - fun `should throw the exception if there is an issue`() = runTest { - val exception = Exception("exception") - coEvery { localDataSource.getProject() } throws exception + fun `getProject should call the fetch method when cannot get local project`() = runTest { + coEvery { localDataSource.getProject() } throws NoSuchElementException() + every { authStore.signedInProjectId } returns PROJECT_ID + coEvery { remoteDataSource.getProject(any()) } returns ProjectWithConfig(project, projectConfiguration) - val receivedException = assertThrows { configServiceImpl.getProject() } + configRepository.getProject() + coVerify(exactly = 1) { remoteDataSource.getProject(PROJECT_ID) } + } - assertThat(receivedException).isEqualTo(exception) - coVerify(exactly = 1) { localDataSource.getProject() } + @Test + fun `getProject should returns null when no project ID`() = runTest { + every { authStore.signedInProjectId } returns "" + coEvery { localDataSource.getProject() } throws NoSuchElementException() + + val result = configRepository.getProject() + assertThat(result).isNull() coVerify(exactly = 0) { localDataSource.saveProject(project) } coVerify(exactly = 0) { remoteDataSource.getProject(PROJECT_ID) } } + @Test + fun `getProject should returns null when fetch fails`() = runTest { + every { authStore.signedInProjectId } returns PROJECT_ID + coEvery { localDataSource.getProject() } throws NoSuchElementException() + coEvery { remoteDataSource.getProject(any()) } throws NoSuchElementException() + + val result = configRepository.getProject() + assertThat(result).isNull() + coVerify(exactly = 0) { localDataSource.saveProject(project) } + } + @Test fun `refreshProject() should get the project remotely and save it and update the api base url if not empty`() = runTest { coEvery { localDataSource.saveProject(project) } returns Unit coEvery { remoteDataSource.getProject(PROJECT_ID) } returns ProjectWithConfig(project, projectConfiguration) - configServiceImpl.refreshProject(PROJECT_ID) + configRepository.refreshProject(PROJECT_ID) coVerify(exactly = 1) { localDataSource.saveProject(project) } coVerify(exactly = 1) { localDataSource.saveProjectConfiguration(projectConfiguration) } coVerify(exactly = 1) { remoteDataSource.getProject(PROJECT_ID) } coVerify(exactly = 1) { simNetwork.setApiBaseUrl(project.baseUrl) } + coVerify(exactly = 1) { configSyncCache.saveUpdateTime() } } @Test @@ -123,19 +156,171 @@ class ConfigRepositoryImplTest { coEvery { localDataSource.saveProject(project) } returns Unit coEvery { remoteDataSource.getProject(PROJECT_ID) } returns ProjectWithConfig(project, projectConfiguration) - configServiceImpl.refreshProject(PROJECT_ID) + configRepository.refreshProject(PROJECT_ID) coVerify(exactly = 1) { localDataSource.saveProject(project) } coVerify(exactly = 1) { remoteDataSource.getProject(PROJECT_ID) } coVerify(exactly = 0) { simNetwork.setApiBaseUrl(project.baseUrl) } } + @Test + fun `observeIsProjectRefreshing should initially emit false`() = runTest { + val isRefreshing = configRepository.observeIsProjectRefreshing().first() + assertThat(isRefreshing).isFalse() + } + + @Test + fun `observeIsProjectRefreshing should emit false after refreshProject completes`() = runTest { + coEvery { configRepository.refreshProject(PROJECT_ID) } returns ProjectWithConfig(project, projectConfiguration) + + configRepository.refreshProject(PROJECT_ID) + val isRefreshing = configRepository.observeIsProjectRefreshing().first() + assertThat(isRefreshing).isFalse() + } + + @OptIn(ExperimentalCoroutinesApi::class) + @Test + fun `observeIsProjectRefreshing should emit true during refreshProject and false when done`() = runTest { + coEvery { configRepository.refreshProject(PROJECT_ID) } coAnswers { + delay(1000) + ProjectWithConfig(project, projectConfiguration) + } + + assertThat(configRepository.observeIsProjectRefreshing().first()).isFalse() // before + + launch { configRepository.refreshProject(PROJECT_ID) } + advanceTimeBy(500) + + assertThat(configRepository.observeIsProjectRefreshing().first()).isTrue() // during + + advanceTimeBy(1000) + + assertThat(configRepository.observeIsProjectRefreshing().first()).isFalse() // after + } + + @OptIn(ExperimentalCoroutinesApi::class) + @Test + fun `observeIsProjectRefreshing should emit false even when refreshProject fails`() = runTest { + coEvery { configRepository.refreshProject(PROJECT_ID) } coAnswers { + delay(500) + throw Exception("Test exception") + } + + assertThat(configRepository.observeIsProjectRefreshing().first()).isFalse() // before + + launch { + try { + configRepository.refreshProject(PROJECT_ID) + } catch (_: Exception) { + // Expected + } + } + advanceTimeBy(1000) + + assertThat(configRepository.observeIsProjectRefreshing().first()).isFalse() // after failure + } + + @Test + fun `getProjectConfiguration should get the config locally if available`() = runTest { + coEvery { localDataSource.getProjectConfiguration() } returns projectConfiguration + + val result = configRepository.getProjectConfiguration() + + assertThat(result).isEqualTo(projectConfiguration) + coVerify(exactly = 1) { localDataSource.getProject() } + coVerify(exactly = 0) { remoteDataSource.getProject(any()) } + } + + @Test + fun `getProjectConfiguration should call the fetch method when default local configuration`() = runTest { + coEvery { localDataSource.getProjectConfiguration() } returns projectConfiguration.copy(projectId = "") + every { authStore.signedInProjectId } returns PROJECT_ID + coEvery { remoteDataSource.getProject(any()) } returns ProjectWithConfig(project, projectConfiguration) + + configRepository.getProjectConfiguration() + coVerify(exactly = 1) { remoteDataSource.getProject(PROJECT_ID) } + } + + @Test + fun `getProjectConfiguration should returns default configuration not logger in`() = runTest { + val defaultConfiguration = projectConfiguration.copy(projectId = "") + coEvery { localDataSource.getProjectConfiguration() } returns defaultConfiguration + every { authStore.signedInProjectId } returns "" + + val result = configRepository.getProjectConfiguration() + assertThat(result).isEqualTo(defaultConfiguration) + coVerify(exactly = 0) { remoteDataSource.getProject(PROJECT_ID) } + } + + @Test + fun `getProjectConfiguration should returns null when fetch fails`() = runTest { + every { authStore.signedInProjectId } returns PROJECT_ID + val defaultConfiguration = projectConfiguration.copy(projectId = "") + coEvery { localDataSource.getProjectConfiguration() } returns defaultConfiguration + coEvery { remoteDataSource.getProject(any()) } throws NoSuchElementException() + + val result = configRepository.getProjectConfiguration() + assertThat(result).isEqualTo(defaultConfiguration) + coVerify(exactly = 0) { localDataSource.saveProject(project) } + } + + @Test + fun `getProjectConfiguration tokenizes modules before returning`() = runTest { + coEvery { localDataSource.getProjectConfiguration() } returns projectConfiguration.copy( + synchronization = projectConfiguration.synchronization.copy( + down = projectConfiguration.synchronization.down.copy( + simprints = projectConfiguration.synchronization.down.simprints?.copy( + moduleOptions = listOf( + "module1".asTokenizableRaw(), + "module2".asTokenizableRaw(), + ), + ), + ), + ), + ) + + configRepository.getProjectConfiguration() + coVerify(exactly = 2) { tokenizationProcessor.tokenizeIfNecessary(any(), any(), any()) } + } + + @Test + fun `observeProjectConfiguration should emit values from the local data source`() = runTest { + val config1 = projectConfiguration.copy(projectId = "project1") + val config2 = projectConfiguration.copy(projectId = "project2") + + coEvery { localDataSource.observeProjectConfiguration() } returns flow { + emit(config1) + emit(config2) + } + + val emittedConfigs = configRepository.observeProjectConfiguration().toList() + + assertThat(emittedConfigs).hasSize(2) + assertThat(emittedConfigs[0]).isEqualTo(config1) + assertThat(emittedConfigs[1]).isEqualTo(config2) + coVerify(exactly = 0) { remoteDataSource.getProject(any()) } + } + + @Test + fun `observeProjectConfiguration should call getProjectConfiguration on start to invoke download if config empty`() = runTest { + coEvery { localDataSource.observeProjectConfiguration() } returns flow { + emit(projectConfiguration) + } + + val emittedConfigs = configRepository.observeProjectConfiguration().toList() + + coVerify(exactly = 1) { localDataSource.getProjectConfiguration() } + + assertThat(emittedConfigs).hasSize(1) + assertThat(emittedConfigs[0]).isEqualTo(projectConfiguration) + } + @Test fun `getDeviceState should call the correct method`() = runTest { coEvery { localDataSource.getProject() } returns project coEvery { localDataSource.getDeviceConfiguration() } returns deviceConfiguration coEvery { remoteDataSource.getDeviceState(any(), any(), any()) } returns deviceState - val result = configServiceImpl.getDeviceState() + val result = configRepository.getDeviceState() assertThat(result).isEqualTo(deviceState) } @@ -143,7 +328,7 @@ class ConfigRepositoryImplTest { fun `getDeviceConfiguration should call the correct method`() = runTest { coEvery { localDataSource.getDeviceConfiguration() } returns deviceConfiguration - val gottenDeviceConfiguration = configServiceImpl.getDeviceConfiguration() + val gottenDeviceConfiguration = configRepository.getDeviceConfiguration() assertThat(gottenDeviceConfiguration).isEqualTo(deviceConfiguration) } @@ -153,7 +338,7 @@ class ConfigRepositoryImplTest { it } - configServiceImpl.updateDeviceConfiguration(update) + configRepository.updateDeviceConfiguration(update) coVerify(exactly = 1) { localDataSource.updateDeviceConfiguration(update) } } @@ -162,7 +347,7 @@ class ConfigRepositoryImplTest { every { localDataSource.hasPrivacyNoticeFor(PROJECT_ID, LANGUAGE) } returns true every { localDataSource.getPrivacyNotice(PROJECT_ID, LANGUAGE) } returns PRIVACY_NOTICE - val results = configServiceImpl.getPrivacyNotice(PROJECT_ID, LANGUAGE).toList() + val results = configRepository.getPrivacyNotice(PROJECT_ID, LANGUAGE).toList() assertThat(results).isEqualTo(listOf(Succeed(LANGUAGE, PRIVACY_NOTICE))) } @@ -176,7 +361,7 @@ class ConfigRepositoryImplTest { ) } returns PRIVACY_NOTICE - val results = configServiceImpl.getPrivacyNotice(PROJECT_ID, LANGUAGE).toList() + val results = configRepository.getPrivacyNotice(PROJECT_ID, LANGUAGE).toList() assertThat(results).isEqualTo( listOf( @@ -205,7 +390,7 @@ class ConfigRepositoryImplTest { ) } throws exception - val results = configServiceImpl.getPrivacyNotice(PROJECT_ID, LANGUAGE).toList() + val results = configRepository.getPrivacyNotice(PROJECT_ID, LANGUAGE).toList() assertThat(results).isEqualTo( listOf( @@ -227,7 +412,7 @@ class ConfigRepositoryImplTest { ) } throws exception - val results = configServiceImpl.getPrivacyNotice(PROJECT_ID, LANGUAGE).toList() + val results = configRepository.getPrivacyNotice(PROJECT_ID, LANGUAGE).toList() assertThat(results).isEqualTo( listOf( @@ -240,7 +425,7 @@ class ConfigRepositoryImplTest { @Test fun `clearData should clear all the data`() = runTest { - configServiceImpl.clearData() + configRepository.clearData() coVerify(exactly = 1) { localDataSource.clearProject() } coVerify(exactly = 1) { localDataSource.clearProjectConfiguration() } @@ -248,30 +433,12 @@ class ConfigRepositoryImplTest { verify(exactly = 1) { localDataSource.deletePrivacyNotices() } } - @Test - fun `observeProjectConfiguration should emit values from the local data source`() = runTest { - val config1 = projectConfiguration.copy(projectId = "project1") - val config2 = projectConfiguration.copy(projectId = "project2") - - coEvery { localDataSource.observeProjectConfiguration() } returns flow { - emit(config1) - emit(config2) - } - - val emittedConfigs = configServiceImpl.observeProjectConfiguration().toList() - - assertThat(emittedConfigs).hasSize(2) - assertThat(emittedConfigs[0]).isEqualTo(config1) - assertThat(emittedConfigs[1]).isEqualTo(config2) - coVerify(exactly = 0) { remoteDataSource.getProject(any()) } - } - @Test fun `should return project config from local data source`() = runTest { val config = projectConfiguration.copy(projectId = "project1") coEvery { localDataSource.getProjectConfiguration() } returns config - val result = configServiceImpl.getProjectConfiguration() + val result = configRepository.getProjectConfiguration() assertThat(result).isEqualTo(config) coVerify { localDataSource.getProjectConfiguration() } @@ -291,7 +458,7 @@ class ConfigRepositoryImplTest { ) } throws exception - configServiceImpl.getPrivacyNotice(PROJECT_ID, LANGUAGE).toList() + configRepository.getPrivacyNotice(PROJECT_ID, LANGUAGE).toList() verify(exactly = 1) { Simber.i(eq("Failed to download privacy notice"), eq(exception)) } } @@ -310,7 +477,7 @@ class ConfigRepositoryImplTest { ) } throws exception - configServiceImpl.getPrivacyNotice(PROJECT_ID, LANGUAGE).toList() + configRepository.getPrivacyNotice(PROJECT_ID, LANGUAGE).toList() verify(exactly = 0) { Simber.i(any(), any()) } } @@ -322,7 +489,7 @@ class ConfigRepositoryImplTest { selectedModules = listOf( "module1".asTokenizableEncrypted(), "module2".asTokenizableEncrypted(), - ) + ), ) coEvery { localDataSource.observeDeviceConfiguration() } returns flow { @@ -330,11 +497,18 @@ class ConfigRepositoryImplTest { emit(config2) } - val emittedConfigs = configServiceImpl.observeDeviceConfiguration().toList() + val emittedConfigs = configRepository.observeDeviceConfiguration().toList() assertThat(emittedConfigs).hasSize(2) assertThat(emittedConfigs[0]).isEqualTo(config1) assertThat(emittedConfigs[1]).isEqualTo(config2) coVerify(exactly = 1) { localDataSource.observeDeviceConfiguration() } } + + companion object { + private const val PROJECT_ID = "projectId" + private const val DEVICE_ID = "deviceId" + private const val LANGUAGE = "fr" + private const val PRIVACY_NOTICE = "privacy notice" + } } diff --git a/infra/config-sync/src/test/java/com/simprints/infra/config/sync/ConfigSyncCacheTest.kt b/infra/config-store/src/test/java/com/simprints/infra/config/store/ConfigSyncCacheTest.kt similarity index 88% rename from infra/config-sync/src/test/java/com/simprints/infra/config/sync/ConfigSyncCacheTest.kt rename to infra/config-store/src/test/java/com/simprints/infra/config/store/ConfigSyncCacheTest.kt index 79d0cc5672..95f6f25908 100644 --- a/infra/config-sync/src/test/java/com/simprints/infra/config/sync/ConfigSyncCacheTest.kt +++ b/infra/config-store/src/test/java/com/simprints/infra/config/store/ConfigSyncCacheTest.kt @@ -1,16 +1,13 @@ -package com.simprints.infra.config.sync +package com.simprints.infra.config.store import android.content.SharedPreferences -import com.google.common.truth.Truth.assertThat +import com.google.common.truth.* import com.simprints.core.tools.time.TimeHelper import com.simprints.core.tools.time.Timestamp import com.simprints.infra.security.SecurityManager import com.simprints.testtools.common.coroutines.TestCoroutineRule -import io.mockk.MockKAnnotations -import io.mockk.every +import io.mockk.* import io.mockk.impl.annotations.MockK -import io.mockk.mockk -import io.mockk.verify import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.Rule @@ -64,7 +61,7 @@ class ConfigSyncCacheTest { verify { prefs.getLong(any(), any()) } verify { timeHelper.readableBetweenNowAndTime(Timestamp(1000L)) } - assertThat(result).isEqualTo("0 minutes") + Truth.assertThat(result).isEqualTo("0 minutes") } @Test @@ -74,6 +71,6 @@ class ConfigSyncCacheTest { val result = configSyncCache.sinceLastUpdateTime() verify { prefs.getLong(any(), any()) } - assertThat(result).isEmpty() + Truth.assertThat(result).isEmpty() } } diff --git a/infra/config-sync/src/main/java/com/simprints/infra/config/sync/ConfigManager.kt b/infra/config-sync/src/main/java/com/simprints/infra/config/sync/ConfigManager.kt index 24873c6c2b..da88af22ce 100644 --- a/infra/config-sync/src/main/java/com/simprints/infra/config/sync/ConfigManager.kt +++ b/infra/config-sync/src/main/java/com/simprints/infra/config/sync/ConfigManager.kt @@ -18,7 +18,6 @@ import javax.inject.Singleton @Singleton class ConfigManager @Inject constructor( private val configRepository: ConfigRepository, - private val configSyncCache: ConfigSyncCache, private val authStore: AuthStore, ) { private val isProjectRefreshingFlow: MutableStateFlow = MutableStateFlow(false) @@ -26,9 +25,7 @@ class ConfigManager @Inject constructor( suspend fun refreshProject(projectId: String): ProjectWithConfig { isProjectRefreshingFlow.tryEmit(true) try { - return configRepository.refreshProject(projectId).also { - configSyncCache.saveUpdateTime() - } + return configRepository.refreshProject(projectId) } finally { isProjectRefreshingFlow.tryEmit(false) } diff --git a/infra/config-sync/src/test/java/com/simprints/infra/config/sync/ConfigManagerTest.kt b/infra/config-sync/src/test/java/com/simprints/infra/config/sync/ConfigManagerTest.kt index b7a477e98e..c00ad60dbb 100644 --- a/infra/config-sync/src/test/java/com/simprints/infra/config/sync/ConfigManagerTest.kt +++ b/infra/config-sync/src/test/java/com/simprints/infra/config/sync/ConfigManagerTest.kt @@ -31,9 +31,6 @@ class ConfigManagerTest { @MockK private lateinit var configRepository: ConfigRepository - @MockK - private lateinit var configSyncCache: ConfigSyncCache - @MockK private lateinit var authStore: AuthStore @@ -54,7 +51,6 @@ class ConfigManagerTest { MockKAnnotations.init(this, relaxed = true) configManager = ConfigManager( configRepository = configRepository, - configSyncCache = configSyncCache, authStore = authStore, ) } @@ -65,8 +61,6 @@ class ConfigManagerTest { val refreshedProject = configManager.refreshProject(PROJECT_ID) assertThat(refreshedProject).isEqualTo(projectWithConfig) - - coVerify { configSyncCache.saveUpdateTime() } } @Test diff --git a/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/local/migration/RealmToRoomMigrationWorker.kt b/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/local/migration/RealmToRoomMigrationWorker.kt index ac80cda97e..3e5c8a1c3c 100644 --- a/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/local/migration/RealmToRoomMigrationWorker.kt +++ b/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/local/migration/RealmToRoomMigrationWorker.kt @@ -83,7 +83,7 @@ internal class RealmToRoomMigrationWorker @AssistedInject constructor( private suspend fun processRecords() { // log realm db info crashlyticsLog("[RealmToRoomMigrationWorker] ${realmDataSource.getLocalDBInfo()}") - val project = configRepo.getProject() + val project = configRepo.getProject() ?: return var index = 0 realmDataSource .loadAllSubjectsInBatches(BATCH_SIZE) diff --git a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/EventSyncManagerImpl.kt b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/EventSyncManagerImpl.kt index 2067270ce6..ff4828aeb8 100644 --- a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/EventSyncManagerImpl.kt +++ b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/EventSyncManagerImpl.kt @@ -109,6 +109,7 @@ internal class EventSyncManagerImpl @Inject constructor( subjectId: String, metadata: String, ): Unit = withContext(dispatcher) { + val project = configRepository.getProject() ?: return@withContext val projectConfiguration = configRepository.getProjectConfiguration() val eventScope = eventRepository.createEventScope(EventScopeType.DOWN_SYNC) @@ -120,7 +121,7 @@ internal class EventSyncManagerImpl @Inject constructor( modes = getProjectModalities(projectConfiguration), ), ) - simprintsDownSyncTask.downSync(this, op, eventScope, configRepository.getProject()).toList() + simprintsDownSyncTask.downSync(this, op, eventScope, project).toList() } else if (projectConfiguration.synchronization.down.commCare != null) { val caseId = extractCommCareCaseId(metadata) val op = EventDownSyncOperation( @@ -131,7 +132,7 @@ internal class EventSyncManagerImpl @Inject constructor( modes = getProjectModalities(projectConfiguration), ), ) - commCareSyncTask.downSync(this, op, eventScope, configRepository.getProject()).toList() + commCareSyncTask.downSync(this, op, eventScope, project).toList() } eventRepository.closeEventScope(eventScope, EventScopeEndCause.WORKFLOW_ENDED) } diff --git a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/down/workers/BaseEventDownSyncDownloaderWorker.kt b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/down/workers/BaseEventDownSyncDownloaderWorker.kt index 2c820e119d..7475369951 100644 --- a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/down/workers/BaseEventDownSyncDownloaderWorker.kt +++ b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/down/workers/BaseEventDownSyncDownloaderWorker.kt @@ -28,8 +28,8 @@ internal abstract class BaseEventDownSyncDownloaderWorker( protected val configRepository: ConfigRepository, private val dispatcher: CoroutineDispatcher, private val realmToRoomMigrationFlagsStore: RealmToRoomMigrationFlagsStore, -) : SimCoroutineWorker(context, params), WorkerProgressCountReporter { - +) : SimCoroutineWorker(context, params), + WorkerProgressCountReporter { override val tag: String = "EventDownSyncDownloader" private val downSyncOperationInput by lazy { @@ -73,22 +73,26 @@ internal abstract class BaseEventDownSyncDownloaderWorker( var max: Int? = syncCache.readMax(workerId) val project = configRepository.getProject() - createDownSyncTask().downSync(this, getDownSyncOperation(), getEventScope(), project).collect { - count = it.progress - max = it.maxProgress - syncCache.saveProgress(workerId, count) - syncCache.saveMax(workerId, max) - reportCount(count, max) + if (project == null) { + fail(IllegalStateException("User is not signed in")) + } else { + createDownSyncTask().downSync(this, getDownSyncOperation(), getEventScope(), project).collect { + count = it.progress + max = it.maxProgress + syncCache.saveProgress(workerId, count) + syncCache.saveMax(workerId, max) + reportCount(count, max) + } + + Simber.d("Downloaded events: $count", tag = tag) + success( + workDataOf( + OUTPUT_DOWN_SYNC to count, + OUTPUT_DOWN_MAX_SYNC to max, + ), + "Total downloaded: $count / $max", + ) } - - Simber.d("Downloaded events: $count", tag = tag) - success( - workDataOf( - OUTPUT_DOWN_SYNC to count, - OUTPUT_DOWN_MAX_SYNC to max, - ), - "Total downloaded: $count / $max", - ) } catch (t: Throwable) { handleSyncException(t) } diff --git a/testing/data-generator/src/main/java/com/simprints/feature/datagenerator/enrollmentrecords/InsertEnrollmentRecordsUseCase.kt b/testing/data-generator/src/main/java/com/simprints/feature/datagenerator/enrollmentrecords/InsertEnrollmentRecordsUseCase.kt index e4db7aa3f6..f00cb74aa2 100644 --- a/testing/data-generator/src/main/java/com/simprints/feature/datagenerator/enrollmentrecords/InsertEnrollmentRecordsUseCase.kt +++ b/testing/data-generator/src/main/java/com/simprints/feature/datagenerator/enrollmentrecords/InsertEnrollmentRecordsUseCase.kt @@ -3,9 +3,9 @@ package com.simprints.feature.datagenerator.enrollmentrecords import android.os.Bundle import com.simprints.core.DispatcherIO import com.simprints.core.domain.common.Modality +import com.simprints.core.domain.common.TemplateIdentifier import com.simprints.core.domain.reference.BiometricReference import com.simprints.core.domain.reference.BiometricTemplate -import com.simprints.core.domain.common.TemplateIdentifier import com.simprints.core.domain.tokenization.asTokenizableEncrypted import com.simprints.core.tools.time.TimeHelper import com.simprints.infra.config.store.ConfigRepository @@ -35,7 +35,7 @@ internal class InsertEnrollmentRecordsUseCase @Inject constructor( firstSubjectId: String, fingerOrder: Bundle?, ): Flow = flow { - val project = configRepository.getProject() + val project = configRepository.getProject() ?: return@flow val tokenizedModuleId = moduleId.asTokenizableEncrypted() val tokenizedAttendantId = attendantId.asTokenizableEncrypted() val creationDate = timeHelper.now().ms.toDate() From 44dad87f163bb9d0c30d5414a239d6fce430764c Mon Sep 17 00:00:00 2001 From: Sergejs Luhmirins Date: Wed, 7 Jan 2026 15:15:35 +0200 Subject: [PATCH 2/3] MS-448 Replace all usages of ConfigManager with repository --- .../capture/screens/FaceCaptureViewModel.kt | 10 +- .../LiveFeedbackFragmentViewModel.kt | 8 +- .../screens/FaceCaptureViewModelTest.kt | 11 +- ...eedbackAutoCaptureFragmentViewModelTest.kt | 16 +- .../LiveFeedbackFragmentViewModelTest.kt | 12 +- .../feature/clientapi/ClientApiViewModel.kt | 6 +- .../mappers/request/IntentToActionMapper.kt | 6 +- .../validators/ConfirmIdentityValidator.kt | 6 +- .../DeleteSessionEventsIfNeededUseCase.kt | 8 +- ...tEnrolmentCreationEventForRecordUseCase.kt | 6 +- .../clientapi/ClientApiViewModelTest.kt | 8 +- .../request/IntentToActionMapperTest.kt | 8 +- .../ConfirmIdentityActionFactory.kt | 10 +- .../ConfirmIdentityValidatorTest.kt | 24 +-- .../DeleteSessionEventsIfNeededUseCaseTest.kt | 30 ++-- ...olmentCreationEventForRecordUseCaseTest.kt | 22 ++- .../screens/consent/ConsentViewModel.kt | 6 +- .../screens/privacy/PrivacyNoticeViewModel.kt | 10 +- .../screens/consent/ConsentViewModelTest.kt | 10 +- .../privacy/PrivacyNoticeViewModelTest.kt | 28 ++-- .../dashboard/logout/LogoutSyncViewModel.kt | 6 +- .../feature/dashboard/main/MainViewModel.kt | 6 +- .../projectdetails/ProjectDetailsViewModel.kt | 7 +- .../dashboard/settings/SettingsViewModel.kt | 15 +- .../settings/about/AboutViewModel.kt | 8 +- .../FingerSelectionViewModel.kt | 8 +- .../settings/syncinfo/SyncInfoViewModel.kt | 10 +- .../ModuleSelectionViewModel.kt | 11 +- .../repository/ModuleRepositoryImpl.kt | 12 +- .../ObserveConfigurationChangesUseCase.kt | 12 +- .../logout/LogoutSyncViewModelTest.kt | 10 +- .../dashboard/main/MainViewModelTest.kt | 14 +- .../ProjectDetailsViewModelTest.kt | 12 +- .../settings/SettingsViewModelTest.kt | 18 +-- .../settings/about/AboutViewModelTest.kt | 42 ++--- .../FingerSelectionViewModelTest.kt | 6 +- .../syncinfo/SyncInfoViewModelTest.kt | 144 ++++++++++-------- .../ModuleSelectionViewModelTest.kt | 12 +- .../repository/ModuleRepositoryImplTest.kt | 13 +- .../ObserveConfigurationChangesUseCaseTest.kt | 30 ++-- .../screen/EnrolLastBiometricViewModel.kt | 10 +- .../screen/EnrolLastBiometricViewModelTest.kt | 20 +-- .../exitform/screen/ExitFormViewModel.kt | 7 +- .../exitform/screen/ExitFormViewModelTest.kt | 10 +- .../controller/ExternalCredentialViewModel.kt | 6 +- .../ExternalCredentialScanOcrViewModel.kt | 8 +- .../ExternalCredentialScanQrViewModel.kt | 7 +- .../ExternalCredentialSearchViewModel.kt | 10 +- .../ExternalCredentialEventTrackerUseCase.kt | 6 +- ...esetExternalCredentialsInSessionUseCase.kt | 6 +- .../ExternalCredentialViewModelTest.kt | 10 +- .../ExternalCredentialScanOcrViewModelTest.kt | 10 +- .../ExternalCredentialScanQrViewModelTest.kt | 10 +- .../ExternalCredentialSearchViewModelTest.kt | 18 +-- ...ternalCredentialEventTrackerUseCaseTest.kt | 12 +- ...ExternalCredentialsInSessionUseCaseTest.kt | 14 +- .../feature/logincheck/LoginCheckViewModel.kt | 6 +- .../EnsureActionFieldsTokenizedUseCase.kt | 6 +- .../usecases/ExtractCrashKeysUseCase.kt | 8 +- .../usecases/StartBackgroundSyncUseCase.kt | 9 +- .../UpdateProjectInCurrentSessionUseCase.kt | 8 +- .../UpdateSessionScopePayloadUseCase.kt | 6 +- .../logincheck/LoginCheckViewModelTest.kt | 20 +-- .../EnsureActionFieldsTokenisedUseCaseTest.kt | 18 +-- .../usecases/ExtractCrashKeysUseCaseTest.kt | 10 +- .../StartBackgroundSyncUseCaseTest.kt | 14 +- ...pdateProjectInCurrentSessionUseCaseTest.kt | 10 +- .../UpdateSessionScopePayloadUseCaseTest.kt | 8 +- .../matcher/screen/MatchViewModel.kt | 8 +- .../matcher/screen/MatchViewModelTest.kt | 12 +- .../orchestrator/OrchestratorViewModel.kt | 16 +- .../orchestrator/OrchestratorViewModelTest.kt | 22 +-- .../screen/SelectSubjectViewModel.kt | 6 +- .../screen/SelectSubjectViewModelTest.kt | 10 +- .../feature/setup/screen/SetupViewModel.kt | 10 +- .../setup/screen/SetupViewModelTest.kt | 32 ++-- .../overview/usecase/ExportLogsUseCase.kt | 6 +- .../overview/usecase/ExportLogsUseCaseTest.kt | 8 +- .../screen/FingerprintCaptureViewModel.kt | 8 +- .../ObserveFingerprintScanStatusUseCase.kt | 6 +- .../screen/FingerprintCaptureViewModelTest.kt | 8 +- ...ObserveFingerprintScanStatusUseCaseTest.kt | 12 +- .../screens/ConnectScannerViewModel.kt | 6 +- .../connect/screens/ota/OtaViewModel.kt | 6 +- .../screens/ConnectScannerViewModelTest.kt | 10 +- .../connect/screens/ota/OtaViewModelTest.kt | 8 +- .../remote/ImageDistortionConfigRemoteRepo.kt | 6 +- .../ImageDistortionConfigRemoteRepoTest.kt | 14 +- .../infra/scanner/data/FirmwareRepository.kt | 12 +- .../helpers/ScannerInitialSetupHelper.kt | 6 +- .../infra/scanner/wrapper/ScannerFactory.kt | 6 +- .../scanner/data/FirmwareRepositoryTest.kt | 8 +- .../helpers/ScannerInitialSetupHelperTest.kt | 6 +- .../scanner/wrapper/ScannerFactoryTest.kt | 6 +- .../authenticator/ProjectAuthenticator.kt | 8 +- .../authlogic/authenticator/SignerManager.kt | 12 +- .../authenticator/ProjectAuthenticatorTest.kt | 19 +-- .../authenticator/SignerManagerTest.kt | 61 ++++---- .../down/EventDownSyncScopeRepository.kt | 6 +- .../down/BaseEventDownSyncWorkersBuilder.kt | 5 +- .../down/CommCareEventSyncWorkersBuilder.kt | 8 +- .../SimprintsEventDownSyncWorkersBuilder.kt | 10 +- .../sync/down/tasks/BaseEventDownSyncTask.kt | 6 +- .../sync/down/tasks/CommCareEventSyncTask.kt | 6 +- .../down/tasks/SimprintsEventDownSyncTask.kt | 6 +- .../sync/master/EventSyncMasterWorker.kt | 8 +- .../sync/up/tasks/EventUpSyncTask.kt | 8 +- .../down/EventDownSyncScopeRepositoryTest.kt | 6 +- .../CommCareEventSyncWorkersBuilderTest.kt | 8 +- ...imprintsEventDownSyncWorkersBuilderTest.kt | 17 +-- .../down/tasks/CommCareEventSyncTaskTest.kt | 8 +- .../tasks/SimprintsEventDownSyncTaskTest.kt | 16 +- .../sync/master/EventSyncMasterWorkerTest.kt | 15 +- .../sync/up/tasks/EventUpSyncTaskTest.kt | 12 +- .../remote/firebase/FirebaseSampleUploader.kt | 6 +- .../firebase/FirebaseSampleUploaderTest.kt | 11 +- .../usecase/FingerprintMatcherUseCase.kt | 8 +- .../matching/usecase/SaveMatchEventUseCase.kt | 6 +- .../usecase/FingerprintMatcherUseCaseTest.kt | 14 +- .../usecase/SaveMatchEventUseCaseTest.kt | 8 +- .../infra/sync/SyncOrchestratorImpl.kt | 8 +- .../worker/DeviceConfigDownSyncWorker.kt | 6 +- .../worker/ProjectConfigDownSyncWorker.kt | 10 +- .../sync/enrolments/EnrolmentRecordWorker.kt | 6 +- .../ShouldScheduleFirmwareUpdateUseCase.kt | 6 +- .../infra/sync/SyncOrchestratorImplTest.kt | 10 +- .../worker/DeviceConfigDownSyncWorkerTest.kt | 12 +- .../worker/ProjectConfigDownSyncWorkerTest.kt | 10 +- .../enrolments/EnrolmentRecordWorkerTest.kt | 77 ++++++---- ...ShouldScheduleFirmwareUpdateUseCaseTest.kt | 12 +- 130 files changed, 842 insertions(+), 799 deletions(-) diff --git a/face/capture/src/main/java/com/simprints/face/capture/screens/FaceCaptureViewModel.kt b/face/capture/src/main/java/com/simprints/face/capture/screens/FaceCaptureViewModel.kt index 432d1410d6..be924e9a54 100644 --- a/face/capture/src/main/java/com/simprints/face/capture/screens/FaceCaptureViewModel.kt +++ b/face/capture/src/main/java/com/simprints/face/capture/screens/FaceCaptureViewModel.kt @@ -6,9 +6,9 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.simprints.core.DeviceID -import com.simprints.core.domain.common.Modality import com.simprints.core.domain.capture.BiometricReferenceCapture import com.simprints.core.domain.capture.BiometricTemplateCapture +import com.simprints.core.domain.common.Modality import com.simprints.core.livedata.LiveDataEvent import com.simprints.core.livedata.LiveDataEventWithContent import com.simprints.core.livedata.send @@ -20,8 +20,8 @@ import com.simprints.face.capture.usecases.ShouldShowInstructionsScreenUseCase import com.simprints.face.capture.usecases.SimpleCaptureEventReporter import com.simprints.face.infra.biosdkresolver.ResolveFaceBioSdkUseCase import com.simprints.infra.authstore.AuthStore +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.FaceConfiguration -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.license.LicenseRepository import com.simprints.infra.license.LicenseStatus import com.simprints.infra.license.SaveLicenseCheckEventUseCase @@ -47,7 +47,7 @@ import javax.inject.Inject @HiltViewModel internal class FaceCaptureViewModel @Inject constructor( private val authStore: AuthStore, - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val saveFaceImage: SaveFaceSampleUseCase, private val eventReporter: SimpleCaptureEventReporter, private val bitmapToByteArray: BitmapToByteArrayUseCase, @@ -117,7 +117,7 @@ internal class FaceCaptureViewModel @Inject constructor( activity, licenseVendor, LicenseVersion( - configManager + configRepository .getProjectConfiguration() .face ?.rankOne @@ -174,7 +174,7 @@ internal class FaceCaptureViewModel @Inject constructor( fun flowFinished() { Simber.i("Finishing capture flow", tag = FACE_CAPTURE) viewModelScope.launch { - val faceConfiguration = configManager.getProjectConfiguration().face?.getSdkConfiguration(bioSDK) + val faceConfiguration = configRepository.getProjectConfiguration().face?.getSdkConfiguration(bioSDK) if (faceConfiguration?.imageSavingStrategy?.shouldSaveImage() == true) { saveFaceDetections() } diff --git a/face/capture/src/main/java/com/simprints/face/capture/screens/livefeedback/LiveFeedbackFragmentViewModel.kt b/face/capture/src/main/java/com/simprints/face/capture/screens/livefeedback/LiveFeedbackFragmentViewModel.kt index b13e61d442..233e1c221c 100644 --- a/face/capture/src/main/java/com/simprints/face/capture/screens/livefeedback/LiveFeedbackFragmentViewModel.kt +++ b/face/capture/src/main/java/com/simprints/face/capture/screens/livefeedback/LiveFeedbackFragmentViewModel.kt @@ -14,10 +14,10 @@ import com.simprints.face.capture.usecases.SimpleCaptureEventReporter import com.simprints.face.infra.basebiosdk.detection.Face import com.simprints.face.infra.basebiosdk.detection.FaceDetector import com.simprints.face.infra.biosdkresolver.ResolveFaceBioSdkUseCase +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.ExperimentalProjectConfiguration.Companion.FACE_AUTO_CAPTURE_IMAGING_DURATION_MILLIS_DEFAULT import com.simprints.infra.config.store.models.FaceConfiguration import com.simprints.infra.config.store.models.experimental -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.logging.LoggingConstants.CrashReportTag.FACE_CAPTURE import com.simprints.infra.logging.Simber import dagger.hilt.android.lifecycle.HiltViewModel @@ -33,7 +33,7 @@ import javax.inject.Inject @HiltViewModel internal class LiveFeedbackFragmentViewModel @Inject constructor( private val resolveFaceBioSdk: ResolveFaceBioSdkUseCase, - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val eventReporter: SimpleCaptureEventReporter, private val timeHelper: TimeHelper, private val isUsingAutoCaptureUseCase: IsUsingAutoCaptureUseCase, @@ -68,7 +68,7 @@ internal class LiveFeedbackFragmentViewModel @Inject constructor( private lateinit var faceDetector: FaceDetector suspend fun initAutoCapture() { - val config = configManager.getProjectConfiguration() + val config = configRepository.getProjectConfiguration() isAutoCapture = isUsingAutoCaptureUseCase(config) } @@ -83,7 +83,7 @@ internal class LiveFeedbackFragmentViewModel @Inject constructor( viewModelScope.launch { faceDetector = resolveFaceBioSdk(bioSdk).detector - val config = configManager.getProjectConfiguration() + val config = configRepository.getProjectConfiguration() qualityThreshold = config.face?.getSdkConfiguration(bioSdk)?.qualityThreshold ?: 0f singleQualityFallbackCaptureRequired = config.experimental().singleQualityFallbackRequired autoCaptureImagingDurationMillis = config.experimental().faceAutoCaptureImagingDurationMillis diff --git a/face/capture/src/test/java/com/simprints/face/capture/screens/FaceCaptureViewModelTest.kt b/face/capture/src/test/java/com/simprints/face/capture/screens/FaceCaptureViewModelTest.kt index f736f74cc2..fffa6eda9c 100644 --- a/face/capture/src/test/java/com/simprints/face/capture/screens/FaceCaptureViewModelTest.kt +++ b/face/capture/src/test/java/com/simprints/face/capture/screens/FaceCaptureViewModelTest.kt @@ -5,15 +5,14 @@ import com.google.common.truth.Truth.* import com.simprints.core.tools.time.Timestamp import com.simprints.face.capture.models.FaceDetection import com.simprints.face.capture.usecases.BitmapToByteArrayUseCase -import com.simprints.face.capture.usecases.IsUsingAutoCaptureUseCase import com.simprints.face.capture.usecases.SaveFaceSampleUseCase import com.simprints.face.capture.usecases.ShouldShowInstructionsScreenUseCase import com.simprints.face.capture.usecases.SimpleCaptureEventReporter import com.simprints.face.infra.basebiosdk.initialization.FaceBioSdkInitializer import com.simprints.infra.authstore.AuthStore +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.FaceConfiguration import com.simprints.infra.config.store.models.FaceConfiguration.ImageSavingStrategy -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.license.LicenseRepository import com.simprints.infra.license.LicenseStatus import com.simprints.infra.license.SaveLicenseCheckEventUseCase @@ -44,7 +43,7 @@ class FaceCaptureViewModelTest { private lateinit var authStore: AuthStore @MockK - private lateinit var configManager: ConfigManager + private lateinit var configRepository: ConfigRepository @MockK private lateinit var faceImageUseCase: SaveFaceSampleUseCase @@ -85,7 +84,7 @@ class FaceCaptureViewModelTest { viewModel = FaceCaptureViewModel( authStore, - configManager, + configRepository, faceImageUseCase, eventReporter, bitmapToByteArrayUseCase, @@ -102,7 +101,7 @@ class FaceCaptureViewModelTest { @Test fun `Save face detections should not be called when image saving strategy set to NEVER`() { coEvery { - configManager + configRepository .getProjectConfiguration() .face ?.getSdkConfiguration(any()) @@ -117,7 +116,7 @@ class FaceCaptureViewModelTest { @Test fun `Save face detections should be called when image saving strategy set to ONLY_GOOD_SCAN`() { coEvery { - configManager + configRepository .getProjectConfiguration() .face ?.getSdkConfiguration(any()) diff --git a/face/capture/src/test/java/com/simprints/face/capture/screens/livefeedback/LiveFeedbackAutoCaptureFragmentViewModelTest.kt b/face/capture/src/test/java/com/simprints/face/capture/screens/livefeedback/LiveFeedbackAutoCaptureFragmentViewModelTest.kt index fa0f6ed685..6c5728bcbf 100644 --- a/face/capture/src/test/java/com/simprints/face/capture/screens/livefeedback/LiveFeedbackAutoCaptureFragmentViewModelTest.kt +++ b/face/capture/src/test/java/com/simprints/face/capture/screens/livefeedback/LiveFeedbackAutoCaptureFragmentViewModelTest.kt @@ -13,9 +13,9 @@ import com.simprints.face.capture.usecases.SimpleCaptureEventReporter import com.simprints.face.infra.basebiosdk.detection.Face import com.simprints.face.infra.basebiosdk.detection.FaceDetector import com.simprints.face.infra.biosdkresolver.ResolveFaceBioSdkUseCase +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.FaceConfiguration import com.simprints.infra.config.store.models.experimental -import com.simprints.infra.config.sync.ConfigManager import com.simprints.testtools.common.coroutines.TestCoroutineRule import com.simprints.testtools.common.livedata.testObserver import io.mockk.* @@ -48,7 +48,7 @@ internal class LiveFeedbackAutoCaptureFragmentViewModelTest { lateinit var previewFrame: Bitmap @MockK - lateinit var configManager: ConfigManager + lateinit var configRepository: ConfigRepository @MockK lateinit var eventReporter: SimpleCaptureEventReporter @@ -66,7 +66,7 @@ internal class LiveFeedbackAutoCaptureFragmentViewModelTest { MockKAnnotations.init(this, relaxed = true) coEvery { - configManager + configRepository .getProjectConfiguration() .face ?.getSdkConfiguration(any()) @@ -74,7 +74,7 @@ internal class LiveFeedbackAutoCaptureFragmentViewModelTest { } returns QUALITY_THRESHOLD every { isUsingAutoCapture.invoke(any()) } returns true coEvery { - configManager.getProjectConfiguration().experimental().singleQualityFallbackRequired + configRepository.getProjectConfiguration().experimental().singleQualityFallbackRequired } returns false every { timeHelper.now() } returnsMany (0..100L).map { Timestamp(it) } justRun { previewFrame.recycle() } @@ -86,7 +86,7 @@ internal class LiveFeedbackAutoCaptureFragmentViewModelTest { viewModel = LiveFeedbackFragmentViewModel( resolveFaceBioSdkUseCase, - configManager, + configRepository, eventReporter, timeHelper, isUsingAutoCapture, @@ -294,7 +294,7 @@ internal class LiveFeedbackAutoCaptureFragmentViewModelTest { val badQuality: Face = getFace(quality = -2f) coEvery { - configManager.getProjectConfiguration().experimental().singleQualityFallbackRequired + configRepository.getProjectConfiguration().experimental().singleQualityFallbackRequired } returns true every { faceDetector.analyze(frame) } returnsMany listOf( @@ -325,7 +325,7 @@ internal class LiveFeedbackAutoCaptureFragmentViewModelTest { fun `Use default imaging duration when not configured`() = runTest { coEvery { faceDetector.analyze(frame) } returns getFace() coEvery { - configManager + configRepository .getProjectConfiguration() .experimental() .faceAutoCaptureImagingDurationMillis @@ -352,7 +352,7 @@ internal class LiveFeedbackAutoCaptureFragmentViewModelTest { val configDuration = 5000L coEvery { faceDetector.analyze(frame) } returns getFace() coEvery { - configManager + configRepository .getProjectConfiguration() .experimental() .faceAutoCaptureImagingDurationMillis diff --git a/face/capture/src/test/java/com/simprints/face/capture/screens/livefeedback/LiveFeedbackFragmentViewModelTest.kt b/face/capture/src/test/java/com/simprints/face/capture/screens/livefeedback/LiveFeedbackFragmentViewModelTest.kt index 3899be4d40..ca76360553 100644 --- a/face/capture/src/test/java/com/simprints/face/capture/screens/livefeedback/LiveFeedbackFragmentViewModelTest.kt +++ b/face/capture/src/test/java/com/simprints/face/capture/screens/livefeedback/LiveFeedbackFragmentViewModelTest.kt @@ -13,9 +13,9 @@ import com.simprints.face.capture.usecases.SimpleCaptureEventReporter import com.simprints.face.infra.basebiosdk.detection.Face import com.simprints.face.infra.basebiosdk.detection.FaceDetector import com.simprints.face.infra.biosdkresolver.ResolveFaceBioSdkUseCase +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.FaceConfiguration import com.simprints.infra.config.store.models.experimental -import com.simprints.infra.config.sync.ConfigManager import com.simprints.testtools.common.coroutines.TestCoroutineRule import com.simprints.testtools.common.livedata.testObserver import io.mockk.* @@ -45,7 +45,7 @@ internal class LiveFeedbackFragmentViewModelTest { lateinit var previewFrame: Bitmap @MockK - lateinit var configManager: ConfigManager + lateinit var configRepository: ConfigRepository @MockK lateinit var eventReporter: SimpleCaptureEventReporter @@ -62,14 +62,14 @@ internal class LiveFeedbackFragmentViewModelTest { MockKAnnotations.init(this, relaxed = true) coEvery { - configManager + configRepository .getProjectConfiguration() .face ?.getSdkConfiguration(any()) ?.qualityThreshold } returns QUALITY_THRESHOLD every { isUsingAutoCapture.invoke(any()) } returns false - coEvery { configManager.getProjectConfiguration().experimental().singleQualityFallbackRequired } returns false + coEvery { configRepository.getProjectConfiguration().experimental().singleQualityFallbackRequired } returns false every { timeHelper.now() } returnsMany (0..100L).map { Timestamp(it) } justRun { previewFrame.recycle() } val resolveFaceBioSdkUseCase = mockk { @@ -80,7 +80,7 @@ internal class LiveFeedbackFragmentViewModelTest { viewModel = LiveFeedbackFragmentViewModel( resolveFaceBioSdkUseCase, - configManager, + configRepository, eventReporter, timeHelper, isUsingAutoCapture, @@ -163,7 +163,7 @@ internal class LiveFeedbackFragmentViewModelTest { val validFace: Face = getFace() val badQuality: Face = getFace(quality = -2f) - coEvery { configManager.getProjectConfiguration().experimental().singleQualityFallbackRequired } returns true + coEvery { configRepository.getProjectConfiguration().experimental().singleQualityFallbackRequired } returns true every { faceDetector.analyze(frame) } returnsMany listOf( badQuality, diff --git a/feature/client-api/src/main/java/com/simprints/feature/clientapi/ClientApiViewModel.kt b/feature/client-api/src/main/java/com/simprints/feature/clientapi/ClientApiViewModel.kt index 09964b602c..1d5a119aca 100644 --- a/feature/client-api/src/main/java/com/simprints/feature/clientapi/ClientApiViewModel.kt +++ b/feature/client-api/src/main/java/com/simprints/feature/clientapi/ClientApiViewModel.kt @@ -22,10 +22,10 @@ import com.simprints.feature.clientapi.usecases.GetCurrentSessionIdUseCase import com.simprints.feature.clientapi.usecases.GetEnrolmentCreationEventForRecordUseCase import com.simprints.feature.clientapi.usecases.IsFlowCompletedWithErrorUseCase import com.simprints.feature.clientapi.usecases.SimpleEventReporter +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.Project import com.simprints.infra.config.store.models.TokenKeyType import com.simprints.infra.config.store.tokenization.TokenizationProcessor -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.logging.LoggingConstants.CrashReportTag.ORCHESTRATION import com.simprints.infra.logging.Simber import com.simprints.infra.orchestration.data.ActionRequest @@ -54,7 +54,7 @@ class ClientApiViewModel @Inject internal constructor( private val getEnrolmentCreationEventForRecord: GetEnrolmentCreationEventForRecordUseCase, private val deleteSessionEventsIfNeeded: DeleteSessionEventsIfNeededUseCase, private val isFlowCompletedWithError: IsFlowCompletedWithErrorUseCase, - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val timeHelper: TimeHelper, private val persistentLogger: PersistentLogger, private val tokenizationProcessor: TokenizationProcessor, @@ -71,7 +71,7 @@ class ClientApiViewModel @Inject internal constructor( get() = _showAlert private val _showAlert = MutableLiveData>() - private suspend fun getProject() = runCatching { configManager.getProject() }.getOrNull() + private suspend fun getProject() = runCatching { configRepository.getProject() }.getOrNull() suspend fun handleIntent( action: String, diff --git a/feature/client-api/src/main/java/com/simprints/feature/clientapi/mappers/request/IntentToActionMapper.kt b/feature/client-api/src/main/java/com/simprints/feature/clientapi/mappers/request/IntentToActionMapper.kt index 93906d9de2..821360eb6c 100644 --- a/feature/client-api/src/main/java/com/simprints/feature/clientapi/mappers/request/IntentToActionMapper.kt +++ b/feature/client-api/src/main/java/com/simprints/feature/clientapi/mappers/request/IntentToActionMapper.kt @@ -26,9 +26,9 @@ import com.simprints.feature.clientapi.models.CommCareConstants import com.simprints.feature.clientapi.models.LibSimprintsConstants import com.simprints.feature.clientapi.models.OdkConstants import com.simprints.feature.clientapi.usecases.GetCurrentSessionIdUseCase +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.Project import com.simprints.infra.config.store.tokenization.TokenizationProcessor -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.events.EventRepository import com.simprints.infra.orchestration.data.ActionConstants import com.simprints.infra.orchestration.data.ActionRequest @@ -41,7 +41,7 @@ internal class IntentToActionMapper @Inject constructor( private val tokenizationProcessor: TokenizationProcessor, private val timeHelper: TimeHelper, private val eventRepository: EventRepository, - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, ) { suspend operator fun invoke( action: String, @@ -264,7 +264,7 @@ internal class IntentToActionMapper @Inject constructor( extractor = extractor, currentSessionId = getCurrentSessionId(), eventRepository = eventRepository, - configManager = configManager, + configRepository = configRepository, ), ) } diff --git a/feature/client-api/src/main/java/com/simprints/feature/clientapi/mappers/request/validators/ConfirmIdentityValidator.kt b/feature/client-api/src/main/java/com/simprints/feature/clientapi/mappers/request/validators/ConfirmIdentityValidator.kt index e2b5dd1f1c..725d3f7252 100644 --- a/feature/client-api/src/main/java/com/simprints/feature/clientapi/mappers/request/validators/ConfirmIdentityValidator.kt +++ b/feature/client-api/src/main/java/com/simprints/feature/clientapi/mappers/request/validators/ConfirmIdentityValidator.kt @@ -3,8 +3,8 @@ package com.simprints.feature.clientapi.mappers.request.validators import com.simprints.feature.clientapi.exceptions.InvalidRequestException import com.simprints.feature.clientapi.mappers.request.extractors.ConfirmIdentityRequestExtractor import com.simprints.feature.clientapi.models.ClientApiError +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.experimental -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.events.EventRepository import com.simprints.infra.events.event.domain.models.callback.IdentificationCallbackEvent import com.simprints.infra.logging.LoggingConstants.CrashReportTag.SESSION @@ -14,7 +14,7 @@ internal class ConfirmIdentityValidator( private val extractor: ConfirmIdentityRequestExtractor, private val currentSessionId: String, private val eventRepository: EventRepository, - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, ) : RequestActionValidator(extractor) { private var identificationEvent: IdentificationCallbackEvent? = null @@ -60,7 +60,7 @@ internal class ConfirmIdentityValidator( } // Skip further validation if skip flag is enabled - if (configManager.getProjectConfiguration().experimental().allowConfirmingGuidsNotInCallback) { + if (configRepository.getProjectConfiguration().experimental().allowConfirmingGuidsNotInCallback) { return } diff --git a/feature/client-api/src/main/java/com/simprints/feature/clientapi/usecases/DeleteSessionEventsIfNeededUseCase.kt b/feature/client-api/src/main/java/com/simprints/feature/clientapi/usecases/DeleteSessionEventsIfNeededUseCase.kt index 9e335bd6b2..cf026b8dae 100644 --- a/feature/client-api/src/main/java/com/simprints/feature/clientapi/usecases/DeleteSessionEventsIfNeededUseCase.kt +++ b/feature/client-api/src/main/java/com/simprints/feature/clientapi/usecases/DeleteSessionEventsIfNeededUseCase.kt @@ -1,22 +1,22 @@ package com.simprints.feature.clientapi.usecases import com.simprints.core.SessionCoroutineScope +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.ProjectState import com.simprints.infra.config.store.models.canSyncDataToSimprints -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.events.EventRepository import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch import javax.inject.Inject internal class DeleteSessionEventsIfNeededUseCase @Inject constructor( - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val eventRepository: EventRepository, @param:SessionCoroutineScope private val sessionCoroutineScope: CoroutineScope, ) { operator fun invoke(sessionId: String) = sessionCoroutineScope.launch { - val projectNotRunning = configManager.getProject()?.state != ProjectState.RUNNING - val simprintsDataSyncDisabled = !configManager.getProjectConfiguration().canSyncDataToSimprints() + val projectNotRunning = configRepository.getProject()?.state != ProjectState.RUNNING + val simprintsDataSyncDisabled = !configRepository.getProjectConfiguration().canSyncDataToSimprints() if (simprintsDataSyncDisabled || projectNotRunning) { eventRepository.deleteEventScope(sessionId) diff --git a/feature/client-api/src/main/java/com/simprints/feature/clientapi/usecases/GetEnrolmentCreationEventForRecordUseCase.kt b/feature/client-api/src/main/java/com/simprints/feature/clientapi/usecases/GetEnrolmentCreationEventForRecordUseCase.kt index 1f4f8b602f..58b755ba91 100644 --- a/feature/client-api/src/main/java/com/simprints/feature/clientapi/usecases/GetEnrolmentCreationEventForRecordUseCase.kt +++ b/feature/client-api/src/main/java/com/simprints/feature/clientapi/usecases/GetEnrolmentCreationEventForRecordUseCase.kt @@ -6,9 +6,9 @@ import com.simprints.core.domain.tokenization.serialization.TokenizationClassNam import com.simprints.core.domain.tokenization.serialization.TokenizationClassNameSerializer import com.simprints.core.tools.json.JsonHelper import com.simprints.core.tools.utils.EncodingUtils +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.canCoSyncAllData import com.simprints.infra.config.store.models.canCoSyncBiometricData -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.enrolment.records.repository.EnrolmentRecordRepository import com.simprints.infra.enrolment.records.repository.domain.models.EnrolmentRecord import com.simprints.infra.enrolment.records.repository.domain.models.EnrolmentRecordQuery @@ -18,7 +18,7 @@ import com.simprints.infra.logging.Simber import javax.inject.Inject internal class GetEnrolmentCreationEventForRecordUseCase @Inject constructor( - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val enrolmentRecordRepository: EnrolmentRecordRepository, private val encoder: EncodingUtils, private val jsonHelper: JsonHelper, @@ -27,7 +27,7 @@ internal class GetEnrolmentCreationEventForRecordUseCase @Inject constructor( projectId: String, subjectId: String, ): String? { - val config = configManager.getProjectConfiguration() + val config = configRepository.getProjectConfiguration() if (!config.canCoSyncAllData() && !config.canCoSyncBiometricData()) { return null diff --git a/feature/client-api/src/test/java/com/simprints/feature/clientapi/ClientApiViewModelTest.kt b/feature/client-api/src/test/java/com/simprints/feature/clientapi/ClientApiViewModelTest.kt index 6cb3c2cec7..c968b5d567 100644 --- a/feature/client-api/src/test/java/com/simprints/feature/clientapi/ClientApiViewModelTest.kt +++ b/feature/client-api/src/test/java/com/simprints/feature/clientapi/ClientApiViewModelTest.kt @@ -19,10 +19,10 @@ import com.simprints.feature.clientapi.usecases.GetCurrentSessionIdUseCase import com.simprints.feature.clientapi.usecases.GetEnrolmentCreationEventForRecordUseCase import com.simprints.feature.clientapi.usecases.IsFlowCompletedWithErrorUseCase import com.simprints.feature.clientapi.usecases.SimpleEventReporter +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.Project import com.simprints.infra.config.store.models.TokenKeyType import com.simprints.infra.config.store.tokenization.TokenizationProcessor -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.orchestration.data.ActionRequest import com.simprints.infra.orchestration.data.ActionRequestIdentifier import com.simprints.infra.orchestration.data.ActionResponse @@ -70,7 +70,7 @@ internal class ClientApiViewModelTest { lateinit var isFlowCompletedWithError: IsFlowCompletedWithErrorUseCase @MockK - lateinit var configManager: ConfigManager + lateinit var configRepository: ConfigRepository @MockK lateinit var timeHelper: TimeHelper @@ -104,7 +104,7 @@ internal class ClientApiViewModelTest { getEnrolmentCreationEventForRecord = getEnrolmentCreationEventForRecord, deleteSessionEventsIfNeeded = deleteSessionEventsIfNeeded, isFlowCompletedWithError = isFlowCompletedWithError, - configManager = configManager, + configRepository = configRepository, timeHelper = timeHelper, persistentLogger = persistentLogger, tokenizationProcessor = tokenizationProcessor, @@ -318,7 +318,7 @@ internal class ClientApiViewModelTest { project: Project, returnValue: TokenizableString, ) { - coEvery { configManager.getProject() } returns project + coEvery { configRepository.getProject() } returns project every { tokenizationProcessor.decrypt( encrypted = any(), diff --git a/feature/client-api/src/test/java/com/simprints/feature/clientapi/mappers/request/IntentToActionMapperTest.kt b/feature/client-api/src/test/java/com/simprints/feature/clientapi/mappers/request/IntentToActionMapperTest.kt index e61304991a..fcac083a98 100644 --- a/feature/client-api/src/test/java/com/simprints/feature/clientapi/mappers/request/IntentToActionMapperTest.kt +++ b/feature/client-api/src/test/java/com/simprints/feature/clientapi/mappers/request/IntentToActionMapperTest.kt @@ -6,7 +6,9 @@ import com.simprints.core.tools.time.Timestamp import com.simprints.feature.clientapi.exceptions.InvalidRequestException import com.simprints.feature.clientapi.models.ClientApiConstants import com.simprints.feature.clientapi.usecases.GetCurrentSessionIdUseCase +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.tokenization.TokenizationProcessor +import com.simprints.infra.events.EventRepository import com.simprints.infra.events.event.domain.models.callback.IdentificationCallbackEvent import com.simprints.infra.orchestration.data.ActionRequest import com.simprints.libsimprints.Constants.SIMPRINTS_LIB_VERSION @@ -43,10 +45,10 @@ class IntentToActionMapperTest { private lateinit var timeHelper: TimeHelper @MockK - private lateinit var eventRepository: com.simprints.infra.events.EventRepository + private lateinit var eventRepository: EventRepository @MockK - private lateinit var configManager: com.simprints.infra.config.sync.ConfigManager + private lateinit var configRepository: ConfigRepository private lateinit var mapper: IntentToActionMapper @@ -73,7 +75,7 @@ class IntentToActionMapperTest { tokenizationProcessor, timeHelper, eventRepository, - configManager, + configRepository, ) } diff --git a/feature/client-api/src/test/java/com/simprints/feature/clientapi/mappers/request/requestFactories/ConfirmIdentityActionFactory.kt b/feature/client-api/src/test/java/com/simprints/feature/clientapi/mappers/request/requestFactories/ConfirmIdentityActionFactory.kt index 3de35f9338..9ca0a27638 100644 --- a/feature/client-api/src/test/java/com/simprints/feature/clientapi/mappers/request/requestFactories/ConfirmIdentityActionFactory.kt +++ b/feature/client-api/src/test/java/com/simprints/feature/clientapi/mappers/request/requestFactories/ConfirmIdentityActionFactory.kt @@ -5,15 +5,13 @@ import com.simprints.feature.clientapi.mappers.request.builders.ConfirmIdentifyR import com.simprints.feature.clientapi.mappers.request.extractors.ActionRequestExtractor import com.simprints.feature.clientapi.mappers.request.extractors.ConfirmIdentityRequestExtractor import com.simprints.feature.clientapi.mappers.request.validators.ConfirmIdentityValidator -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.events.EventRepository import com.simprints.infra.events.event.domain.models.callback.IdentificationCallbackEvent import com.simprints.infra.orchestration.data.ActionConstants import com.simprints.infra.orchestration.data.ActionRequest import com.simprints.infra.orchestration.data.ActionRequestIdentifier -import io.mockk.coEvery -import io.mockk.every -import io.mockk.mockk +import io.mockk.* internal object ConfirmIdentityActionFactory : RequestActionFactory() { override fun getIdentifier() = ActionRequestIdentifier( @@ -49,13 +47,13 @@ internal object ConfirmIdentityActionFactory : RequestActionFactory() { }, ) - val mockConfigManager = mockk(relaxed = true) + val mockConfigRepository = mockk(relaxed = true) return ConfirmIdentityValidator( extractor as ConfirmIdentityRequestExtractor, MOCK_SESSION_ID, mockEventRepository, - configManager = mockConfigManager, + configRepository = mockConfigRepository, ) } diff --git a/feature/client-api/src/test/java/com/simprints/feature/clientapi/mappers/request/validators/ConfirmIdentityValidatorTest.kt b/feature/client-api/src/test/java/com/simprints/feature/clientapi/mappers/request/validators/ConfirmIdentityValidatorTest.kt index 2fc8b8f359..b7431115ca 100644 --- a/feature/client-api/src/test/java/com/simprints/feature/clientapi/mappers/request/validators/ConfirmIdentityValidatorTest.kt +++ b/feature/client-api/src/test/java/com/simprints/feature/clientapi/mappers/request/validators/ConfirmIdentityValidatorTest.kt @@ -3,8 +3,8 @@ package com.simprints.feature.clientapi.mappers.request.validators import com.simprints.feature.clientapi.exceptions.InvalidRequestException import com.simprints.feature.clientapi.mappers.request.requestFactories.ConfirmIdentityActionFactory import com.simprints.feature.clientapi.mappers.request.requestFactories.RequestActionFactory +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.ProjectConfiguration -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.events.EventRepository import com.simprints.infra.events.event.domain.models.callback.CallbackComparisonScore import com.simprints.infra.events.event.domain.models.callback.IdentificationCallbackEvent @@ -37,7 +37,7 @@ internal class ConfirmIdentityValidatorTest : ActionRequestValidatorTest(Confirm private lateinit var mockProjectConfig: ProjectConfiguration @MockK(relaxed = true) - private lateinit var mockConfigManager: ConfigManager + private lateinit var mockConfigRepository: ConfigRepository @Before fun setUp() { @@ -80,7 +80,7 @@ internal class ConfirmIdentityValidatorTest : ActionRequestValidatorTest(Confirm extractor, RequestActionFactory.MOCK_SESSION_ID, mockEventRepository, - configManager = mockConfigManager, + configRepository = mockConfigRepository, ) assertThrows { validator.validate() @@ -95,7 +95,7 @@ internal class ConfirmIdentityValidatorTest : ActionRequestValidatorTest(Confirm extractor, "anotherSessionID", mockEventRepository, - configManager = mockConfigManager, + configRepository = mockConfigRepository, ) assertThrows { validator.validate() @@ -118,7 +118,7 @@ internal class ConfirmIdentityValidatorTest : ActionRequestValidatorTest(Confirm extractor, RequestActionFactory.MOCK_SESSION_ID, mockEventRepository, - configManager = mockConfigManager, + configRepository = mockConfigRepository, ) // Should not throw @@ -141,7 +141,7 @@ internal class ConfirmIdentityValidatorTest : ActionRequestValidatorTest(Confirm extractor, RequestActionFactory.MOCK_SESSION_ID, mockEventRepository, - configManager = mockConfigManager, + configRepository = mockConfigRepository, ) assertThrows { @@ -163,7 +163,7 @@ internal class ConfirmIdentityValidatorTest : ActionRequestValidatorTest(Confirm extractor, RequestActionFactory.MOCK_SESSION_ID, mockEventRepository, - configManager = mockConfigManager, + configRepository = mockConfigRepository, ) assertThrows { @@ -182,7 +182,7 @@ internal class ConfirmIdentityValidatorTest : ActionRequestValidatorTest(Confirm extractor, RequestActionFactory.MOCK_SESSION_ID, mockEventRepository, - configManager = mockConfigManager, + configRepository = mockConfigRepository, ) // Should not throw validator.validate() @@ -200,13 +200,13 @@ internal class ConfirmIdentityValidatorTest : ActionRequestValidatorTest(Confirm // Mock ConfigManager with feature flag enabled every { mockProjectConfig.custom } returns mapOf("allowConfirmingGuidsNotInCallback" to true) - coEvery { mockConfigManager.getProjectConfiguration() } returns mockProjectConfig + coEvery { mockConfigRepository.getProjectConfiguration() } returns mockProjectConfig val validator = ConfirmIdentityValidator( extractor, RequestActionFactory.MOCK_SESSION_ID, mockEventRepository, - mockConfigManager, + mockConfigRepository, ) // Should not throw despite GUID not being in results @@ -225,13 +225,13 @@ internal class ConfirmIdentityValidatorTest : ActionRequestValidatorTest(Confirm // Mock ConfigManager with feature flag disabled every { mockProjectConfig.custom } returns mapOf("allowConfirmingGuidsNotInCallback" to false) - coEvery { mockConfigManager.getProjectConfiguration() } returns mockProjectConfig + coEvery { mockConfigRepository.getProjectConfiguration() } returns mockProjectConfig val validator = ConfirmIdentityValidator( extractor, RequestActionFactory.MOCK_SESSION_ID, mockEventRepository, - mockConfigManager, + mockConfigRepository, ) // Should throw because GUID is not in results and flag is disabled diff --git a/feature/client-api/src/test/java/com/simprints/feature/clientapi/usecases/DeleteSessionEventsIfNeededUseCaseTest.kt b/feature/client-api/src/test/java/com/simprints/feature/clientapi/usecases/DeleteSessionEventsIfNeededUseCaseTest.kt index 6e2022453b..a0eeed3495 100644 --- a/feature/client-api/src/test/java/com/simprints/feature/clientapi/usecases/DeleteSessionEventsIfNeededUseCaseTest.kt +++ b/feature/client-api/src/test/java/com/simprints/feature/clientapi/usecases/DeleteSessionEventsIfNeededUseCaseTest.kt @@ -1,8 +1,8 @@ package com.simprints.feature.clientapi.usecases +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.ProjectState import com.simprints.infra.config.store.models.UpSynchronizationConfiguration -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.events.EventRepository import com.simprints.testtools.common.coroutines.TestCoroutineRule import io.mockk.* @@ -18,7 +18,7 @@ class DeleteSessionEventsIfNeededUseCaseTest { val testCoroutineRule = TestCoroutineRule() @MockK - private lateinit var configManager: ConfigManager + private lateinit var configRepository: ConfigRepository @MockK private lateinit var eventRepository: EventRepository @@ -30,7 +30,7 @@ class DeleteSessionEventsIfNeededUseCaseTest { MockKAnnotations.init(this, relaxed = true) deleteUseCase = DeleteSessionEventsIfNeededUseCase( - configManager, + configRepository, eventRepository, CoroutineScope(testCoroutineRule.testCoroutineDispatcher), ) @@ -38,9 +38,9 @@ class DeleteSessionEventsIfNeededUseCaseTest { @Test fun `deletes session events if project missing`() = runTest { - coEvery { configManager.getProject()?.state } returns null + coEvery { configRepository.getProject()?.state } returns null coEvery { - configManager + configRepository .getProjectConfiguration() .synchronization.up.simprints.kind } returns UpSynchronizationConfiguration.UpSynchronizationKind.ALL @@ -52,9 +52,9 @@ class DeleteSessionEventsIfNeededUseCaseTest { @Test fun `deletes session events if project paused`() = runTest { - coEvery { configManager.getProject()?.state } returns ProjectState.PROJECT_PAUSED + coEvery { configRepository.getProject()?.state } returns ProjectState.PROJECT_PAUSED coEvery { - configManager + configRepository .getProjectConfiguration() .synchronization.up.simprints.kind } returns UpSynchronizationConfiguration.UpSynchronizationKind.ALL @@ -66,9 +66,9 @@ class DeleteSessionEventsIfNeededUseCaseTest { @Test fun `deletes session events if project ending`() = runTest { - coEvery { configManager.getProject()?.state } returns ProjectState.PROJECT_ENDING + coEvery { configRepository.getProject()?.state } returns ProjectState.PROJECT_ENDING coEvery { - configManager + configRepository .getProjectConfiguration() .synchronization.up.simprints.kind } returns UpSynchronizationConfiguration.UpSynchronizationKind.ALL @@ -80,9 +80,9 @@ class DeleteSessionEventsIfNeededUseCaseTest { @Test fun `deletes session events if project ended`() = runTest { - coEvery { configManager.getProject()?.state } returns ProjectState.PROJECT_ENDED + coEvery { configRepository.getProject()?.state } returns ProjectState.PROJECT_ENDED coEvery { - configManager + configRepository .getProjectConfiguration() .synchronization.up.simprints.kind } returns UpSynchronizationConfiguration.UpSynchronizationKind.ALL @@ -94,9 +94,9 @@ class DeleteSessionEventsIfNeededUseCaseTest { @Test fun `deletes session events if data sync disabled in running project`() = runTest { - coEvery { configManager.getProject()?.state } returns ProjectState.RUNNING + coEvery { configRepository.getProject()?.state } returns ProjectState.RUNNING coEvery { - configManager + configRepository .getProjectConfiguration() .synchronization.up.simprints.kind } returns UpSynchronizationConfiguration.UpSynchronizationKind.NONE @@ -108,9 +108,9 @@ class DeleteSessionEventsIfNeededUseCaseTest { @Test fun `does not delete session events if data sync enabled in running project`() = runTest { - coEvery { configManager.getProject()?.state } returns ProjectState.RUNNING + coEvery { configRepository.getProject()?.state } returns ProjectState.RUNNING coEvery { - configManager + configRepository .getProjectConfiguration() .synchronization.up.simprints.kind } returns UpSynchronizationConfiguration.UpSynchronizationKind.ALL diff --git a/feature/client-api/src/test/java/com/simprints/feature/clientapi/usecases/GetEnrolmentCreationEventForRecordUseCaseTest.kt b/feature/client-api/src/test/java/com/simprints/feature/clientapi/usecases/GetEnrolmentCreationEventForRecordUseCaseTest.kt index e12b2bb34f..0d27a29664 100644 --- a/feature/client-api/src/test/java/com/simprints/feature/clientapi/usecases/GetEnrolmentCreationEventForRecordUseCaseTest.kt +++ b/feature/client-api/src/test/java/com/simprints/feature/clientapi/usecases/GetEnrolmentCreationEventForRecordUseCaseTest.kt @@ -1,18 +1,14 @@ package com.simprints.feature.clientapi.usecases -import com.google.common.truth.Truth.assertThat +import com.google.common.truth.Truth.* import com.simprints.core.tools.json.JsonHelper import com.simprints.core.tools.utils.EncodingUtils +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.UpSynchronizationConfiguration -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.enrolment.records.repository.EnrolmentRecordRepository import com.simprints.testtools.common.coroutines.TestCoroutineRule -import io.mockk.MockKAnnotations -import io.mockk.coEvery -import io.mockk.coVerify -import io.mockk.every +import io.mockk.* import io.mockk.impl.annotations.MockK -import io.mockk.mockk import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.Rule @@ -23,7 +19,7 @@ class GetEnrolmentCreationEventForRecordUseCaseTest { val testCoroutineRule = TestCoroutineRule() @MockK - private lateinit var configManager: ConfigManager + private lateinit var configRepository: ConfigRepository @MockK private lateinit var enrolmentRecordRepository: EnrolmentRecordRepository @@ -43,7 +39,7 @@ class GetEnrolmentCreationEventForRecordUseCaseTest { every { jsonHelper.toJson(any()) } returns "json" useCase = GetEnrolmentCreationEventForRecordUseCase( - configManager, + configRepository, enrolmentRecordRepository, encoder, jsonHelper, @@ -52,7 +48,7 @@ class GetEnrolmentCreationEventForRecordUseCaseTest { @Test fun `returns null if coSync disabled`() = runTest { - coEvery { configManager.getProjectConfiguration() } returns mockk { + coEvery { configRepository.getProjectConfiguration() } returns mockk { every { synchronization.up.coSync.kind } returns UpSynchronizationConfiguration.UpSynchronizationKind.NONE } @@ -64,7 +60,7 @@ class GetEnrolmentCreationEventForRecordUseCaseTest { @Test fun `returns null if only analytics sync enabled`() = runTest { - coEvery { configManager.getProjectConfiguration() } returns mockk { + coEvery { configRepository.getProjectConfiguration() } returns mockk { every { synchronization.up.coSync.kind } returns UpSynchronizationConfiguration.UpSynchronizationKind.ONLY_ANALYTICS } @@ -76,7 +72,7 @@ class GetEnrolmentCreationEventForRecordUseCaseTest { @Test fun `returns null if no creation event`() = runTest { - coEvery { configManager.getProjectConfiguration() } returns mockk { + coEvery { configRepository.getProjectConfiguration() } returns mockk { every { synchronization.up.coSync.kind } returns UpSynchronizationConfiguration.UpSynchronizationKind.ONLY_BIOMETRICS } @@ -89,7 +85,7 @@ class GetEnrolmentCreationEventForRecordUseCaseTest { @Test fun `returns event if biometrics coSync enabled`() = runTest { - coEvery { configManager.getProjectConfiguration() } returns mockk { + coEvery { configRepository.getProjectConfiguration() } returns mockk { every { synchronization.up.coSync.kind } returns UpSynchronizationConfiguration.UpSynchronizationKind.ONLY_BIOMETRICS } diff --git a/feature/consent/src/main/java/com/simprints/feature/consent/screens/consent/ConsentViewModel.kt b/feature/consent/src/main/java/com/simprints/feature/consent/screens/consent/ConsentViewModel.kt index 38a96406cf..9dbc5be80a 100644 --- a/feature/consent/src/main/java/com/simprints/feature/consent/screens/consent/ConsentViewModel.kt +++ b/feature/consent/src/main/java/com/simprints/feature/consent/screens/consent/ConsentViewModel.kt @@ -14,8 +14,8 @@ import com.simprints.feature.consent.ConsentType import com.simprints.feature.consent.screens.consent.helpers.GeneralConsentTextHelper import com.simprints.feature.consent.screens.consent.helpers.ParentalConsentTextHelper import com.simprints.feature.exitform.ExitFormResult +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.ProjectConfiguration -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.events.event.domain.models.ConsentEvent import com.simprints.infra.events.session.SessionEventRepository import dagger.hilt.android.lifecycle.HiltViewModel @@ -27,7 +27,7 @@ import javax.inject.Inject @HiltViewModel internal class ConsentViewModel @Inject constructor( private val timeHelper: TimeHelper, - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val eventRepository: SessionEventRepository, @param:SessionCoroutineScope private val sessionCoroutineScope: CoroutineScope, ) : ViewModel() { @@ -48,7 +48,7 @@ internal class ConsentViewModel @Inject constructor( fun loadConfiguration(consentType: ConsentType) { viewModelScope.launch { - val projectConfig = configManager.getProjectConfiguration() + val projectConfig = configRepository.getProjectConfiguration() _viewState.postValue( mapConfigToViewState( projectConfig = projectConfig, diff --git a/feature/consent/src/main/java/com/simprints/feature/consent/screens/privacy/PrivacyNoticeViewModel.kt b/feature/consent/src/main/java/com/simprints/feature/consent/screens/privacy/PrivacyNoticeViewModel.kt index 03076a585d..5df63cec9e 100644 --- a/feature/consent/src/main/java/com/simprints/feature/consent/screens/privacy/PrivacyNoticeViewModel.kt +++ b/feature/consent/src/main/java/com/simprints/feature/consent/screens/privacy/PrivacyNoticeViewModel.kt @@ -8,12 +8,12 @@ import com.simprints.core.livedata.LiveDataEvent import com.simprints.core.livedata.send import com.simprints.core.tools.utils.TimeUtils import com.simprints.infra.authstore.AuthStore +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.PrivacyNoticeResult import com.simprints.infra.config.store.models.PrivacyNoticeResult.Failed import com.simprints.infra.config.store.models.PrivacyNoticeResult.FailedBecauseBackendMaintenance import com.simprints.infra.config.store.models.PrivacyNoticeResult.InProgress import com.simprints.infra.config.store.models.PrivacyNoticeResult.Succeed -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.logging.Simber import com.simprints.infra.network.ConnectivityTracker import dagger.hilt.android.lifecycle.HiltViewModel @@ -28,7 +28,7 @@ import javax.inject.Inject @HiltViewModel internal class PrivacyNoticeViewModel @Inject constructor( private val connectivityTracker: ConnectivityTracker, - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val authStore: AuthStore, ) : ViewModel() { private val _viewState = MutableLiveData() @@ -49,8 +49,8 @@ internal class PrivacyNoticeViewModel @Inject constructor( fun retrievePrivacyNotice() = viewModelScope.launch { val projectId = authStore.signedInProjectId - val deviceLanguage = configManager.getDeviceConfiguration().language - val defaultLanguage = configManager.getProjectConfiguration().general.defaultLanguage + val deviceLanguage = configRepository.getDeviceConfiguration().language + val defaultLanguage = configRepository.getProjectConfiguration().general.defaultLanguage attemptDownloadingLanguage(projectId, deviceLanguage) .flatMapLatest { @@ -71,7 +71,7 @@ internal class PrivacyNoticeViewModel @Inject constructor( private fun attemptDownloadingLanguage( projectId: String, deviceLanguage: String, - ): Flow = configManager.getPrivacyNotice(projectId, deviceLanguage).map { it.toPrivacyNoticeViewState() } + ): Flow = configRepository.getPrivacyNotice(projectId, deviceLanguage).map { it.toPrivacyNoticeViewState() } private fun PrivacyNoticeResult.toPrivacyNoticeViewState(): PrivacyNoticeState = when (this) { is Succeed -> PrivacyNoticeState.ConsentAvailable(consent) diff --git a/feature/consent/src/test/java/com/simprints/feature/consent/screens/consent/ConsentViewModelTest.kt b/feature/consent/src/test/java/com/simprints/feature/consent/screens/consent/ConsentViewModelTest.kt index aacb2a8c07..752d5214e3 100644 --- a/feature/consent/src/test/java/com/simprints/feature/consent/screens/consent/ConsentViewModelTest.kt +++ b/feature/consent/src/test/java/com/simprints/feature/consent/screens/consent/ConsentViewModelTest.kt @@ -8,8 +8,8 @@ import com.simprints.core.tools.time.Timestamp import com.simprints.feature.consent.ConsentResult import com.simprints.feature.consent.ConsentType import com.simprints.feature.exitform.ExitFormResult +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.ProjectConfiguration -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.events.event.domain.models.ConsentEvent import com.simprints.infra.events.session.SessionEventRepository import com.simprints.testtools.common.coroutines.TestCoroutineRule @@ -33,7 +33,7 @@ class ConsentViewModelTest { private lateinit var timeHelper: TimeHelper @MockK - private lateinit var configManager: ConfigManager + private lateinit var configRepository: ConfigRepository @MockK private lateinit var projectConfig: ProjectConfiguration @@ -48,13 +48,13 @@ class ConsentViewModelTest { @Before fun setUp() { MockKAnnotations.init(this, relaxed = true) - coEvery { configManager.getProjectConfiguration() } returns projectConfig + coEvery { configRepository.getProjectConfiguration() } returns projectConfig every { projectConfig.consent } returns mockk() every { timeHelper.now() } returns TIMESTAMP vm = ConsentViewModel( timeHelper, - configManager, + configRepository, eventRepository, CoroutineScope(testCoroutineRule.testCoroutineDispatcher), ) @@ -69,7 +69,7 @@ class ConsentViewModelTest { vm.loadConfiguration(ConsentType.ENROL) val state = vm.viewState.getOrAwaitValue() - coVerify { configManager.getProjectConfiguration() } + coVerify { configRepository.getProjectConfiguration() } assertThat(state.showLogo).isEqualTo(false) assertThat(state.consentTextBuilder).isNotNull() diff --git a/feature/consent/src/test/java/com/simprints/feature/consent/screens/privacy/PrivacyNoticeViewModelTest.kt b/feature/consent/src/test/java/com/simprints/feature/consent/screens/privacy/PrivacyNoticeViewModelTest.kt index 706c139eda..21202d054a 100644 --- a/feature/consent/src/test/java/com/simprints/feature/consent/screens/privacy/PrivacyNoticeViewModelTest.kt +++ b/feature/consent/src/test/java/com/simprints/feature/consent/screens/privacy/PrivacyNoticeViewModelTest.kt @@ -3,9 +3,9 @@ package com.simprints.feature.consent.screens.privacy import androidx.arch.core.executor.testing.InstantTaskExecutorRule import com.google.common.truth.Truth import com.simprints.infra.authstore.AuthStore +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.DeviceConfiguration import com.simprints.infra.config.store.models.PrivacyNoticeResult -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.network.ConnectivityTracker import com.simprints.testtools.common.coroutines.TestCoroutineRule import com.simprints.testtools.common.livedata.getOrAwaitValue @@ -36,7 +36,7 @@ internal class PrivacyNoticeViewModelTest { lateinit var connectivityTracker: ConnectivityTracker @MockK - lateinit var configManager: ConfigManager + lateinit var configRepository: ConfigRepository @MockK lateinit var authStore: AuthStore @@ -47,20 +47,20 @@ internal class PrivacyNoticeViewModelTest { fun setUp() { MockKAnnotations.init(this, relaxed = true) - coEvery { configManager.getDeviceConfiguration() } returns DeviceConfiguration(DEVICE_LANGUAGE, listOf(), "") - coEvery { configManager.getProjectConfiguration().general.defaultLanguage } returns DEFAULT_LANGUAGE + coEvery { configRepository.getDeviceConfiguration() } returns DeviceConfiguration(DEVICE_LANGUAGE, listOf(), "") + coEvery { configRepository.getProjectConfiguration().general.defaultLanguage } returns DEFAULT_LANGUAGE every { authStore.signedInProjectId } returns PROJECT_ID privacyNoticeViewModel = PrivacyNoticeViewModel( connectivityTracker, - configManager, + configRepository, authStore, ) } @Test fun `retrievePrivacyNotice should return DownloadInProgress when trying download`() = runTest { - coEvery { configManager.getPrivacyNotice(PROJECT_ID, DEVICE_LANGUAGE) } returns flowOf( + coEvery { configRepository.getPrivacyNotice(PROJECT_ID, DEVICE_LANGUAGE) } returns flowOf( PrivacyNoticeResult.InProgress(DEVICE_LANGUAGE), ) @@ -73,7 +73,7 @@ internal class PrivacyNoticeViewModelTest { @Test fun `retrievePrivacyNotice should return ContentAvailable when success received`() = runTest { - coEvery { configManager.getPrivacyNotice(PROJECT_ID, DEVICE_LANGUAGE) } returns flowOf( + coEvery { configRepository.getPrivacyNotice(PROJECT_ID, DEVICE_LANGUAGE) } returns flowOf( PrivacyNoticeResult.InProgress(DEVICE_LANGUAGE), PrivacyNoticeResult.Succeed(DEVICE_LANGUAGE, "some long consent"), ) @@ -87,11 +87,11 @@ internal class PrivacyNoticeViewModelTest { @Test fun `retrievePrivacyNotice should attempt default language when Failed received with initial`() = runTest { - coEvery { configManager.getPrivacyNotice(PROJECT_ID, DEVICE_LANGUAGE) } returns flowOf( + coEvery { configRepository.getPrivacyNotice(PROJECT_ID, DEVICE_LANGUAGE) } returns flowOf( PrivacyNoticeResult.InProgress(DEVICE_LANGUAGE), PrivacyNoticeResult.Failed(DEVICE_LANGUAGE, Throwable()), ) - coEvery { configManager.getPrivacyNotice(PROJECT_ID, DEFAULT_LANGUAGE) } returns flowOf( + coEvery { configRepository.getPrivacyNotice(PROJECT_ID, DEFAULT_LANGUAGE) } returns flowOf( PrivacyNoticeResult.InProgress(DEFAULT_LANGUAGE), PrivacyNoticeResult.Succeed(DEFAULT_LANGUAGE, "some long consent"), ) @@ -105,7 +105,7 @@ internal class PrivacyNoticeViewModelTest { @Test fun `retrievePrivacyNotice should return BackendMaintenance when FailedBecauseBackendMaintenance received`() = runTest { - coEvery { configManager.getPrivacyNotice(PROJECT_ID, DEVICE_LANGUAGE) } returns flowOf( + coEvery { configRepository.getPrivacyNotice(PROJECT_ID, DEVICE_LANGUAGE) } returns flowOf( PrivacyNoticeResult.InProgress(DEVICE_LANGUAGE), PrivacyNoticeResult.FailedBecauseBackendMaintenance(DEVICE_LANGUAGE, Throwable()), ) @@ -120,11 +120,11 @@ internal class PrivacyNoticeViewModelTest { @Test fun `retrievePrivacyNotice should return BackendMaintenance when FailedBecauseBackendMaintenance receivedon default language`() = runTest { - coEvery { configManager.getPrivacyNotice(PROJECT_ID, DEVICE_LANGUAGE) } returns flowOf( + coEvery { configRepository.getPrivacyNotice(PROJECT_ID, DEVICE_LANGUAGE) } returns flowOf( PrivacyNoticeResult.InProgress(DEVICE_LANGUAGE), PrivacyNoticeResult.Failed(DEVICE_LANGUAGE, Throwable()), ) - coEvery { configManager.getPrivacyNotice(PROJECT_ID, DEFAULT_LANGUAGE) } returns flowOf( + coEvery { configRepository.getPrivacyNotice(PROJECT_ID, DEFAULT_LANGUAGE) } returns flowOf( PrivacyNoticeResult.InProgress(DEFAULT_LANGUAGE), PrivacyNoticeResult.FailedBecauseBackendMaintenance(DEVICE_LANGUAGE, Throwable()), ) @@ -138,7 +138,7 @@ internal class PrivacyNoticeViewModelTest { @Test fun `retrievePrivacyNotice should return BackendMaintenance with estimation when FailedBecauseBackendMaintenance received`() = runTest { - coEvery { configManager.getPrivacyNotice(PROJECT_ID, DEVICE_LANGUAGE) } returns flowOf( + coEvery { configRepository.getPrivacyNotice(PROJECT_ID, DEVICE_LANGUAGE) } returns flowOf( PrivacyNoticeResult.InProgress(DEVICE_LANGUAGE), PrivacyNoticeResult.FailedBecauseBackendMaintenance(DEVICE_LANGUAGE, Throwable(), 1000L), ) @@ -154,7 +154,7 @@ internal class PrivacyNoticeViewModelTest { @Test fun `downloadPressed should retrieve notice when online`() = runTest { every { connectivityTracker.isConnected() } returns true - coEvery { configManager.getPrivacyNotice(PROJECT_ID, DEVICE_LANGUAGE) } returns flowOf( + coEvery { configRepository.getPrivacyNotice(PROJECT_ID, DEVICE_LANGUAGE) } returns flowOf( PrivacyNoticeResult.InProgress( DEVICE_LANGUAGE, ), diff --git a/feature/dashboard/src/main/java/com/simprints/feature/dashboard/logout/LogoutSyncViewModel.kt b/feature/dashboard/src/main/java/com/simprints/feature/dashboard/logout/LogoutSyncViewModel.kt index c3c253136d..05832e920f 100644 --- a/feature/dashboard/src/main/java/com/simprints/feature/dashboard/logout/LogoutSyncViewModel.kt +++ b/feature/dashboard/src/main/java/com/simprints/feature/dashboard/logout/LogoutSyncViewModel.kt @@ -8,8 +8,8 @@ import androidx.lifecycle.viewModelScope import com.simprints.core.livedata.LiveDataEventWithContent import com.simprints.feature.dashboard.logout.usecase.LogoutUseCase import com.simprints.infra.authstore.AuthStore +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.SettingsPasswordConfig -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.eventsync.EventSyncManager import com.simprints.infra.sync.SyncOrchestrator import dagger.hilt.android.lifecycle.HiltViewModel @@ -22,7 +22,7 @@ import javax.inject.Inject @HiltViewModel internal class LogoutSyncViewModel @Inject constructor( - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, eventSyncManager: EventSyncManager, syncOrchestrator: SyncOrchestrator, authStore: AuthStore, @@ -46,7 +46,7 @@ internal class LogoutSyncViewModel @Inject constructor( val settingsLocked: LiveData> get() = liveData(context = viewModelScope.coroutineContext) { - emit(LiveDataEventWithContent(configManager.getProjectConfiguration().general.settingsPassword)) + emit(LiveDataEventWithContent(configRepository.getProjectConfiguration().general.settingsPassword)) } fun logout() { diff --git a/feature/dashboard/src/main/java/com/simprints/feature/dashboard/main/MainViewModel.kt b/feature/dashboard/src/main/java/com/simprints/feature/dashboard/main/MainViewModel.kt index 36ab43deee..5902439693 100644 --- a/feature/dashboard/src/main/java/com/simprints/feature/dashboard/main/MainViewModel.kt +++ b/feature/dashboard/src/main/java/com/simprints/feature/dashboard/main/MainViewModel.kt @@ -6,7 +6,7 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.simprints.core.livedata.LiveDataEvent import com.simprints.core.livedata.send -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.logging.Simber import com.simprints.infra.security.SecurityManager import com.simprints.infra.security.exceptions.RootedDeviceException @@ -16,7 +16,7 @@ import javax.inject.Inject @HiltViewModel internal class MainViewModel @Inject constructor( - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val securityManager: SecurityManager, ) : ViewModel() { val consentRequired: LiveData @@ -32,7 +32,7 @@ internal class MainViewModel @Inject constructor( } private fun load() = viewModelScope.launch { - _consentRequired.postValue(configManager.getProjectConfiguration().consent.collectConsent) + _consentRequired.postValue(configRepository.getProjectConfiguration().consent.collectConsent) checkIfDeviceIsSafe() } diff --git a/feature/dashboard/src/main/java/com/simprints/feature/dashboard/main/projectdetails/ProjectDetailsViewModel.kt b/feature/dashboard/src/main/java/com/simprints/feature/dashboard/main/projectdetails/ProjectDetailsViewModel.kt index fcdff5717c..04728200c7 100644 --- a/feature/dashboard/src/main/java/com/simprints/feature/dashboard/main/projectdetails/ProjectDetailsViewModel.kt +++ b/feature/dashboard/src/main/java/com/simprints/feature/dashboard/main/projectdetails/ProjectDetailsViewModel.kt @@ -5,9 +5,9 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.simprints.core.domain.tokenization.TokenizableString +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.TokenKeyType import com.simprints.infra.config.store.tokenization.TokenizationProcessor -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.recent.user.activity.RecentUserActivityManager import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch @@ -15,7 +15,7 @@ import javax.inject.Inject @HiltViewModel internal class ProjectDetailsViewModel @Inject constructor( - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val recentUserActivityManager: RecentUserActivityManager, private val tokenizationProcessor: TokenizationProcessor, ) : ViewModel() { @@ -29,10 +29,11 @@ internal class ProjectDetailsViewModel @Inject constructor( fun load() = viewModelScope.launch { val state = try { - configManager.getProject()?.let { cachedProject -> + configRepository.getProject()?.let { cachedProject -> val recentUserActivity = recentUserActivityManager.getRecentUserActivity() val decryptedUserId = when (val userId = recentUserActivity.lastUserUsed) { is TokenizableString.Raw -> userId + is TokenizableString.Tokenized -> tokenizationProcessor.decrypt( encrypted = userId, tokenKeyType = TokenKeyType.AttendantId, diff --git a/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/SettingsViewModel.kt b/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/SettingsViewModel.kt index 38ff55fbfd..910f9a3ff3 100644 --- a/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/SettingsViewModel.kt +++ b/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/SettingsViewModel.kt @@ -8,12 +8,12 @@ import androidx.lifecycle.viewModelScope import com.simprints.core.livedata.LiveDataEvent import com.simprints.core.livedata.LiveDataEventWithContent import com.simprints.core.livedata.send +import com.simprints.infra.config.store.ConfigRepository +import com.simprints.infra.config.store.ConfigSyncCache import com.simprints.infra.config.store.models.GeneralConfiguration import com.simprints.infra.config.store.models.ProjectConfiguration import com.simprints.infra.config.store.models.SettingsPasswordConfig import com.simprints.infra.config.store.models.experimental -import com.simprints.infra.config.sync.ConfigManager -import com.simprints.infra.config.sync.ConfigSyncCache import com.simprints.infra.logging.LoggingConstants.CrashReportTag.SETTINGS import com.simprints.infra.logging.Simber import com.simprints.infra.sync.SyncOrchestrator @@ -24,7 +24,7 @@ import javax.inject.Inject @HiltViewModel internal class SettingsViewModel @Inject constructor( - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val syncOrchestrator: SyncOrchestrator, private val configSyncCache: ConfigSyncCache, ) : ViewModel() { @@ -32,7 +32,8 @@ internal class SettingsViewModel @Inject constructor( get() = _generalConfiguration private val _generalConfiguration = MutableLiveData() - val experimentalConfiguration = configManager.observeProjectConfiguration() + val experimentalConfiguration = configRepository + .observeProjectConfiguration() .map(ProjectConfiguration::experimental) .asLiveData(viewModelScope.coroutineContext) @@ -58,17 +59,17 @@ internal class SettingsViewModel @Inject constructor( fun updateLanguagePreference(language: String) { viewModelScope.launch { - configManager.updateDeviceConfiguration { it.apply { it.language = language } } + configRepository.updateDeviceConfiguration { it.apply { it.language = language } } _languagePreference.postValue(language) Simber.i("Language set to $language", tag = SETTINGS) } } private fun load() = viewModelScope.launch { - val configuration = configManager.getProjectConfiguration().general + val configuration = configRepository.getProjectConfiguration().general _sinceConfigLastUpdated.send(configSyncCache.sinceLastUpdateTime()) - _languagePreference.postValue(configManager.getDeviceConfiguration().language) + _languagePreference.postValue(configRepository.getDeviceConfiguration().language) _generalConfiguration.postValue(configuration) _settingsLocked.postValue(configuration.settingsPassword) } diff --git a/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/about/AboutViewModel.kt b/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/about/AboutViewModel.kt index 0e9e80087c..1eaefb019b 100644 --- a/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/about/AboutViewModel.kt +++ b/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/about/AboutViewModel.kt @@ -10,9 +10,9 @@ import com.simprints.core.livedata.LiveDataEventWithContent import com.simprints.core.livedata.send import com.simprints.feature.dashboard.logout.usecase.LogoutUseCase import com.simprints.feature.troubleshooting.AutoResettingClickCounter +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.SettingsPasswordConfig import com.simprints.infra.config.store.models.canSyncDataToSimprints -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.eventsync.EventSyncManager import com.simprints.infra.recent.user.activity.RecentUserActivityManager import com.simprints.infra.recent.user.activity.domain.RecentUserActivity @@ -23,7 +23,7 @@ import javax.inject.Inject @HiltViewModel internal class AboutViewModel @Inject constructor( - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val logoutUseCase: LogoutUseCase, private val eventSyncManager: EventSyncManager, private val recentUserActivityManager: RecentUserActivityManager, @@ -80,10 +80,10 @@ internal class AboutViewModel @Inject constructor( private suspend fun hasEventsToUpload(): Boolean = eventSyncManager.countEventsToUpload().first() > 0 - private suspend fun canSyncDataToSimprints(): Boolean = configManager.getProjectConfiguration().canSyncDataToSimprints() + private suspend fun canSyncDataToSimprints(): Boolean = configRepository.getProjectConfiguration().canSyncDataToSimprints() private fun load() = viewModelScope.launch { - val configuration = configManager.getProjectConfiguration() + val configuration = configRepository.getProjectConfiguration() val syncAndSearchConfig = SyncAndSearchConfig( configuration.synchronization.down.simprints ?.partitionType diff --git a/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/fingerselection/FingerSelectionViewModel.kt b/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/fingerselection/FingerSelectionViewModel.kt index 75aeef8bcd..81d708dee2 100644 --- a/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/fingerselection/FingerSelectionViewModel.kt +++ b/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/fingerselection/FingerSelectionViewModel.kt @@ -5,14 +5,14 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.simprints.core.domain.common.TemplateIdentifier -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch import javax.inject.Inject @HiltViewModel internal class FingerSelectionViewModel @Inject constructor( - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, ) : ViewModel() { val fingerSelections: LiveData> get() = _fingerSelections @@ -21,10 +21,10 @@ internal class FingerSelectionViewModel @Inject constructor( fun start() { viewModelScope.launch { val fingerSelections = mutableListOf() - configManager.getProjectConfiguration().fingerprint?.secugenSimMatcher?.fingersToCapture?.let { + configRepository.getProjectConfiguration().fingerprint?.secugenSimMatcher?.fingersToCapture?.let { fingerSelections.add(FingerSelectionSection("SimMatcher", it.toFingerSelectionItems())) } - configManager.getProjectConfiguration().fingerprint?.nec?.fingersToCapture?.let { + configRepository.getProjectConfiguration().fingerprint?.nec?.fingersToCapture?.let { fingerSelections.add(FingerSelectionSection("NEC", it.toFingerSelectionItems())) } _fingerSelections.postValue(fingerSelections) diff --git a/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/syncinfo/SyncInfoViewModel.kt b/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/syncinfo/SyncInfoViewModel.kt index 1e0507554d..c3170e5fc0 100644 --- a/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/syncinfo/SyncInfoViewModel.kt +++ b/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/syncinfo/SyncInfoViewModel.kt @@ -12,9 +12,9 @@ import com.simprints.feature.dashboard.settings.syncinfo.usecase.ObserveSyncInfo import com.simprints.feature.login.LoginParams import com.simprints.feature.login.LoginResult import com.simprints.infra.authstore.AuthStore +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.ProjectState import com.simprints.infra.config.store.models.isModuleSelectionAvailable -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.eventsync.EventSyncManager import com.simprints.infra.recent.user.activity.RecentUserActivityManager import com.simprints.infra.sync.SyncOrchestrator @@ -38,7 +38,7 @@ import javax.inject.Inject @HiltViewModel internal class SyncInfoViewModel @Inject constructor( - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val authStore: AuthStore, private val eventSyncManager: EventSyncManager, private val syncOrchestrator: SyncOrchestrator, @@ -144,7 +144,7 @@ internal class SyncInfoViewModel @Inject constructor( syncOrchestrator.stopEventSync() - val isDownSyncAllowed = !isPreLogoutUpSync && configManager.getProject()?.state == ProjectState.RUNNING + val isDownSyncAllowed = !isPreLogoutUpSync && configRepository.getProject()?.state == ProjectState.RUNNING syncOrchestrator.startEventSync(isDownSyncAllowed) } } @@ -191,7 +191,7 @@ internal class SyncInfoViewModel @Inject constructor( val isForceEventSync = when { isPreLogoutUpSync -> true - configManager.isModuleSelectionRequired() -> false + configRepository.isModuleSelectionRequired() -> false isRunning -> false lastUpdate == null -> true timeHelper.msBetweenNowAndTime(lastUpdate) > RE_SYNC_TIMEOUT_MILLIS -> true @@ -244,7 +244,7 @@ internal class SyncInfoViewModel @Inject constructor( ), ) - private suspend fun ConfigManager.isModuleSelectionRequired() = + private suspend fun ConfigRepository.isModuleSelectionRequired() = getProjectConfiguration().isModuleSelectionAvailable() && getDeviceConfiguration().selectedModules.isEmpty() private companion object { diff --git a/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/syncinfo/moduleselection/ModuleSelectionViewModel.kt b/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/syncinfo/moduleselection/ModuleSelectionViewModel.kt index 65818f1a05..b1b9475daf 100644 --- a/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/syncinfo/moduleselection/ModuleSelectionViewModel.kt +++ b/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/syncinfo/moduleselection/ModuleSelectionViewModel.kt @@ -11,10 +11,10 @@ import com.simprints.feature.dashboard.settings.syncinfo.moduleselection.excepti import com.simprints.feature.dashboard.settings.syncinfo.moduleselection.exceptions.TooManyModulesSelectedException import com.simprints.feature.dashboard.settings.syncinfo.moduleselection.repository.Module import com.simprints.feature.dashboard.settings.syncinfo.moduleselection.repository.ModuleRepository +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.SettingsPasswordConfig import com.simprints.infra.config.store.models.TokenKeyType import com.simprints.infra.config.store.tokenization.TokenizationProcessor -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.sync.SyncOrchestrator import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.CoroutineScope @@ -25,7 +25,7 @@ import javax.inject.Inject internal class ModuleSelectionViewModel @Inject constructor( private val moduleRepository: ModuleRepository, private val syncOrchestrator: SyncOrchestrator, - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val tokenizationProcessor: TokenizationProcessor, @param:ExternalScope private val externalScope: CoroutineScope, ) : ViewModel() { @@ -50,7 +50,8 @@ internal class ModuleSelectionViewModel @Inject constructor( moduleRepository.getModules().map { module -> val decryptedName = when (val name = module.name) { is TokenizableString.Raw -> name - is TokenizableString.Tokenized -> configManager.getProject()?.let { + + is TokenizableString.Tokenized -> configRepository.getProject()?.let { tokenizationProcessor.decrypt( encrypted = name, tokenKeyType = TokenKeyType.ModuleId, @@ -66,7 +67,7 @@ internal class ModuleSelectionViewModel @Inject constructor( fun loadPasswordSettings() { viewModelScope.launch { - configManager + configRepository .getProjectConfiguration() .general .settingsPassword @@ -100,7 +101,7 @@ internal class ModuleSelectionViewModel @Inject constructor( externalScope.launch { val modules = modules.map { module -> val encryptedName = when (val name = module.name) { - is TokenizableString.Raw -> configManager.getProject()?.let { project -> + is TokenizableString.Raw -> configRepository.getProject()?.let { project -> tokenizationProcessor.encrypt( decrypted = name, tokenKeyType = TokenKeyType.ModuleId, diff --git a/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/syncinfo/moduleselection/repository/ModuleRepositoryImpl.kt b/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/syncinfo/moduleselection/repository/ModuleRepositoryImpl.kt index 91c193211b..52112ab1b2 100644 --- a/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/syncinfo/moduleselection/repository/ModuleRepositoryImpl.kt +++ b/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/syncinfo/moduleselection/repository/ModuleRepositoryImpl.kt @@ -1,7 +1,7 @@ package com.simprints.feature.dashboard.settings.syncinfo.moduleselection.repository import com.simprints.core.domain.tokenization.values -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.enrolment.records.repository.EnrolmentRecordRepository import com.simprints.infra.enrolment.records.repository.domain.models.EnrolmentRecordQuery import com.simprints.infra.eventsync.EventSyncManager @@ -12,11 +12,11 @@ import javax.inject.Inject // TODO move into the event system infra module? internal class ModuleRepositoryImpl @Inject constructor( - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val enrolmentRecordRepository: EnrolmentRecordRepository, private val eventSyncManager: EventSyncManager, ) : ModuleRepository { - override suspend fun getModules(): List = configManager + override suspend fun getModules(): List = configRepository .getProjectConfiguration() .synchronization.down.simprints ?.moduleOptions @@ -29,19 +29,19 @@ internal class ModuleRepositoryImpl @Inject constructor( handleUnselectedModules(modules.filter { !it.isSelected }) } - override suspend fun getMaxNumberOfModules(): Int = configManager + override suspend fun getMaxNumberOfModules(): Int = configRepository .getProjectConfiguration() .synchronization.down.simprints ?.maxNbOfModules ?: 0 - private suspend fun isModuleSelected(moduleName: String): Boolean = configManager + private suspend fun isModuleSelected(moduleName: String): Boolean = configRepository .getDeviceConfiguration() .selectedModules .values() .contains(moduleName) private suspend fun setSelectedModules(selectedModules: List) { - configManager.updateDeviceConfiguration { + configRepository.updateDeviceConfiguration { it.apply { this.selectedModules = selectedModules.map { module -> module.name } logMessageForCrashReport("Modules set to ${this.selectedModules.values()}") diff --git a/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/syncinfo/usecase/ObserveConfigurationChangesUseCase.kt b/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/syncinfo/usecase/ObserveConfigurationChangesUseCase.kt index 2b70846900..2feeceae06 100644 --- a/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/syncinfo/usecase/ObserveConfigurationChangesUseCase.kt +++ b/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/syncinfo/usecase/ObserveConfigurationChangesUseCase.kt @@ -2,27 +2,27 @@ package com.simprints.feature.dashboard.settings.syncinfo.usecase import com.simprints.core.domain.tokenization.TokenizableString import com.simprints.feature.dashboard.settings.syncinfo.modulecount.ModuleCount +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.ProjectConfiguration import com.simprints.infra.config.store.models.ProjectState import com.simprints.infra.config.store.models.TokenKeyType import com.simprints.infra.config.store.tokenization.TokenizationProcessor -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.enrolment.records.repository.EnrolmentRecordRepository import com.simprints.infra.enrolment.records.repository.domain.models.EnrolmentRecordQuery import kotlinx.coroutines.flow.combine import javax.inject.Inject internal class ObserveConfigurationChangesUseCase @Inject constructor( - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val tokenizationProcessor: TokenizationProcessor, private val enrolmentRecordRepository: EnrolmentRecordRepository, ) { operator fun invoke() = combine( - configManager.observeIsProjectRefreshing(), - configManager.observeProjectConfiguration(), - configManager.observeDeviceConfiguration(), + configRepository.observeIsProjectRefreshing(), + configRepository.observeProjectConfiguration(), + configRepository.observeDeviceConfiguration(), ) { isRefreshing, projectConfig, deviceConfig -> - val project = configManager.getProject() + val project = configRepository.getProject() val moduleCounts = if (project != null) { deviceConfig.selectedModules.map { moduleName -> diff --git a/feature/dashboard/src/test/java/com/simprints/feature/dashboard/logout/LogoutSyncViewModelTest.kt b/feature/dashboard/src/test/java/com/simprints/feature/dashboard/logout/LogoutSyncViewModelTest.kt index e81f80614c..8bde6a033a 100644 --- a/feature/dashboard/src/test/java/com/simprints/feature/dashboard/logout/LogoutSyncViewModelTest.kt +++ b/feature/dashboard/src/test/java/com/simprints/feature/dashboard/logout/LogoutSyncViewModelTest.kt @@ -4,9 +4,9 @@ import androidx.arch.core.executor.testing.InstantTaskExecutorRule import com.google.common.truth.Truth.* import com.simprints.feature.dashboard.logout.usecase.LogoutUseCase import com.simprints.infra.authstore.AuthStore +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.ProjectConfiguration import com.simprints.infra.config.store.models.SettingsPasswordConfig -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.eventsync.EventSyncManager import com.simprints.infra.eventsync.status.models.EventSyncState import com.simprints.infra.sync.ImageSyncStatus @@ -27,7 +27,7 @@ internal class LogoutSyncViewModelTest { lateinit var logoutUseCase: LogoutUseCase @MockK - lateinit var configManager: ConfigManager + lateinit var configRepository: ConfigRepository @MockK lateinit var eventSyncManager: EventSyncManager @@ -63,7 +63,7 @@ internal class LogoutSyncViewModelTest { @Test fun `password config should be fetched after initialization`() { val config = SettingsPasswordConfig.Locked(password = "123") - coEvery { configManager.getProjectConfiguration() } returns mockk { + coEvery { configRepository.getProjectConfiguration() } returns mockk { every { general } returns mockk { every { settingsPassword } returns config } @@ -148,11 +148,11 @@ internal class LogoutSyncViewModelTest { val eventSyncFlow = flowOf(eventSyncState) every { eventSyncManager.getLastSyncState(useDefaultValue = true) } returns eventSyncFlow every { syncOrchestrator.observeImageSyncStatus() } returns flowOf(imageSyncStatus) - every { configManager.observeProjectConfiguration() } returns flowOf(projectConfig) + every { configRepository.observeProjectConfiguration() } returns flowOf(projectConfig) } private fun createViewModel() = LogoutSyncViewModel( - configManager = configManager, + configRepository = configRepository, eventSyncManager = eventSyncManager, syncOrchestrator = syncOrchestrator, authStore = authStore, diff --git a/feature/dashboard/src/test/java/com/simprints/feature/dashboard/main/MainViewModelTest.kt b/feature/dashboard/src/test/java/com/simprints/feature/dashboard/main/MainViewModelTest.kt index a0b2f093ca..9d76dd8671 100644 --- a/feature/dashboard/src/test/java/com/simprints/feature/dashboard/main/MainViewModelTest.kt +++ b/feature/dashboard/src/test/java/com/simprints/feature/dashboard/main/MainViewModelTest.kt @@ -1,14 +1,12 @@ package com.simprints.feature.dashboard.main import androidx.arch.core.executor.testing.InstantTaskExecutorRule -import com.google.common.truth.Truth.assertThat -import com.simprints.infra.config.sync.ConfigManager +import com.google.common.truth.Truth.* +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.security.SecurityManager import com.simprints.infra.security.exceptions.RootedDeviceException import com.simprints.testtools.common.coroutines.TestCoroutineRule -import io.mockk.coEvery -import io.mockk.every -import io.mockk.mockk +import io.mockk.* import org.junit.Rule import org.junit.Test @@ -19,7 +17,7 @@ class MainViewModelTest { @get:Rule val testCoroutineRule = TestCoroutineRule() - private val configManager = mockk { + private val configRepository = mockk { coEvery { getProjectConfiguration() } returns mockk { every { consent } returns mockk { every { collectConsent } returns true @@ -30,7 +28,7 @@ class MainViewModelTest { @Test fun `should initialize the live data correctly`() { - val viewModel = MainViewModel(configManager, securityManager) + val viewModel = MainViewModel(configRepository, securityManager) assertThat(viewModel.consentRequired.value).isEqualTo(true) } @@ -38,7 +36,7 @@ class MainViewModelTest { @Test fun `should show rooted device detected if device is rooted`() { coEvery { securityManager.checkIfDeviceIsRooted() } throws RootedDeviceException() - val viewModel = MainViewModel(configManager, securityManager) + val viewModel = MainViewModel(configRepository, securityManager) assertThat(viewModel.rootedDeviceDetected.value).isNotNull() } diff --git a/feature/dashboard/src/test/java/com/simprints/feature/dashboard/main/projectdetails/ProjectDetailsViewModelTest.kt b/feature/dashboard/src/test/java/com/simprints/feature/dashboard/main/projectdetails/ProjectDetailsViewModelTest.kt index b38bc700b0..4186367fc5 100644 --- a/feature/dashboard/src/test/java/com/simprints/feature/dashboard/main/projectdetails/ProjectDetailsViewModelTest.kt +++ b/feature/dashboard/src/test/java/com/simprints/feature/dashboard/main/projectdetails/ProjectDetailsViewModelTest.kt @@ -4,11 +4,11 @@ import androidx.arch.core.executor.testing.InstantTaskExecutorRule import com.google.common.truth.Truth.* import com.simprints.core.domain.tokenization.TokenizableString import com.simprints.core.domain.tokenization.asTokenizableEncrypted +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.Project import com.simprints.infra.config.store.models.ProjectState import com.simprints.infra.config.store.models.TokenKeyType import com.simprints.infra.config.store.tokenization.TokenizationProcessor -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.recent.user.activity.RecentUserActivityManager import com.simprints.infra.recent.user.activity.domain.RecentUserActivity import com.simprints.testtools.common.coroutines.TestCoroutineRule @@ -27,7 +27,7 @@ class ProjectDetailsViewModelTest { val testCoroutineRule = TestCoroutineRule() @MockK - private lateinit var configManager: ConfigManager + private lateinit var configRepository: ConfigRepository @MockK private lateinit var tokenizationProcessor: TokenizationProcessor @@ -46,7 +46,7 @@ class ProjectDetailsViewModelTest { @Test fun `should initialize the live data correctly`() = runTest { - coEvery { configManager.getProject() } returns PROJECT + coEvery { configRepository.getProject() } returns PROJECT every { tokenizationProcessor.decrypt( RECENT_USER_ACTIVITY.lastUserUsed as TokenizableString.Tokenized, @@ -56,7 +56,7 @@ class ProjectDetailsViewModelTest { } returns RECENT_USER_ACTIVITY.lastUserUsed viewModel = ProjectDetailsViewModel( - configManager = configManager, + configRepository = configRepository, recentUserActivityManager = recentUserActivityManager, tokenizationProcessor = tokenizationProcessor, ) @@ -67,10 +67,10 @@ class ProjectDetailsViewModelTest { @Test fun `Should handle exception by producing correct state`() = runTest { - coEvery { configManager.getProject() } returns null + coEvery { configRepository.getProject() } returns null viewModel = ProjectDetailsViewModel( - configManager = configManager, + configRepository = configRepository, recentUserActivityManager = recentUserActivityManager, tokenizationProcessor = tokenizationProcessor, ) diff --git a/feature/dashboard/src/test/java/com/simprints/feature/dashboard/settings/SettingsViewModelTest.kt b/feature/dashboard/src/test/java/com/simprints/feature/dashboard/settings/SettingsViewModelTest.kt index f3b7782781..7612e1bd7b 100644 --- a/feature/dashboard/src/test/java/com/simprints/feature/dashboard/settings/SettingsViewModelTest.kt +++ b/feature/dashboard/src/test/java/com/simprints/feature/dashboard/settings/SettingsViewModelTest.kt @@ -4,13 +4,13 @@ import androidx.arch.core.executor.testing.InstantTaskExecutorRule import com.google.common.truth.Truth.assertThat import com.jraska.livedata.test import com.simprints.core.domain.common.Modality +import com.simprints.infra.config.store.ConfigRepository +import com.simprints.infra.config.store.ConfigSyncCache import com.simprints.infra.config.store.models.DeviceConfiguration import com.simprints.infra.config.store.models.ExperimentalProjectConfiguration import com.simprints.infra.config.store.models.GeneralConfiguration import com.simprints.infra.config.store.models.ProjectConfiguration import com.simprints.infra.config.store.models.SettingsPasswordConfig -import com.simprints.infra.config.sync.ConfigManager -import com.simprints.infra.config.sync.ConfigSyncCache import com.simprints.infra.sync.SyncOrchestrator import com.simprints.testtools.common.coroutines.TestCoroutineRule import io.mockk.* @@ -39,7 +39,7 @@ class SettingsViewModelTest { ) @MockK - private lateinit var configManager: ConfigManager + private lateinit var configRepository: ConfigRepository @MockK private lateinit var syncOrchestrator: SyncOrchestrator @@ -53,15 +53,15 @@ class SettingsViewModelTest { fun setup() { MockKAnnotations.init(this, relaxed = true) - coEvery { configManager.getProjectConfiguration().general } returns generalConfiguration - coEvery { configManager.getDeviceConfiguration().language } returns LANGUAGE + coEvery { configRepository.getProjectConfiguration().general } returns generalConfiguration + coEvery { configRepository.getDeviceConfiguration().language } returns LANGUAGE coEvery { configSyncCache.sinceLastUpdateTime() } returnsMany listOf( LAST_UPDATED, OTHER_LAST_UPDATED, ) - viewModel = SettingsViewModel(configManager, syncOrchestrator, configSyncCache) + viewModel = SettingsViewModel(configRepository, syncOrchestrator, configSyncCache) } @Test @@ -69,7 +69,7 @@ class SettingsViewModelTest { val experimentalConfig1 = mapOf("key1" to "value1") val experimentalConfig2 = mapOf("key2" to "value2") - coEvery { configManager.observeProjectConfiguration() } returns flowOf( + coEvery { configRepository.observeProjectConfiguration() } returns flowOf( mockk(relaxed = true) { every { custom } returns experimentalConfig1 }, @@ -77,7 +77,7 @@ class SettingsViewModelTest { every { custom } returns experimentalConfig2 }, ) - viewModel = SettingsViewModel(configManager, syncOrchestrator, configSyncCache) + viewModel = SettingsViewModel(configRepository, syncOrchestrator, configSyncCache) assertThat(viewModel.experimentalConfiguration.test().valueHistory()) .isEqualTo( @@ -100,7 +100,7 @@ class SettingsViewModelTest { fun `updateLanguagePreference should update the language`() = runTest { val updatedLanguage = "en" val updateConfigFn = slot DeviceConfiguration>() - coEvery { configManager.updateDeviceConfiguration(capture(updateConfigFn)) } returns Unit + coEvery { configRepository.updateDeviceConfiguration(capture(updateConfigFn)) } returns Unit viewModel.updateLanguagePreference(updatedLanguage) diff --git a/feature/dashboard/src/test/java/com/simprints/feature/dashboard/settings/about/AboutViewModelTest.kt b/feature/dashboard/src/test/java/com/simprints/feature/dashboard/settings/about/AboutViewModelTest.kt index c0c01b8caf..79ab57b31a 100644 --- a/feature/dashboard/src/test/java/com/simprints/feature/dashboard/settings/about/AboutViewModelTest.kt +++ b/feature/dashboard/src/test/java/com/simprints/feature/dashboard/settings/about/AboutViewModelTest.kt @@ -1,31 +1,29 @@ package com.simprints.feature.dashboard.settings.about import androidx.arch.core.executor.testing.InstantTaskExecutorRule -import com.google.common.truth.Truth.assertThat +import com.google.common.truth.Truth.* import com.jraska.livedata.test import com.simprints.core.domain.common.Modality import com.simprints.core.domain.tokenization.asTokenizableEncrypted import com.simprints.feature.dashboard.logout.usecase.LogoutUseCase +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.DownSynchronizationConfiguration -import com.simprints.infra.config.store.models.GeneralConfiguration import com.simprints.infra.config.store.models.IdentificationConfiguration import com.simprints.infra.config.store.models.ProjectConfiguration import com.simprints.infra.config.store.models.SettingsPasswordConfig import com.simprints.infra.config.store.models.UpSynchronizationConfiguration -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.eventsync.EventSyncManager import com.simprints.infra.recent.user.activity.RecentUserActivityManager import com.simprints.infra.recent.user.activity.domain.RecentUserActivity import com.simprints.testtools.common.coroutines.TestCoroutineRule import com.simprints.testtools.common.livedata.getOrAwaitValue -import io.mockk.coEvery -import io.mockk.coVerify -import io.mockk.every -import io.mockk.mockk +import io.mockk.* +import io.mockk.impl.annotations.MockK import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.test.advanceTimeBy import kotlinx.coroutines.test.runTest +import org.junit.Before import org.junit.Rule import org.junit.Test @@ -51,21 +49,31 @@ class AboutViewModelTest { verificationsToday = 30, lastActivityTime = 10000, ) - private val eventSyncManager = mockk() - private val configManager = mockk { - coEvery { getProjectConfiguration() } returns buildProjectConfigurationMock() - } + @MockK + lateinit var eventSyncManager: EventSyncManager + + @MockK + lateinit var configRepository: ConfigRepository + + @MockK + internal lateinit var logoutUseCase: LogoutUseCase + + @MockK + lateinit var recentUserActivityManager: RecentUserActivityManager + + @Before + fun setUp() { + MockKAnnotations.init(this, relaxed = true) - private val logoutUseCase = mockk(relaxed = true) - private val recentUserActivityManager = mockk { - coEvery { getRecentUserActivity() } returns recentUserActivity + coEvery { configRepository.getProjectConfiguration() } returns buildProjectConfigurationMock() + coEvery { recentUserActivityManager.getRecentUserActivity() } returns recentUserActivity } @Test fun `should initialize the live data correctly`() { val viewModel = AboutViewModel( - configManager = configManager, + configRepository = configRepository, eventSyncManager = eventSyncManager, recentUserActivityManager = recentUserActivityManager, logoutUseCase = logoutUseCase, @@ -199,11 +207,11 @@ class AboutViewModelTest { false -> 0 } coEvery { eventSyncManager.countEventsToUpload() } returns flowOf(countEventsToUpload) - coEvery { configManager.getProjectConfiguration() } returns buildProjectConfigurationMock( + coEvery { configRepository.getProjectConfiguration() } returns buildProjectConfigurationMock( upSyncKind, ) return AboutViewModel( - configManager = configManager, + configRepository = configRepository, eventSyncManager = eventSyncManager, recentUserActivityManager = recentUserActivityManager, logoutUseCase = logoutUseCase, diff --git a/feature/dashboard/src/test/java/com/simprints/feature/dashboard/settings/fingerselection/FingerSelectionViewModelTest.kt b/feature/dashboard/src/test/java/com/simprints/feature/dashboard/settings/fingerselection/FingerSelectionViewModelTest.kt index 29c7eb15aa..063f3047c4 100644 --- a/feature/dashboard/src/test/java/com/simprints/feature/dashboard/settings/fingerselection/FingerSelectionViewModelTest.kt +++ b/feature/dashboard/src/test/java/com/simprints/feature/dashboard/settings/fingerselection/FingerSelectionViewModelTest.kt @@ -3,8 +3,8 @@ package com.simprints.feature.dashboard.settings.fingerselection import androidx.arch.core.executor.testing.InstantTaskExecutorRule import com.google.common.truth.Truth.* import com.simprints.core.domain.common.TemplateIdentifier +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.FingerprintConfiguration -import com.simprints.infra.config.sync.ConfigManager import com.simprints.testtools.common.coroutines.TestCoroutineRule import io.mockk.* import org.junit.Rule @@ -18,10 +18,10 @@ class FingerSelectionViewModelTest { val testCoroutineRule = TestCoroutineRule() private val fingerprintConfiguration = mockk() - private val configManager = mockk(relaxed = true) { + private val configRepository = mockk(relaxed = true) { coEvery { getProjectConfiguration().fingerprint } returns fingerprintConfiguration } - private val viewModel = FingerSelectionViewModel(configManager) + private val viewModel = FingerSelectionViewModel(configRepository) @Test fun start_loadsSingleSdkFingerStatesCorrectly() { diff --git a/feature/dashboard/src/test/java/com/simprints/feature/dashboard/settings/syncinfo/SyncInfoViewModelTest.kt b/feature/dashboard/src/test/java/com/simprints/feature/dashboard/settings/syncinfo/SyncInfoViewModelTest.kt index 6861f9a78c..4a24b06696 100644 --- a/feature/dashboard/src/test/java/com/simprints/feature/dashboard/settings/syncinfo/SyncInfoViewModelTest.kt +++ b/feature/dashboard/src/test/java/com/simprints/feature/dashboard/settings/syncinfo/SyncInfoViewModelTest.kt @@ -12,6 +12,7 @@ import com.simprints.feature.dashboard.logout.usecase.LogoutUseCase import com.simprints.feature.dashboard.settings.syncinfo.usecase.ObserveSyncInfoUseCase import com.simprints.feature.login.LoginResult import com.simprints.infra.authstore.AuthStore +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.DeviceConfiguration import com.simprints.infra.config.store.models.GeneralConfiguration import com.simprints.infra.config.store.models.Project @@ -19,7 +20,6 @@ import com.simprints.infra.config.store.models.ProjectConfiguration import com.simprints.infra.config.store.models.ProjectState import com.simprints.infra.config.store.models.isModuleSelectionAvailable import com.simprints.infra.config.store.models.isSimprintsEventDownSyncAllowed -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.eventsync.EventSyncManager import com.simprints.infra.eventsync.status.models.DownSyncCounts import com.simprints.infra.eventsync.status.models.EventSyncState @@ -30,6 +30,7 @@ import com.simprints.testtools.common.coroutines.TestCoroutineRule import com.simprints.testtools.common.livedata.getOrAwaitValue import com.simprints.testtools.common.livedata.getOrAwaitValues import io.mockk.* +import io.mockk.impl.annotations.MockK import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.async import kotlinx.coroutines.flow.MutableStateFlow @@ -50,58 +51,74 @@ class SyncInfoViewModelTest { @get:Rule val testCoroutineRule = TestCoroutineRule() - private val configManager = mockk() - private val authStore = mockk() - private val eventSyncManager = mockk() - private val syncOrchestrator = mockk() - private val recentUserActivityManager = mockk() - private val timeHelper = mockk() - private val observeSyncInfo = mockk() - private val logoutUseCase = mockk(relaxed = true) + @MockK + private lateinit var configRepository: ConfigRepository - private lateinit var viewModel: SyncInfoViewModel + @MockK + private lateinit var authStore: AuthStore - private companion object { - const val TEST_PROJECT_ID = "test_project_id" - const val TEST_USER_ID = "test_user_id" - const val TEST_RECENT_USER_ID = "recent_user_id" - val TEST_TIMESTAMP = Timestamp(1000L) - } + @MockK + private lateinit var eventSyncManager: EventSyncManager - private val mockProjectConfiguration = mockk(relaxed = true) { - every { general } returns mockk(relaxed = true) { - every { modalities } returns emptyList() - } - } - private val mockDeviceConfiguration = mockk(relaxed = true) { - every { selectedModules } returns emptyList() - } - private val mockProject = mockk(relaxed = true) { - every { state } returns ProjectState.RUNNING - } - private val mockEventSyncState = mockk(relaxed = true) { - every { isSyncCompleted() } returns false - every { isSyncInProgress() } returns false - every { isSyncConnecting() } returns false - every { isSyncRunning() } returns false - every { isSyncFailed() } returns false - every { isSyncFailedBecauseReloginRequired() } returns false - every { isSyncFailedBecauseBackendMaintenance() } returns false - every { isSyncFailedBecauseTooManyRequests() } returns false - every { getEstimatedBackendMaintenanceOutage() } returns null - every { isThereNotSyncHistory() } returns false - every { progress } returns null - every { total } returns null - } - private val mockImageSyncStatus = mockk(relaxed = true) { - every { isSyncing } returns false - every { progress } returns null - every { lastUpdateTimeMillis } returns null - } + @MockK + private lateinit var syncOrchestrator: SyncOrchestrator + + @MockK + private lateinit var recentUserActivityManager: RecentUserActivityManager + + @MockK + private lateinit var timeHelper: TimeHelper + + @MockK + private lateinit var observeSyncInfo: ObserveSyncInfoUseCase + + @MockK + private lateinit var logoutUseCase: LogoutUseCase + + @MockK + private lateinit var mockProjectConfiguration: ProjectConfiguration + + @MockK + private lateinit var mockDeviceConfiguration: DeviceConfiguration + + @MockK + private lateinit var mockProject: Project + + @MockK + private lateinit var mockEventSyncState: EventSyncState + + @MockK + private lateinit var mockImageSyncStatus: ImageSyncStatus + + private lateinit var viewModel: SyncInfoViewModel @Before fun setUp() { MockKAnnotations.init(this, relaxed = true) + + every { mockProjectConfiguration.general } returns mockk(relaxed = true) { + every { modalities } returns emptyList() + } + every { mockDeviceConfiguration.selectedModules } returns emptyList() + every { mockProject.state } returns ProjectState.RUNNING + + every { mockEventSyncState.isSyncCompleted() } returns false + every { mockEventSyncState.isSyncInProgress() } returns false + every { mockEventSyncState.isSyncConnecting() } returns false + every { mockEventSyncState.isSyncRunning() } returns false + every { mockEventSyncState.isSyncFailed() } returns false + every { mockEventSyncState.isSyncFailedBecauseReloginRequired() } returns false + every { mockEventSyncState.isSyncFailedBecauseBackendMaintenance() } returns false + every { mockEventSyncState.isSyncFailedBecauseTooManyRequests() } returns false + every { mockEventSyncState.getEstimatedBackendMaintenanceOutage() } returns null + every { mockEventSyncState.isThereNotSyncHistory() } returns false + every { mockEventSyncState.progress } returns null + every { mockEventSyncState.total } returns null + + every { mockImageSyncStatus.isSyncing } returns false + every { mockImageSyncStatus.progress } returns null + every { mockImageSyncStatus.lastUpdateTimeMillis } returns null + mockkStatic("androidx.lifecycle.FlowLiveDataConversions") mockkStatic("com.simprints.infra.config.store.models.ProjectConfigurationKt") mockkStatic("com.simprints.core.tools.extentions.Flow_extKt") @@ -117,12 +134,12 @@ class SyncInfoViewModelTest { val connectivityLiveData = MutableLiveData(true) every { connectivityLiveData.asFlow() } returns flowOf(true) - every { configManager.observeIsProjectRefreshing() } returns MutableStateFlow(false) - every { configManager.observeProjectConfiguration() } returns MutableStateFlow(mockProjectConfiguration) - every { configManager.observeDeviceConfiguration() } returns MutableStateFlow(mockDeviceConfiguration) - coEvery { configManager.getProjectConfiguration() } returns mockProjectConfiguration - coEvery { configManager.getDeviceConfiguration() } returns mockDeviceConfiguration - coEvery { configManager.getProject() } returns mockProject + every { configRepository.observeIsProjectRefreshing() } returns MutableStateFlow(false) + every { configRepository.observeProjectConfiguration() } returns MutableStateFlow(mockProjectConfiguration) + every { configRepository.observeDeviceConfiguration() } returns MutableStateFlow(mockDeviceConfiguration) + coEvery { configRepository.getProjectConfiguration() } returns mockProjectConfiguration + coEvery { configRepository.getDeviceConfiguration() } returns mockDeviceConfiguration + coEvery { configRepository.getProject() } returns mockProject val eventSyncFlow = flowOf(mockEventSyncState) every { eventSyncManager.getLastSyncState() } returns eventSyncFlow @@ -153,7 +170,7 @@ class SyncInfoViewModelTest { private fun createViewModel() { viewModel = SyncInfoViewModel( - configManager = configManager, + configRepository = configRepository, authStore = authStore, eventSyncManager = eventSyncManager, syncOrchestrator = syncOrchestrator, @@ -400,7 +417,7 @@ class SyncInfoViewModelTest { val mockPausedProject = mockk { every { state } returns ProjectState.PROJECT_PAUSED } - coEvery { configManager.getProject() } returns mockPausedProject + coEvery { configRepository.getProject() } returns mockPausedProject createViewModel() viewModel.isPreLogoutUpSync = false @@ -415,7 +432,7 @@ class SyncInfoViewModelTest { val mockEndingProject = mockk { every { state } returns ProjectState.PROJECT_ENDING } - coEvery { configManager.getProject() } returns mockEndingProject + coEvery { configRepository.getProject() } returns mockEndingProject createViewModel() viewModel.isPreLogoutUpSync = false @@ -427,7 +444,7 @@ class SyncInfoViewModelTest { @Test fun `should start event sync with down sync disabled event sync when logged out`() = runTest { - coEvery { configManager.getProject() } returns null + coEvery { configRepository.getProject() } returns null createViewModel() viewModel.isPreLogoutUpSync = false @@ -749,8 +766,8 @@ class SyncInfoViewModelTest { val mockEmptyDeviceConfig = mockk { every { selectedModules } returns emptyList() } - coEvery { configManager.getProjectConfiguration() } returns mockProjectConfigRequiringModules - coEvery { configManager.getDeviceConfiguration() } returns mockEmptyDeviceConfig + coEvery { configRepository.getProjectConfiguration() } returns mockProjectConfigRequiringModules + coEvery { configRepository.getDeviceConfiguration() } returns mockEmptyDeviceConfig every { mockProjectConfigRequiringModules.isModuleSelectionAvailable() } returns true coEvery { eventSyncManager.getLastSyncTime() } returns null createViewModel() @@ -771,8 +788,8 @@ class SyncInfoViewModelTest { val mockEmptyDeviceConfig = mockk { every { selectedModules } returns emptyList() } - coEvery { configManager.getProjectConfiguration() } returns mockProjectConfigRequiringModules - coEvery { configManager.getDeviceConfiguration() } returns mockEmptyDeviceConfig + coEvery { configRepository.getProjectConfiguration() } returns mockProjectConfigRequiringModules + coEvery { configRepository.getDeviceConfiguration() } returns mockEmptyDeviceConfig every { mockProjectConfigRequiringModules.isModuleSelectionAvailable() } returns true coEvery { eventSyncManager.getLastSyncTime() } returns null createViewModel() @@ -782,4 +799,11 @@ class SyncInfoViewModelTest { coVerify(exactly = 0) { syncOrchestrator.startEventSync(any()) } } + + private companion object { + const val TEST_PROJECT_ID = "test_project_id" + const val TEST_USER_ID = "test_user_id" + const val TEST_RECENT_USER_ID = "recent_user_id" + val TEST_TIMESTAMP = Timestamp(1000L) + } } diff --git a/feature/dashboard/src/test/java/com/simprints/feature/dashboard/settings/syncinfo/moduleselection/ModuleSelectionViewModelTest.kt b/feature/dashboard/src/test/java/com/simprints/feature/dashboard/settings/syncinfo/moduleselection/ModuleSelectionViewModelTest.kt index 748857ffb5..e80e6ed74a 100644 --- a/feature/dashboard/src/test/java/com/simprints/feature/dashboard/settings/syncinfo/moduleselection/ModuleSelectionViewModelTest.kt +++ b/feature/dashboard/src/test/java/com/simprints/feature/dashboard/settings/syncinfo/moduleselection/ModuleSelectionViewModelTest.kt @@ -10,11 +10,11 @@ import com.simprints.feature.dashboard.settings.syncinfo.moduleselection.excepti import com.simprints.feature.dashboard.settings.syncinfo.moduleselection.exceptions.TooManyModulesSelectedException import com.simprints.feature.dashboard.settings.syncinfo.moduleselection.repository.Module import com.simprints.feature.dashboard.settings.syncinfo.moduleselection.repository.ModuleRepository +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.Project import com.simprints.infra.config.store.models.SettingsPasswordConfig import com.simprints.infra.config.store.models.TokenKeyType import com.simprints.infra.config.store.tokenization.TokenizationProcessor -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.sync.SyncOrchestrator import com.simprints.testtools.common.coroutines.TestCoroutineRule import com.simprints.testtools.common.livedata.getOrAwaitValue @@ -42,7 +42,7 @@ class ModuleSelectionViewModelTest { private lateinit var syncOrchestrator: SyncOrchestrator @MockK - private lateinit var configManager: ConfigManager + private lateinit var configRepository: ConfigRepository @MockK private lateinit var tokenizationProcessor: TokenizationProcessor @@ -64,10 +64,10 @@ class ModuleSelectionViewModelTest { ) coEvery { repository.getModules() } returns modulesDefault coEvery { repository.getMaxNumberOfModules() } returns 2 - coEvery { configManager.getProjectConfiguration() } returns mockk { + coEvery { configRepository.getProjectConfiguration() } returns mockk { every { general.settingsPassword } returns SettingsPasswordConfig.Locked("1234") } - coEvery { configManager.getProject() } returns project + coEvery { configRepository.getProject() } returns project modulesDefault.forEach { coEvery { tokenizationProcessor.decrypt( @@ -81,7 +81,7 @@ class ModuleSelectionViewModelTest { viewModel = ModuleSelectionViewModel( moduleRepository = repository, syncOrchestrator = syncOrchestrator, - configManager = configManager, + configRepository = configRepository, tokenizationProcessor = tokenizationProcessor, externalScope = CoroutineScope(testCoroutineRule.testCoroutineDispatcher), ) @@ -106,7 +106,7 @@ class ModuleSelectionViewModelTest { } @Test - fun `updateModuleSelection should throw a TooManyModulesSelectedException if trying to select more than the maximum number of modules`() { + fun `updateModuleSelection should throw a TooManyModulesSelectedException if trying to select more than the maximum modules`() { viewModel.updateModuleSelection(Module("b".asTokenizableRaw(), false)) val exception = assertThrows { diff --git a/feature/dashboard/src/test/java/com/simprints/feature/dashboard/settings/syncinfo/moduleselection/repository/ModuleRepositoryImplTest.kt b/feature/dashboard/src/test/java/com/simprints/feature/dashboard/settings/syncinfo/moduleselection/repository/ModuleRepositoryImplTest.kt index 32423c5e8b..107f336788 100644 --- a/feature/dashboard/src/test/java/com/simprints/feature/dashboard/settings/syncinfo/moduleselection/repository/ModuleRepositoryImplTest.kt +++ b/feature/dashboard/src/test/java/com/simprints/feature/dashboard/settings/syncinfo/moduleselection/repository/ModuleRepositoryImplTest.kt @@ -4,11 +4,10 @@ import com.google.common.truth.Truth.assertThat import com.simprints.core.domain.common.Modality import com.simprints.core.domain.tokenization.TokenizableString import com.simprints.core.domain.tokenization.asTokenizableRaw +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.DeviceConfiguration import com.simprints.infra.config.store.models.DownSynchronizationConfiguration -import com.simprints.infra.config.store.models.GeneralConfiguration import com.simprints.infra.config.store.models.ProjectConfiguration -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.enrolment.records.repository.EnrolmentRecordRepository import com.simprints.infra.eventsync.EventSyncManager import io.mockk.MockKAnnotations @@ -29,7 +28,7 @@ class ModuleRepositoryImplTest { lateinit var projectConfiguration: ProjectConfiguration @MockK - lateinit var configManager: ConfigManager + lateinit var configRepository: ConfigRepository @MockK lateinit var enrolmentRecordRepository: EnrolmentRecordRepository @@ -45,15 +44,15 @@ class ModuleRepositoryImplTest { every { projectConfiguration.general.modalities } returns listOf(Modality.FINGERPRINT) every { projectConfiguration.synchronization.down } returns downSynchronizationConfiguration - coEvery { configManager.getProjectConfiguration() } returns projectConfiguration + coEvery { configRepository.getProjectConfiguration() } returns projectConfiguration every { downSynchronizationConfiguration.simprints?.moduleOptions } returns listOf("a", "b", "c", "d").map(String::asTokenizableRaw) coEvery { - configManager.getDeviceConfiguration() + configRepository.getDeviceConfiguration() } returns DeviceConfiguration("", listOf("b", "c").map(TokenizableString::Tokenized), "") repository = ModuleRepositoryImpl( - configManager, + configRepository, enrolmentRecordRepository, eventSyncManager, ) @@ -62,7 +61,7 @@ class ModuleRepositoryImplTest { @Test fun saveModules_shouldSaveSelectedModules() = runTest { val updateConfigFn = slot DeviceConfiguration>() - coEvery { configManager.updateDeviceConfiguration(capture(updateConfigFn)) } returns Unit + coEvery { configRepository.updateDeviceConfiguration(capture(updateConfigFn)) } returns Unit val modules = listOf( Module("1".asTokenizableRaw(), true), Module("2".asTokenizableRaw(), true), diff --git a/feature/dashboard/src/test/java/com/simprints/feature/dashboard/settings/syncinfo/usecase/ObserveConfigurationChangesUseCaseTest.kt b/feature/dashboard/src/test/java/com/simprints/feature/dashboard/settings/syncinfo/usecase/ObserveConfigurationChangesUseCaseTest.kt index e29716398f..7b162d88c5 100644 --- a/feature/dashboard/src/test/java/com/simprints/feature/dashboard/settings/syncinfo/usecase/ObserveConfigurationChangesUseCaseTest.kt +++ b/feature/dashboard/src/test/java/com/simprints/feature/dashboard/settings/syncinfo/usecase/ObserveConfigurationChangesUseCaseTest.kt @@ -4,12 +4,12 @@ import com.google.common.truth.Truth.* import com.simprints.core.domain.tokenization.asTokenizableEncrypted import com.simprints.core.domain.tokenization.asTokenizableRaw import com.simprints.feature.dashboard.settings.syncinfo.modulecount.ModuleCount +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.DeviceConfiguration import com.simprints.infra.config.store.models.Project import com.simprints.infra.config.store.models.ProjectConfiguration import com.simprints.infra.config.store.models.ProjectState import com.simprints.infra.config.store.tokenization.TokenizationProcessor -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.enrolment.records.repository.EnrolmentRecordRepository import io.mockk.* import io.mockk.impl.annotations.MockK @@ -22,7 +22,7 @@ import org.junit.Test class ObserveConfigurationChangesUseCaseTest { @MockK - private lateinit var configManager: ConfigManager + private lateinit var configRepository: ConfigRepository @MockK private lateinit var tokenizationProcessor: TokenizationProcessor @@ -46,7 +46,7 @@ class ObserveConfigurationChangesUseCaseTest { MockKAnnotations.init(this, relaxed = true) useCase = ObserveConfigurationChangesUseCase( - configManager = configManager, + configRepository = configRepository, tokenizationProcessor = tokenizationProcessor, enrolmentRecordRepository = enrolmentRepository, ) @@ -54,10 +54,10 @@ class ObserveConfigurationChangesUseCaseTest { @Test fun `returns combined state`() = runTest { - coEvery { configManager.getProject() } returns null - every { configManager.observeIsProjectRefreshing() } returns flowOf(true) - every { configManager.observeProjectConfiguration() } returns flowOf(projectConfiguration) - every { configManager.observeDeviceConfiguration() } returns flowOf(deviceConfiguration) + coEvery { configRepository.getProject() } returns null + every { configRepository.observeIsProjectRefreshing() } returns flowOf(true) + every { configRepository.observeProjectConfiguration() } returns flowOf(projectConfiguration) + every { configRepository.observeDeviceConfiguration() } returns flowOf(deviceConfiguration) val result = useCase().first() @@ -67,10 +67,10 @@ class ObserveConfigurationChangesUseCaseTest { @Test fun `returns combined state on multiple emissions of combined flow`() = runTest { - coEvery { configManager.getProject() } returns null - every { configManager.observeIsProjectRefreshing() } returns flowOf(true, false) - every { configManager.observeProjectConfiguration() } returns flowOf(projectConfiguration) - every { configManager.observeDeviceConfiguration() } returns flowOf(deviceConfiguration) + coEvery { configRepository.getProject() } returns null + every { configRepository.observeIsProjectRefreshing() } returns flowOf(true, false) + every { configRepository.observeProjectConfiguration() } returns flowOf(projectConfiguration) + every { configRepository.observeDeviceConfiguration() } returns flowOf(deviceConfiguration) val result = useCase().toList() @@ -80,7 +80,7 @@ class ObserveConfigurationChangesUseCaseTest { @Test fun `invoke untokenized list of modules`() = runTest { - coEvery { configManager.getProject() } returns project + coEvery { configRepository.getProject() } returns project every { project.id } returns "projectId" every { project.state } returns ProjectState.RUNNING every { deviceConfiguration.selectedModules } returns listOf( @@ -92,9 +92,9 @@ class ObserveConfigurationChangesUseCaseTest { } returns "moduleUntokenized".asTokenizableRaw() coEvery { enrolmentRepository.count(any(), any()) } returnsMany listOf(1, 2) - every { configManager.observeIsProjectRefreshing() } returns flowOf(true) - every { configManager.observeProjectConfiguration() } returns flowOf(projectConfiguration) - every { configManager.observeDeviceConfiguration() } returns flowOf(deviceConfiguration) + every { configRepository.observeIsProjectRefreshing() } returns flowOf(true) + every { configRepository.observeProjectConfiguration() } returns flowOf(projectConfiguration) + every { configRepository.observeDeviceConfiguration() } returns flowOf(deviceConfiguration) val result = useCase().first() diff --git a/feature/enrol-last-biometric/src/main/java/com/simprints/feature/enrollast/screen/EnrolLastBiometricViewModel.kt b/feature/enrol-last-biometric/src/main/java/com/simprints/feature/enrollast/screen/EnrolLastBiometricViewModel.kt index f0ba95a7f1..1ec1671071 100644 --- a/feature/enrol-last-biometric/src/main/java/com/simprints/feature/enrollast/screen/EnrolLastBiometricViewModel.kt +++ b/feature/enrol-last-biometric/src/main/java/com/simprints/feature/enrollast/screen/EnrolLastBiometricViewModel.kt @@ -17,9 +17,9 @@ import com.simprints.feature.enrollast.screen.usecase.CheckForDuplicateEnrolment import com.simprints.feature.externalcredential.screens.search.model.ScannedCredential import com.simprints.feature.externalcredential.screens.search.model.toExternalCredential import com.simprints.feature.externalcredential.usecase.ResetExternalCredentialsInSessionUseCase +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.TokenKeyType import com.simprints.infra.config.store.tokenization.TokenizationProcessor -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.enrolment.records.repository.EnrolmentRecordRepository import com.simprints.infra.enrolment.records.repository.domain.models.EnrolmentRecord import com.simprints.infra.enrolment.records.repository.domain.models.EnrolmentRecordAction @@ -37,7 +37,7 @@ import javax.inject.Inject @HiltViewModel internal class EnrolLastBiometricViewModel @Inject constructor( private val timeHelper: TimeHelper, - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val eventRepository: SessionEventRepository, private val enrolmentRecordRepository: EnrolmentRecordRepository, private val checkForDuplicateEnrolments: CheckForDuplicateEnrolmentsUseCase, @@ -76,8 +76,8 @@ internal class EnrolLastBiometricViewModel @Inject constructor( ) = viewModelScope.launch { enrolWasAttempted = true - val projectConfig = configManager.getProjectConfiguration() - val project = configManager.getProject() + val projectConfig = configRepository.getProjectConfiguration() + val project = configRepository.getProject() if (project == null) { _finish.send(EnrolLastState.Failed(GENERAL_ERROR, emptyList())) return@launch @@ -112,7 +112,7 @@ internal class EnrolLastBiometricViewModel @Inject constructor( } private suspend fun displayAddCredentialDialog(scannedCredential: ScannedCredential) { - val project = configManager.getProject() ?: return + val project = configRepository.getProject() ?: return val decrypted = tokenizationProcessor.decrypt( encrypted = scannedCredential.credential, tokenKeyType = TokenKeyType.ExternalCredential, diff --git a/feature/enrol-last-biometric/src/test/java/com/simprints/feature/enrollast/screen/EnrolLastBiometricViewModelTest.kt b/feature/enrol-last-biometric/src/test/java/com/simprints/feature/enrollast/screen/EnrolLastBiometricViewModelTest.kt index c2769f68b5..a8951fb206 100644 --- a/feature/enrol-last-biometric/src/test/java/com/simprints/feature/enrollast/screen/EnrolLastBiometricViewModelTest.kt +++ b/feature/enrol-last-biometric/src/test/java/com/simprints/feature/enrollast/screen/EnrolLastBiometricViewModelTest.kt @@ -12,11 +12,11 @@ import com.simprints.feature.enrollast.screen.usecase.BuildRecordUseCase import com.simprints.feature.enrollast.screen.usecase.CheckForDuplicateEnrolmentsUseCase import com.simprints.feature.externalcredential.screens.search.model.ScannedCredential import com.simprints.feature.externalcredential.usecase.ResetExternalCredentialsInSessionUseCase +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.Project import com.simprints.infra.config.store.models.ProjectConfiguration import com.simprints.infra.config.store.models.TokenKeyType import com.simprints.infra.config.store.tokenization.TokenizationProcessor -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.enrolment.records.repository.EnrolmentRecordRepository import com.simprints.infra.enrolment.records.repository.domain.models.EnrolmentRecord import com.simprints.infra.events.event.domain.models.BiometricReferenceCreationEvent @@ -43,7 +43,7 @@ internal class EnrolLastBiometricViewModelTest { lateinit var timeHelper: TimeHelper @MockK - lateinit var configManager: ConfigManager + lateinit var configRepository: ConfigRepository @MockK lateinit var projectConfig: ProjectConfiguration @@ -82,7 +82,7 @@ internal class EnrolLastBiometricViewModelTest { fun setUp() { MockKAnnotations.init(this, relaxed = true) - coEvery { configManager.getProjectConfiguration() } returns projectConfig + coEvery { configRepository.getProjectConfiguration() } returns projectConfig every { projectConfig.general.modalities } returns emptyList() coEvery { eventRepository.getCurrentSessionScope() } returns mockk { @@ -97,7 +97,7 @@ internal class EnrolLastBiometricViewModelTest { viewModel = EnrolLastBiometricViewModel( timeHelper = timeHelper, - configManager = configManager, + configRepository = configRepository, eventRepository = eventRepository, enrolmentRecordRepository = enrolmentRecordRepository, checkForDuplicateEnrolments = checkForDuplicateEnrolments, @@ -124,7 +124,7 @@ internal class EnrolLastBiometricViewModelTest { ), ) - coVerify(exactly = 1) { configManager.getProjectConfiguration() } + coVerify(exactly = 1) { configRepository.getProjectConfiguration() } } @Test @@ -162,7 +162,7 @@ internal class EnrolLastBiometricViewModelTest { @Test fun `returns failure when project is not available`() = runTest { - coEvery { configManager.getProject() } returns null + coEvery { configRepository.getProject() } returns null viewModel.enrolBiometric( createParams( listOf( @@ -295,7 +295,7 @@ internal class EnrolLastBiometricViewModelTest { fun `shows add credential dialog when scanned credential is linked to another subject`() = runTest { val decryptedCredential = "decryptedCredential".asTokenizableRaw() coEvery { enrolmentRecordRepository.load(any()) } returns listOf(enrolmentRecord) - coEvery { configManager.getProject() } returns project + coEvery { configRepository.getProject() } returns project coEvery { tokenizationProcessor.decrypt( encrypted = scannedCredential.credential, @@ -328,7 +328,7 @@ internal class EnrolLastBiometricViewModelTest { fun `add credential dialog is not shown when there is no result`() = runTest { val decryptedCredential = "decryptedCredential".asTokenizableRaw() coEvery { enrolmentRecordRepository.load(any()) } returns listOf(enrolmentRecord) - coEvery { configManager.getProject() } returns project + coEvery { configRepository.getProject() } returns project coEvery { tokenizationProcessor.decrypt( encrypted = scannedCredential.credential, @@ -346,7 +346,7 @@ internal class EnrolLastBiometricViewModelTest { fun `add credential dialog is not shown when there are no credentials`() = runTest { val decryptedCredential = "decryptedCredential".asTokenizableRaw() coEvery { enrolmentRecordRepository.load(any()) } returns listOf(enrolmentRecord) - coEvery { configManager.getProject() } returns project + coEvery { configRepository.getProject() } returns project coEvery { tokenizationProcessor.decrypt( encrypted = scannedCredential.credential, @@ -369,7 +369,7 @@ internal class EnrolLastBiometricViewModelTest { fun `add credential dialog is not shown when credential is already linked to same subject`() = runTest { val decryptedCredential = "decryptedCredential".asTokenizableRaw() coEvery { enrolmentRecordRepository.load(any()) } returns listOf(enrolmentRecord) - coEvery { configManager.getProject() } returns project + coEvery { configRepository.getProject() } returns project coEvery { tokenizationProcessor.decrypt( encrypted = scannedCredential.credential, diff --git a/feature/exit-form/src/main/java/com/simprints/feature/exitform/screen/ExitFormViewModel.kt b/feature/exit-form/src/main/java/com/simprints/feature/exitform/screen/ExitFormViewModel.kt index 94ce833378..6e7e16f976 100644 --- a/feature/exit-form/src/main/java/com/simprints/feature/exitform/screen/ExitFormViewModel.kt +++ b/feature/exit-form/src/main/java/com/simprints/feature/exitform/screen/ExitFormViewModel.kt @@ -12,8 +12,7 @@ import com.simprints.core.livedata.send import com.simprints.core.tools.time.TimeHelper import com.simprints.core.tools.time.Timestamp import com.simprints.feature.exitform.ExitFormOption -import com.simprints.infra.config.store.models.GeneralConfiguration -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.events.event.domain.models.RefusalEvent import com.simprints.infra.events.session.SessionEventRepository import com.simprints.infra.logging.Simber @@ -24,7 +23,7 @@ import javax.inject.Inject @HiltViewModel internal class ExitFormViewModel @Inject constructor( - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val timeHelper: TimeHelper, private val eventRepository: SessionEventRepository, @SessionCoroutineScope private val sessionCoroutineScope: CoroutineScope, @@ -75,7 +74,7 @@ internal class ExitFormViewModel @Inject constructor( fun start() { viewModelScope.launch { - val projectConfig = configManager.getProjectConfiguration() + val projectConfig = configRepository.getProjectConfiguration() if (projectConfig.general.modalities.contains(Modality.FINGERPRINT)) { val options = DEFAULT_OPTIONS.toMutableSet() options.remove(ExitFormOption.AppNotWorking) diff --git a/feature/exit-form/src/test/java/com/simprints/feature/exitform/screen/ExitFormViewModelTest.kt b/feature/exit-form/src/test/java/com/simprints/feature/exitform/screen/ExitFormViewModelTest.kt index 03660f037e..340d46f013 100644 --- a/feature/exit-form/src/test/java/com/simprints/feature/exitform/screen/ExitFormViewModelTest.kt +++ b/feature/exit-form/src/test/java/com/simprints/feature/exitform/screen/ExitFormViewModelTest.kt @@ -7,7 +7,7 @@ import com.simprints.core.domain.common.Modality import com.simprints.core.tools.time.TimeHelper import com.simprints.core.tools.time.Timestamp import com.simprints.feature.exitform.ExitFormOption -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.events.session.SessionEventRepository import com.simprints.testtools.common.coroutines.TestCoroutineRule import io.mockk.* @@ -26,7 +26,7 @@ internal class ExitFormViewModelTest { val testCoroutineRule = TestCoroutineRule() @MockK - lateinit var configManager: ConfigManager + lateinit var configRepository: ConfigRepository @MockK lateinit var timeHelper: TimeHelper @@ -43,7 +43,7 @@ internal class ExitFormViewModelTest { every { timeHelper.now() } returns Timestamp(1L) exitFormViewModel = ExitFormViewModel( - configManager, + configRepository, timeHelper, eventRepository, CoroutineScope(testCoroutineRule.testCoroutineDispatcher), @@ -52,7 +52,7 @@ internal class ExitFormViewModelTest { @Test fun `show default options when configuration doesn't contain fingerprint`() = runTest { - coEvery { configManager.getProjectConfiguration() } returns mockk { + coEvery { configRepository.getProjectConfiguration() } returns mockk { every { general.modalities } returns listOf(Modality.FACE) } @@ -63,7 +63,7 @@ internal class ExitFormViewModelTest { @Test fun `show scanner options when configuration contains fingerprint`() = runTest { - coEvery { configManager.getProjectConfiguration() } returns mockk { + coEvery { configRepository.getProjectConfiguration() } returns mockk { every { general.modalities } returns listOf(Modality.FINGERPRINT) } diff --git a/feature/external-credential/src/main/java/com/simprints/feature/externalcredential/screens/controller/ExternalCredentialViewModel.kt b/feature/external-credential/src/main/java/com/simprints/feature/externalcredential/screens/controller/ExternalCredentialViewModel.kt index d9f7ed06db..7fbe7ed1a8 100644 --- a/feature/external-credential/src/main/java/com/simprints/feature/externalcredential/screens/controller/ExternalCredentialViewModel.kt +++ b/feature/external-credential/src/main/java/com/simprints/feature/externalcredential/screens/controller/ExternalCredentialViewModel.kt @@ -12,7 +12,7 @@ import com.simprints.core.tools.time.Timestamp import com.simprints.feature.externalcredential.ExternalCredentialSearchResult import com.simprints.feature.externalcredential.model.ExternalCredentialParams import com.simprints.feature.externalcredential.usecase.ExternalCredentialEventTrackerUseCase -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.events.event.domain.models.ExternalCredentialSelectionEvent import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch @@ -21,7 +21,7 @@ import javax.inject.Inject @HiltViewModel internal class ExternalCredentialViewModel @Inject internal constructor( private val timeHelper: TimeHelper, - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val eventsTracker: ExternalCredentialEventTrackerUseCase, ) : ViewModel() { private var isInitialized = false @@ -50,7 +50,7 @@ internal class ExternalCredentialViewModel @Inject internal constructor( init { viewModelScope.launch { - val config = configManager.getProjectConfiguration() + val config = configRepository.getProjectConfiguration() val allowedExternalCredentials = config.multifactorId?.allowedExternalCredentials.orEmpty() _externalCredentialTypes.postValue(allowedExternalCredentials) } diff --git a/feature/external-credential/src/main/java/com/simprints/feature/externalcredential/screens/scanocr/ExternalCredentialScanOcrViewModel.kt b/feature/external-credential/src/main/java/com/simprints/feature/externalcredential/screens/scanocr/ExternalCredentialScanOcrViewModel.kt index 6d76e0df02..e2d5cff41a 100644 --- a/feature/external-credential/src/main/java/com/simprints/feature/externalcredential/screens/scanocr/ExternalCredentialScanOcrViewModel.kt +++ b/feature/external-credential/src/main/java/com/simprints/feature/externalcredential/screens/scanocr/ExternalCredentialScanOcrViewModel.kt @@ -23,10 +23,10 @@ import com.simprints.feature.externalcredential.screens.scanocr.usecase.KeepOnly import com.simprints.feature.externalcredential.screens.scanocr.usecase.NormalizeBitmapToPreviewUseCase import com.simprints.feature.externalcredential.screens.scanocr.usecase.ZoomOntoCredentialUseCase import com.simprints.feature.externalcredential.screens.search.model.ScannedCredential +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.TokenKeyType import com.simprints.infra.config.store.models.experimental import com.simprints.infra.config.store.tokenization.TokenizationProcessor -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.credential.store.CredentialImageRepository import com.simprints.infra.credential.store.model.CredentialScanImageType.ZoomedInCredential import com.simprints.infra.logging.LoggingConstants.CrashReportTag.MULTI_FACTOR_ID @@ -48,7 +48,7 @@ internal class ExternalCredentialScanOcrViewModel @AssistedInject constructor( private val credentialImageRepository: CredentialImageRepository, private val zoomOntoCredentialUseCase: ZoomOntoCredentialUseCase, private val tokenizationProcessor: TokenizationProcessor, - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, @param:DispatcherBG private val bgDispatcher: CoroutineDispatcher, ) : ViewModel() { @AssistedFactory @@ -78,7 +78,7 @@ internal class ExternalCredentialScanOcrViewModel @AssistedInject constructor( init { viewModelScope.launch { - ocrConfig = configManager.getProjectConfiguration().experimental().let { config -> + ocrConfig = configRepository.getProjectConfiguration().experimental().let { config -> OcrConfig( useHighRes = config.ocrUseHighRes, capturesRequired = config.ocrCaptures.coerceIn(OCR_CAPTURE_MIN, OCR_CAPTURE_MAX), @@ -136,7 +136,7 @@ internal class ExternalCredentialScanOcrViewModel @AssistedInject constructor( updateState { ScanOcrState.Complete } viewModelScope.launch { // Missing project at this point is impossible, so no special handling required - val project = configManager.getProject() ?: return@launch + val project = configRepository.getProject() ?: return@launch val detectedBlock = keepOnlyBestDetectedBlockUseCase(detectedBlocks, ocrDocumentType) val credentialType = detectedBlock.documentType.asExternalCredentialType() diff --git a/feature/external-credential/src/main/java/com/simprints/feature/externalcredential/screens/scanqr/ExternalCredentialScanQrViewModel.kt b/feature/external-credential/src/main/java/com/simprints/feature/externalcredential/screens/scanqr/ExternalCredentialScanQrViewModel.kt index c6f50ec8f4..01842080d2 100644 --- a/feature/external-credential/src/main/java/com/simprints/feature/externalcredential/screens/scanqr/ExternalCredentialScanQrViewModel.kt +++ b/feature/external-credential/src/main/java/com/simprints/feature/externalcredential/screens/scanqr/ExternalCredentialScanQrViewModel.kt @@ -10,9 +10,9 @@ import com.simprints.core.domain.tokenization.asTokenizableRaw import com.simprints.core.tools.time.TimeHelper import com.simprints.core.tools.time.Timestamp import com.simprints.feature.externalcredential.screens.scanqr.usecase.ExternalCredentialQrCodeValidatorUseCase +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.TokenKeyType import com.simprints.infra.config.store.tokenization.TokenizationProcessor -import com.simprints.infra.config.sync.ConfigManager import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch import javax.inject.Inject @@ -21,7 +21,7 @@ import javax.inject.Inject internal class ExternalCredentialScanQrViewModel @Inject constructor( private val timeHelper: TimeHelper, private val externalCredentialQrCodeValidator: ExternalCredentialQrCodeValidatorUseCase, - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val tokenizationProcessor: TokenizationProcessor, ) : ViewModel() { private lateinit var startTime: Timestamp @@ -41,7 +41,8 @@ internal class ExternalCredentialScanQrViewModel @Inject constructor( viewModelScope.launch { val newState = when (value) { null -> ScanQrState.ReadyToScan - else -> configManager.getProject()?.let { project -> + + else -> configRepository.getProject()?.let { project -> val qrCodeEncrypted = tokenizationProcessor.encrypt( decrypted = value.asTokenizableRaw(), tokenKeyType = TokenKeyType.ExternalCredential, diff --git a/feature/external-credential/src/main/java/com/simprints/feature/externalcredential/screens/search/ExternalCredentialSearchViewModel.kt b/feature/external-credential/src/main/java/com/simprints/feature/externalcredential/screens/search/ExternalCredentialSearchViewModel.kt index 7e2a54bcec..52fe37272d 100644 --- a/feature/external-credential/src/main/java/com/simprints/feature/externalcredential/screens/search/ExternalCredentialSearchViewModel.kt +++ b/feature/external-credential/src/main/java/com/simprints/feature/externalcredential/screens/search/ExternalCredentialSearchViewModel.kt @@ -18,10 +18,10 @@ import com.simprints.feature.externalcredential.screens.search.model.SearchCrede import com.simprints.feature.externalcredential.screens.search.model.SearchState import com.simprints.feature.externalcredential.screens.search.usecase.MatchCandidatesUseCase import com.simprints.feature.externalcredential.usecase.ExternalCredentialEventTrackerUseCase +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.Project import com.simprints.infra.config.store.models.TokenKeyType import com.simprints.infra.config.store.tokenization.TokenizationProcessor -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.enrolment.records.repository.EnrolmentRecordRepository import com.simprints.infra.enrolment.records.repository.domain.models.EnrolmentRecordQuery import com.simprints.infra.events.event.domain.models.ExternalCredentialConfirmationEvent.ExternalCredentialConfirmationResult @@ -35,7 +35,7 @@ internal class ExternalCredentialSearchViewModel @AssistedInject constructor( @Assisted val scannedCredential: ScannedCredential, @Assisted val externalCredentialParams: ExternalCredentialParams, private val timeHelper: TimeHelper, - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val matchCandidatesUseCase: MatchCandidatesUseCase, private val tokenizationProcessor: TokenizationProcessor, private val enrolmentRecordRepository: EnrolmentRecordRepository, @@ -69,7 +69,7 @@ internal class ExternalCredentialSearchViewModel @AssistedInject constructor( init { viewModelScope.launch { - configManager.getProject()?.let { + configRepository.getProject()?.let { decryptCredentialToDisplay(it, scannedCredential.credential) searchSubjectsLinkedToCredential(it, scannedCredential.credential) } @@ -82,7 +82,7 @@ internal class ExternalCredentialSearchViewModel @AssistedInject constructor( fun confirmCredentialUpdate(updatedCredential: TokenizableString.Raw) { viewModelScope.launch { - configManager.getProject()?.let { project -> + configRepository.getProject()?.let { project -> val encryptedCredential = tokenizationProcessor.encrypt( decrypted = updatedCredential, tokenKeyType = TokenKeyType.ExternalCredential, @@ -156,7 +156,7 @@ internal class ExternalCredentialSearchViewModel @AssistedInject constructor( } else -> { - val projectConfig = configManager.getProjectConfiguration() + val projectConfig = configRepository.getProjectConfiguration() val matches = matchCandidatesUseCase(candidates, credential, externalCredentialParams, project, projectConfig) eventsTracker.saveSearchEvent(startTime, scannedCredential.credentialScanId, candidates) diff --git a/feature/external-credential/src/main/java/com/simprints/feature/externalcredential/usecase/ExternalCredentialEventTrackerUseCase.kt b/feature/external-credential/src/main/java/com/simprints/feature/externalcredential/usecase/ExternalCredentialEventTrackerUseCase.kt index 4deb273920..e32263c4fb 100644 --- a/feature/external-credential/src/main/java/com/simprints/feature/externalcredential/usecase/ExternalCredentialEventTrackerUseCase.kt +++ b/feature/external-credential/src/main/java/com/simprints/feature/externalcredential/usecase/ExternalCredentialEventTrackerUseCase.kt @@ -7,9 +7,9 @@ import com.simprints.core.tools.time.Timestamp import com.simprints.feature.externalcredential.screens.scanocr.usecase.CalculateLevenshteinDistanceUseCase import com.simprints.feature.externalcredential.screens.search.model.ScannedCredential import com.simprints.feature.externalcredential.screens.search.model.toExternalCredential +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.TokenKeyType import com.simprints.infra.config.store.tokenization.TokenizationProcessor -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.enrolment.records.repository.domain.models.EnrolmentRecord import com.simprints.infra.events.event.domain.models.ExternalCredentialCaptureEvent import com.simprints.infra.events.event.domain.models.ExternalCredentialCaptureValueEvent @@ -23,7 +23,7 @@ import javax.inject.Inject internal class ExternalCredentialEventTrackerUseCase @Inject constructor( private val timeHelper: TimeHelper, - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val tokenizationProcessor: TokenizationProcessor, private val eventRepository: SessionEventRepository, private val calculateDistance: CalculateLevenshteinDistanceUseCase, @@ -83,7 +83,7 @@ internal class ExternalCredentialEventTrackerUseCase @Inject constructor( } private suspend fun calculateOcrErrorCount(scannedCredential: ScannedCredential): Int { - val project = configManager.getProject() ?: return 0 + val project = configRepository.getProject() ?: return 0 val actualCredentialRaw = tokenizationProcessor.decrypt( scannedCredential.credential, TokenKeyType.ExternalCredential, diff --git a/feature/external-credential/src/main/java/com/simprints/feature/externalcredential/usecase/ResetExternalCredentialsInSessionUseCase.kt b/feature/external-credential/src/main/java/com/simprints/feature/externalcredential/usecase/ResetExternalCredentialsInSessionUseCase.kt index 28364649a5..f006a3f96c 100644 --- a/feature/external-credential/src/main/java/com/simprints/feature/externalcredential/usecase/ResetExternalCredentialsInSessionUseCase.kt +++ b/feature/external-credential/src/main/java/com/simprints/feature/externalcredential/usecase/ResetExternalCredentialsInSessionUseCase.kt @@ -4,7 +4,7 @@ import com.simprints.core.SessionCoroutineScope import com.simprints.core.tools.extentions.isValidGuid import com.simprints.feature.externalcredential.screens.search.model.ScannedCredential import com.simprints.feature.externalcredential.screens.search.model.toExternalCredential -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.enrolment.records.repository.EnrolmentRecordRepository import com.simprints.infra.enrolment.records.repository.domain.models.EnrolmentRecordAction import com.simprints.infra.events.event.domain.models.EnrolmentUpdateEvent @@ -14,7 +14,7 @@ import javax.inject.Inject class ResetExternalCredentialsInSessionUseCase @Inject() constructor( private val enrolmentRecordRepository: EnrolmentRecordRepository, - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val eventRepository: SessionEventRepository, @param:SessionCoroutineScope private val sessionCoroutineScope: CoroutineScope, ) { @@ -53,7 +53,7 @@ class ResetExternalCredentialsInSessionUseCase @Inject() constructor( emptyList() } - configManager.getProject()?.let { project -> + configRepository.getProject()?.let { project -> val updateActions = credentialsToRemove + credentialsToAdd enrolmentRecordRepository.performActions(updateActions, project) } diff --git a/feature/external-credential/src/test/java/com/simprints/feature/externalcredential/screens/controller/ExternalCredentialViewModelTest.kt b/feature/external-credential/src/test/java/com/simprints/feature/externalcredential/screens/controller/ExternalCredentialViewModelTest.kt index 8243ddeec9..023dfee2a4 100644 --- a/feature/external-credential/src/test/java/com/simprints/feature/externalcredential/screens/controller/ExternalCredentialViewModelTest.kt +++ b/feature/external-credential/src/test/java/com/simprints/feature/externalcredential/screens/controller/ExternalCredentialViewModelTest.kt @@ -14,7 +14,7 @@ import com.simprints.feature.externalcredential.model.BoundingBox import com.simprints.feature.externalcredential.model.ExternalCredentialParams import com.simprints.feature.externalcredential.screens.search.model.ScannedCredential import com.simprints.feature.externalcredential.usecase.ExternalCredentialEventTrackerUseCase -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.events.event.domain.models.ExternalCredentialSelectionEvent import com.simprints.testtools.common.coroutines.TestCoroutineRule import io.mockk.* @@ -38,14 +38,14 @@ internal class ExternalCredentialViewModelTest { lateinit var timeHelper: TimeHelper @MockK - private lateinit var configManager: ConfigManager + private lateinit var configRepository: ConfigRepository private lateinit var viewModel: ExternalCredentialViewModel @Before fun setUp() { MockKAnnotations.init(this, relaxed = true) viewModel = ExternalCredentialViewModel( - configManager = configManager, + configRepository = configRepository, timeHelper = timeHelper, eventsTracker = eventsTracker, ) @@ -187,13 +187,13 @@ internal class ExternalCredentialViewModelTest { } private fun setupViewModel(allowedCredentials: List): ExternalCredentialViewModel { - coEvery { configManager.getProjectConfiguration() } returns mockk { + coEvery { configRepository.getProjectConfiguration() } returns mockk { every { multifactorId } returns mockk { every { allowedExternalCredentials } returns allowedCredentials } } return ExternalCredentialViewModel( - configManager = configManager, + configRepository = configRepository, timeHelper = timeHelper, eventsTracker = eventsTracker, ) diff --git a/feature/external-credential/src/test/java/com/simprints/feature/externalcredential/screens/scanocr/ExternalCredentialScanOcrViewModelTest.kt b/feature/external-credential/src/test/java/com/simprints/feature/externalcredential/screens/scanocr/ExternalCredentialScanOcrViewModelTest.kt index 0857a60734..e147294cfd 100644 --- a/feature/external-credential/src/test/java/com/simprints/feature/externalcredential/screens/scanocr/ExternalCredentialScanOcrViewModelTest.kt +++ b/feature/external-credential/src/test/java/com/simprints/feature/externalcredential/screens/scanocr/ExternalCredentialScanOcrViewModelTest.kt @@ -16,10 +16,10 @@ import com.simprints.feature.externalcredential.screens.scanocr.usecase.GetCrede import com.simprints.feature.externalcredential.screens.scanocr.usecase.KeepOnlyBestDetectedBlockUseCase import com.simprints.feature.externalcredential.screens.scanocr.usecase.NormalizeBitmapToPreviewUseCase import com.simprints.feature.externalcredential.screens.scanocr.usecase.ZoomOntoCredentialUseCase +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.Project import com.simprints.infra.config.store.models.TokenKeyType import com.simprints.infra.config.store.tokenization.TokenizationProcessor -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.credential.store.CredentialImageRepository import com.simprints.infra.resources.R import com.simprints.testtools.common.coroutines.TestCoroutineRule @@ -62,7 +62,7 @@ internal class ExternalCredentialScanOcrViewModelTest { private lateinit var tokenizationProcessor: TokenizationProcessor @MockK - private lateinit var configManager: ConfigManager + private lateinit var configRepository: ConfigRepository @MockK private lateinit var bitmap: Bitmap @@ -93,7 +93,7 @@ internal class ExternalCredentialScanOcrViewModelTest { credentialImageRepository = credentialImageRepository, bgDispatcher = testCoroutineRule.testCoroutineDispatcher, tokenizationProcessor = tokenizationProcessor, - configManager = configManager, + configRepository = configRepository, ) @Test @@ -143,7 +143,7 @@ internal class ExternalCredentialScanOcrViewModelTest { every { this@mockk.readoutValue } returns readoutValue } - coEvery { configManager.getProject() } returns mockProject + coEvery { configRepository.getProject() } returns mockProject coEvery { keepOnlyBestDetectedBlockUseCase(any(), documentType) } returns mockBestBlock coEvery { tokenizationProcessor.encrypt(any(), TokenKeyType.ExternalCredential, mockProject) } returns mockTokenizedCredential coEvery { zoomOntoCredentialUseCase(detectedBlockImagePath, mockBoundingBox) } returns mockBitmap @@ -179,7 +179,7 @@ internal class ExternalCredentialScanOcrViewModelTest { every { this@mockk.readoutValue } returns readoutValue } - coEvery { configManager.getProject() } returns mockProject + coEvery { configRepository.getProject() } returns mockProject coEvery { keepOnlyBestDetectedBlockUseCase(any(), documentType) } returns mockBestBlock coEvery { tokenizationProcessor.encrypt(any(), TokenKeyType.ExternalCredential, mockProject) } returns mockTokenizedCredential coEvery { zoomOntoCredentialUseCase(detectedBlockImagePath, mockBoundingBox) } throws Exception("Zoom failed") diff --git a/feature/external-credential/src/test/java/com/simprints/feature/externalcredential/screens/scanqr/ExternalCredentialScanQrViewModelTest.kt b/feature/external-credential/src/test/java/com/simprints/feature/externalcredential/screens/scanqr/ExternalCredentialScanQrViewModelTest.kt index 81b532a21b..ab5070bdca 100644 --- a/feature/external-credential/src/test/java/com/simprints/feature/externalcredential/screens/scanqr/ExternalCredentialScanQrViewModelTest.kt +++ b/feature/external-credential/src/test/java/com/simprints/feature/externalcredential/screens/scanqr/ExternalCredentialScanQrViewModelTest.kt @@ -9,10 +9,10 @@ import com.simprints.core.domain.tokenization.asTokenizableRaw import com.simprints.core.tools.time.TimeHelper import com.simprints.core.tools.time.Timestamp import com.simprints.feature.externalcredential.screens.scanqr.usecase.ExternalCredentialQrCodeValidatorUseCase +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.Project import com.simprints.infra.config.store.models.TokenKeyType import com.simprints.infra.config.store.tokenization.TokenizationProcessor -import com.simprints.infra.config.sync.ConfigManager import com.simprints.testtools.common.coroutines.TestCoroutineRule import io.mockk.* import io.mockk.impl.annotations.MockK @@ -38,7 +38,7 @@ internal class ExternalCredentialScanQrViewModelTest { private lateinit var tokenizationProcessor: TokenizationProcessor @MockK - private lateinit var configManager: ConfigManager + private lateinit var configRepository: ConfigRepository private lateinit var viewModel: ExternalCredentialScanQrViewModel @@ -49,7 +49,7 @@ internal class ExternalCredentialScanQrViewModelTest { timeHelper = timeHelper, externalCredentialQrCodeValidator = validator, tokenizationProcessor = tokenizationProcessor, - configManager = configManager, + configRepository = configRepository, ) every { timeHelper.now() } returns Timestamp(1L) @@ -73,7 +73,7 @@ internal class ExternalCredentialScanQrViewModelTest { val observer = viewModel.stateLiveData.test() val value = "value" - coEvery { configManager.getProject() } returns null + coEvery { configRepository.getProject() } returns null viewModel.updateCapturedValue(value) assertThat(observer.value()).isEqualTo(ScanQrState.ReadyToScan) @@ -86,7 +86,7 @@ internal class ExternalCredentialScanQrViewModelTest { val mockProject = mockk() val mockTokenizedCredential = mockk() - coEvery { configManager.getProject() } returns mockProject + coEvery { configRepository.getProject() } returns mockProject coEvery { tokenizationProcessor.encrypt(any(), TokenKeyType.ExternalCredential, mockProject) } returns mockTokenizedCredential viewModel.updateCameraPermissionStatus(permissionStatus = PermissionStatus.Granted) // inits the capture timing diff --git a/feature/external-credential/src/test/java/com/simprints/feature/externalcredential/screens/search/ExternalCredentialSearchViewModelTest.kt b/feature/external-credential/src/test/java/com/simprints/feature/externalcredential/screens/search/ExternalCredentialSearchViewModelTest.kt index b7a7e265e5..cf905cfc3c 100644 --- a/feature/external-credential/src/test/java/com/simprints/feature/externalcredential/screens/search/ExternalCredentialSearchViewModelTest.kt +++ b/feature/external-credential/src/test/java/com/simprints/feature/externalcredential/screens/search/ExternalCredentialSearchViewModelTest.kt @@ -17,10 +17,10 @@ import com.simprints.feature.externalcredential.screens.search.model.SearchCrede import com.simprints.feature.externalcredential.screens.search.model.SearchState import com.simprints.feature.externalcredential.screens.search.usecase.MatchCandidatesUseCase import com.simprints.feature.externalcredential.usecase.ExternalCredentialEventTrackerUseCase +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.ProjectConfiguration import com.simprints.infra.config.store.models.TokenKeyType import com.simprints.infra.config.store.tokenization.TokenizationProcessor -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.enrolment.records.repository.EnrolmentRecordRepository import com.simprints.infra.enrolment.records.repository.domain.models.EnrolmentRecord import com.simprints.testtools.common.coroutines.TestCoroutineRule @@ -43,7 +43,7 @@ internal class ExternalCredentialSearchViewModelTest { lateinit var timeHelper: TimeHelper @MockK - lateinit var configManager: ConfigManager + lateinit var configRepository: ConfigRepository @MockK lateinit var matchCandidatesUseCase: MatchCandidatesUseCase @@ -81,8 +81,8 @@ internal class ExternalCredentialSearchViewModelTest { fun setUp() { MockKAnnotations.init(this, relaxed = true) every { timeHelper.now() } returns Timestamp(1L) - coEvery { configManager.getProject() } returns project - coEvery { configManager.getProjectConfiguration() } returns projectConfig + coEvery { configRepository.getProject() } returns project + coEvery { configRepository.getProjectConfiguration() } returns projectConfig coJustRun { eventsTracker.saveSearchEvent(any(), any(), any()) } coJustRun { eventsTracker.saveConfirmation(any(), any()) } } @@ -91,7 +91,7 @@ internal class ExternalCredentialSearchViewModelTest { scannedCredential = mockScannedCredential, externalCredentialParams = externalCredentialParams, timeHelper = timeHelper, - configManager = configManager, + configRepository = configRepository, matchCandidatesUseCase = matchCandidatesUseCase, tokenizationProcessor = tokenizationProcessor, enrolmentRecordRepository = enrolmentRecordRepository, @@ -100,8 +100,8 @@ internal class ExternalCredentialSearchViewModelTest { @Test fun `initial state handles missing project`() = runTest { - clearMocks(configManager) - coEvery { configManager.getProject() } returns null + clearMocks(configRepository) + coEvery { configRepository.getProject() } returns null viewModel = createViewModel() @@ -159,8 +159,8 @@ internal class ExternalCredentialSearchViewModelTest { @Test fun `confirmCredentialUpdate handles missing project`() = runTest { - clearMocks(configManager) // reset default behaviour - coEvery { configManager.getProject() } returns null + clearMocks(configRepository) // reset default behaviour + coEvery { configRepository.getProject() } returns null viewModel = createViewModel() viewModel.confirmCredentialUpdate("".asTokenizableRaw()) diff --git a/feature/external-credential/src/test/java/com/simprints/feature/externalcredential/usecase/ExternalCredentialEventTrackerUseCaseTest.kt b/feature/external-credential/src/test/java/com/simprints/feature/externalcredential/usecase/ExternalCredentialEventTrackerUseCaseTest.kt index 9a910e0bc1..10a0b671fe 100644 --- a/feature/external-credential/src/test/java/com/simprints/feature/externalcredential/usecase/ExternalCredentialEventTrackerUseCaseTest.kt +++ b/feature/external-credential/src/test/java/com/simprints/feature/externalcredential/usecase/ExternalCredentialEventTrackerUseCaseTest.kt @@ -8,9 +8,9 @@ import com.simprints.core.tools.time.TimeHelper import com.simprints.core.tools.time.Timestamp import com.simprints.feature.externalcredential.screens.scanocr.usecase.CalculateLevenshteinDistanceUseCase import com.simprints.feature.externalcredential.screens.search.model.ScannedCredential +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.TokenKeyType import com.simprints.infra.config.store.tokenization.TokenizationProcessor -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.events.event.domain.models.ExternalCredentialCaptureEvent import com.simprints.infra.events.event.domain.models.ExternalCredentialCaptureValueEvent import com.simprints.infra.events.event.domain.models.ExternalCredentialConfirmationEvent @@ -29,7 +29,7 @@ class ExternalCredentialEventTrackerUseCaseTest { private lateinit var timeHelper: TimeHelper @MockK - private lateinit var configManager: ConfigManager + private lateinit var configRepository: ConfigRepository @MockK private lateinit var tokenizationProcessor: TokenizationProcessor @@ -47,7 +47,7 @@ class ExternalCredentialEventTrackerUseCaseTest { MockKAnnotations.init(this, relaxed = true) useCase = ExternalCredentialEventTrackerUseCase( timeHelper = timeHelper, - configManager = configManager, + configRepository = configRepository, tokenizationProcessor = tokenizationProcessor, eventRepository = eventRepository, calculateDistance = calculateDistance, @@ -55,7 +55,7 @@ class ExternalCredentialEventTrackerUseCaseTest { every { timeHelper.now() } returns END_TIME - coEvery { configManager.getProject() } returns mockk() + coEvery { configRepository.getProject() } returns mockk() coEvery { tokenizationProcessor.decrypt(any(), TokenKeyType.ExternalCredential, any()) } returns RAW_SCANNED_VALUE.asTokenizableRaw() @@ -90,8 +90,8 @@ class ExternalCredentialEventTrackerUseCaseTest { @Test fun `saveCaptureEvents should handle missing project in capture events`() = runTest { - clearMocks(configManager) - coEvery { configManager.getProject() } returns null + clearMocks(configRepository) + coEvery { configRepository.getProject() } returns null val scannedCredential = makeScannedCredential(ExternalCredentialType.QRCode) useCase.saveCaptureEvents(START_TIME, SUBJECT_ID, scannedCredential, SELECTION_ID) diff --git a/feature/external-credential/src/test/java/com/simprints/feature/externalcredential/usecase/ResetExternalCredentialsInSessionUseCaseTest.kt b/feature/external-credential/src/test/java/com/simprints/feature/externalcredential/usecase/ResetExternalCredentialsInSessionUseCaseTest.kt index 2245dd9818..27afaec1da 100644 --- a/feature/external-credential/src/test/java/com/simprints/feature/externalcredential/usecase/ResetExternalCredentialsInSessionUseCaseTest.kt +++ b/feature/external-credential/src/test/java/com/simprints/feature/externalcredential/usecase/ResetExternalCredentialsInSessionUseCaseTest.kt @@ -6,8 +6,8 @@ import com.simprints.core.domain.externalcredential.ExternalCredentialType import com.simprints.core.domain.tokenization.asTokenizableEncrypted import com.simprints.core.tools.time.Timestamp import com.simprints.feature.externalcredential.screens.search.model.ScannedCredential +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.Project -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.enrolment.records.repository.EnrolmentRecordRepository import com.simprints.infra.enrolment.records.repository.domain.models.EnrolmentRecordAction import com.simprints.infra.events.event.domain.models.EnrolmentUpdateEvent @@ -33,7 +33,7 @@ internal class ResetExternalCredentialsInSessionUseCaseTest { lateinit var enrolmentRecordRepository: EnrolmentRecordRepository @MockK - lateinit var configManager: ConfigManager + lateinit var configRepository: ConfigRepository @MockK lateinit var project: Project @@ -50,11 +50,11 @@ internal class ResetExternalCredentialsInSessionUseCaseTest { fun setUp() { MockKAnnotations.init(this, relaxed = true) - coEvery { configManager.getProject() } returns project + coEvery { configRepository.getProject() } returns project useCase = ResetExternalCredentialsInSessionUseCase( enrolmentRecordRepository = enrolmentRecordRepository, - configManager = configManager, + configRepository = configRepository, eventRepository = eventRepository, sessionCoroutineScope = CoroutineScope(testCoroutineRule.testCoroutineDispatcher), ) @@ -97,8 +97,8 @@ internal class ResetExternalCredentialsInSessionUseCaseTest { @Test fun `handles missing project`() = runTest { - clearMocks(configManager) - coEvery { configManager.getProject() } returns null + clearMocks(configRepository) + coEvery { configRepository.getProject() } returns null coEvery { eventRepository.getEventsInCurrentSession() } returns listOf() useCase(scannedCredential, SUBJECT_ID) @@ -163,7 +163,7 @@ internal class ResetExternalCredentialsInSessionUseCaseTest { @Test fun `retrieves project using correct project id`() = runTest { useCase(scannedCredential, SUBJECT_ID) - coVerify { configManager.getProject() } + coVerify { configRepository.getProject() } } private fun enrolmentUpdateEvent( diff --git a/feature/login-check/src/main/java/com/simprints/feature/logincheck/LoginCheckViewModel.kt b/feature/login-check/src/main/java/com/simprints/feature/logincheck/LoginCheckViewModel.kt index 38b649be3f..2318f3b666 100644 --- a/feature/login-check/src/main/java/com/simprints/feature/logincheck/LoginCheckViewModel.kt +++ b/feature/login-check/src/main/java/com/simprints/feature/logincheck/LoginCheckViewModel.kt @@ -22,8 +22,8 @@ import com.simprints.feature.logincheck.usecases.StartBackgroundSyncUseCase import com.simprints.feature.logincheck.usecases.UpdateProjectInCurrentSessionUseCase import com.simprints.feature.logincheck.usecases.UpdateSessionScopePayloadUseCase import com.simprints.feature.logincheck.usecases.UpdateStoredUserIdUseCase +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.ProjectState -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.enrolment.records.repository.local.migration.RealmToRoomMigrationScheduler import com.simprints.infra.logging.LoggingConstants.CrashReportTag.LOGIN import com.simprints.infra.logging.Simber @@ -46,7 +46,7 @@ class LoginCheckViewModel @Inject internal constructor( private val extractParametersForCrashReport: ExtractCrashKeysUseCase, private val addAuthorizationEvent: AddAuthorizationEventUseCase, private val isUserSignedIn: IsUserSignedInUseCase, - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val startBackgroundSync: StartBackgroundSyncUseCase, private val syncOrchestrator: SyncOrchestrator, private val updateDatabaseCountsInCurrentSession: UpdateSessionScopePayloadUseCase, @@ -136,7 +136,7 @@ class LoginCheckViewModel @Inject internal constructor( } private suspend fun validateProjectAndProceed(actionRequest: ActionRequest) { - when (configManager.getProject()?.state) { + when (configRepository.getProject()?.state) { null, ProjectState.PROJECT_ENDING -> _showAlert.send(LoginCheckError.PROJECT_ENDING) ProjectState.PROJECT_PAUSED -> _showAlert.send(LoginCheckError.PROJECT_PAUSED) ProjectState.PROJECT_ENDED -> startSignInAttempt(actionRequest) diff --git a/feature/login-check/src/main/java/com/simprints/feature/logincheck/usecases/EnsureActionFieldsTokenizedUseCase.kt b/feature/login-check/src/main/java/com/simprints/feature/logincheck/usecases/EnsureActionFieldsTokenizedUseCase.kt index 18fdd88fd3..4c35829c6a 100644 --- a/feature/login-check/src/main/java/com/simprints/feature/logincheck/usecases/EnsureActionFieldsTokenizedUseCase.kt +++ b/feature/login-check/src/main/java/com/simprints/feature/logincheck/usecases/EnsureActionFieldsTokenizedUseCase.kt @@ -1,17 +1,17 @@ package com.simprints.feature.logincheck.usecases +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.TokenKeyType import com.simprints.infra.config.store.tokenization.TokenizationProcessor -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.orchestration.data.ActionRequest import javax.inject.Inject class EnsureActionFieldsTokenizedUseCase @Inject constructor( - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val tokenizationProcessor: TokenizationProcessor, ) { suspend operator fun invoke(action: ActionRequest): ActionRequest { - val project = configManager.getProject() ?: return action + val project = configRepository.getProject() ?: return action // There is no automatic `.copy()` on the the interfaces, so we have to enumerate all sub-classes separately return when (action) { diff --git a/feature/login-check/src/main/java/com/simprints/feature/logincheck/usecases/ExtractCrashKeysUseCase.kt b/feature/login-check/src/main/java/com/simprints/feature/logincheck/usecases/ExtractCrashKeysUseCase.kt index 47af8e87a6..b76f089333 100644 --- a/feature/login-check/src/main/java/com/simprints/feature/logincheck/usecases/ExtractCrashKeysUseCase.kt +++ b/feature/login-check/src/main/java/com/simprints/feature/logincheck/usecases/ExtractCrashKeysUseCase.kt @@ -1,19 +1,19 @@ package com.simprints.feature.logincheck.usecases import com.simprints.infra.authstore.AuthStore -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.logging.LoggingConstants.CrashReportingCustomKeys import com.simprints.infra.logging.Simber import com.simprints.infra.orchestration.data.ActionRequest import javax.inject.Inject internal class ExtractCrashKeysUseCase @Inject constructor( - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val authStore: AuthStore, ) { suspend operator fun invoke(action: ActionRequest) { - val projectConfiguration = configManager.getProjectConfiguration() - val deviceConfiguration = configManager.getDeviceConfiguration() + val projectConfiguration = configRepository.getProjectConfiguration() + val deviceConfiguration = configRepository.getDeviceConfiguration() Simber.setUserProperty(CrashReportingCustomKeys.PROJECT_ID, authStore.signedInProjectId) Simber.setUserProperty(CrashReportingCustomKeys.USER_ID, action.userId.toString()) Simber.setUserProperty(CrashReportingCustomKeys.MODULE_IDS, deviceConfiguration.selectedModules.toString()) diff --git a/feature/login-check/src/main/java/com/simprints/feature/logincheck/usecases/StartBackgroundSyncUseCase.kt b/feature/login-check/src/main/java/com/simprints/feature/logincheck/usecases/StartBackgroundSyncUseCase.kt index a9ec258831..10f3f88dc1 100644 --- a/feature/login-check/src/main/java/com/simprints/feature/logincheck/usecases/StartBackgroundSyncUseCase.kt +++ b/feature/login-check/src/main/java/com/simprints/feature/logincheck/usecases/StartBackgroundSyncUseCase.kt @@ -1,18 +1,19 @@ package com.simprints.feature.logincheck.usecases +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.Frequency -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.sync.SyncOrchestrator import javax.inject.Inject internal class StartBackgroundSyncUseCase @Inject constructor( private val syncOrchestrator: SyncOrchestrator, - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, ) { suspend operator fun invoke() { - val frequency = configManager + val frequency = configRepository .getProjectConfiguration() - .synchronization.down.simprints?.frequency + .synchronization.down.simprints + ?.frequency syncOrchestrator.scheduleBackgroundWork( withDelay = frequency != Frequency.PERIODICALLY_AND_ON_SESSION_START, diff --git a/feature/login-check/src/main/java/com/simprints/feature/logincheck/usecases/UpdateProjectInCurrentSessionUseCase.kt b/feature/login-check/src/main/java/com/simprints/feature/logincheck/usecases/UpdateProjectInCurrentSessionUseCase.kt index 55a13aecff..b4afaf7e6f 100644 --- a/feature/login-check/src/main/java/com/simprints/feature/logincheck/usecases/UpdateProjectInCurrentSessionUseCase.kt +++ b/feature/login-check/src/main/java/com/simprints/feature/logincheck/usecases/UpdateProjectInCurrentSessionUseCase.kt @@ -1,14 +1,14 @@ package com.simprints.feature.logincheck.usecases import com.simprints.infra.authstore.AuthStore -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.events.session.SessionEventRepository import javax.inject.Inject internal class UpdateProjectInCurrentSessionUseCase @Inject constructor( private val eventRepository: SessionEventRepository, private val authStore: AuthStore, - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, ) { suspend operator fun invoke() { val sessionScope = eventRepository.getCurrentSessionScope() @@ -18,8 +18,8 @@ internal class UpdateProjectInCurrentSessionUseCase @Inject constructor( val updatedSessionScope = sessionScope.copy( projectId = signedProjectId, payload = sessionScope.payload.copy( - modalities = configManager.getProjectConfiguration().general.modalities, - language = configManager.getDeviceConfiguration().language, + modalities = configRepository.getProjectConfiguration().general.modalities, + language = configRepository.getDeviceConfiguration().language, ), ) diff --git a/feature/login-check/src/main/java/com/simprints/feature/logincheck/usecases/UpdateSessionScopePayloadUseCase.kt b/feature/login-check/src/main/java/com/simprints/feature/logincheck/usecases/UpdateSessionScopePayloadUseCase.kt index 24054a814a..28258c083a 100644 --- a/feature/login-check/src/main/java/com/simprints/feature/logincheck/usecases/UpdateSessionScopePayloadUseCase.kt +++ b/feature/login-check/src/main/java/com/simprints/feature/logincheck/usecases/UpdateSessionScopePayloadUseCase.kt @@ -1,6 +1,6 @@ package com.simprints.feature.logincheck.usecases -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.enrolment.records.repository.EnrolmentRecordRepository import com.simprints.infra.events.session.SessionEventRepository import javax.inject.Inject @@ -8,10 +8,10 @@ import javax.inject.Inject internal class UpdateSessionScopePayloadUseCase @Inject constructor( private val eventRepository: SessionEventRepository, private val enrolmentRecordRepository: EnrolmentRecordRepository, - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, ) { suspend operator fun invoke() { - val configUpdatedAt = configManager.getProjectConfiguration().updatedAt + val configUpdatedAt = configRepository.getProjectConfiguration().updatedAt val recordCount = enrolmentRecordRepository.count() val sessionScope = eventRepository.getCurrentSessionScope() diff --git a/feature/login-check/src/test/java/com/simprints/feature/logincheck/LoginCheckViewModelTest.kt b/feature/login-check/src/test/java/com/simprints/feature/logincheck/LoginCheckViewModelTest.kt index a86fb61470..cfb64d5713 100644 --- a/feature/login-check/src/test/java/com/simprints/feature/logincheck/LoginCheckViewModelTest.kt +++ b/feature/login-check/src/test/java/com/simprints/feature/logincheck/LoginCheckViewModelTest.kt @@ -16,8 +16,8 @@ import com.simprints.feature.logincheck.usecases.StartBackgroundSyncUseCase import com.simprints.feature.logincheck.usecases.UpdateProjectInCurrentSessionUseCase import com.simprints.feature.logincheck.usecases.UpdateSessionScopePayloadUseCase import com.simprints.feature.logincheck.usecases.UpdateStoredUserIdUseCase +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.ProjectState -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.enrolment.records.repository.local.migration.RealmToRoomMigrationScheduler import com.simprints.infra.security.SecurityManager import com.simprints.infra.security.exceptions.RootedDeviceException @@ -56,7 +56,7 @@ internal class LoginCheckViewModelTest { lateinit var isUserSignedInUseCase: IsUserSignedInUseCase @MockK - lateinit var configManager: ConfigManager + lateinit var configRepository: ConfigRepository @MockK lateinit var startBackgroundSync: StartBackgroundSyncUseCase @@ -92,7 +92,7 @@ internal class LoginCheckViewModelTest { extractParametersForCrashReport = extractCrashKeysUseCase, addAuthorizationEvent = addAuthorizationEventUseCase, isUserSignedIn = isUserSignedInUseCase, - configManager = configManager, + configRepository = configRepository, startBackgroundSync = startBackgroundSync, syncOrchestrator = syncOrchestrator, updateDatabaseCountsInCurrentSession = updateSessionScopePayloadUseCase, @@ -269,7 +269,7 @@ internal class LoginCheckViewModelTest { viewModel.validateSignInAndProceed(ActionFactory.getIdentifyRequest()) viewModel.handleLoginResult(LoginResult(true, null)) - coVerify { configManager.getProject() } + coVerify { configRepository.getProject() } } @Test @@ -278,13 +278,13 @@ internal class LoginCheckViewModelTest { viewModel.validateSignInAndProceed(ActionFactory.getIdentifyRequest()) - coVerify { configManager.getProject() } + coVerify { configRepository.getProject() } } @Test fun `Triggers alert if project is paused`() = runTest { coEvery { isUserSignedInUseCase.invoke(any()) } returns IsUserSignedInUseCase.SignedInState.SIGNED_IN - coEvery { configManager.getProject()?.state } returns ProjectState.PROJECT_PAUSED + coEvery { configRepository.getProject()?.state } returns ProjectState.PROJECT_PAUSED viewModel.validateSignInAndProceed(ActionFactory.getIdentifyRequest()) @@ -295,7 +295,7 @@ internal class LoginCheckViewModelTest { @Test fun `Triggers alert if project is not available`() = runTest { - coEvery { configManager.getProject() } returns null + coEvery { configRepository.getProject() } returns null coEvery { isUserSignedInUseCase.invoke(any()) } returns IsUserSignedInUseCase.SignedInState.SIGNED_IN viewModel.validateSignInAndProceed(ActionFactory.getIdentifyRequest()) @@ -308,7 +308,7 @@ internal class LoginCheckViewModelTest { @Test fun `Triggers alert if project is ending`() = runTest { coEvery { isUserSignedInUseCase.invoke(any()) } returns IsUserSignedInUseCase.SignedInState.SIGNED_IN - coEvery { configManager.getProject()?.state } returns ProjectState.PROJECT_ENDING + coEvery { configRepository.getProject()?.state } returns ProjectState.PROJECT_ENDING viewModel.validateSignInAndProceed(ActionFactory.getIdentifyRequest()) @@ -320,7 +320,7 @@ internal class LoginCheckViewModelTest { @Test fun `Triggers login attempt if project has ended`() = runTest { coEvery { isUserSignedInUseCase.invoke(any()) } returns IsUserSignedInUseCase.SignedInState.SIGNED_IN - coEvery { configManager.getProject()?.state } returns ProjectState.PROJECT_ENDED + coEvery { configRepository.getProject()?.state } returns ProjectState.PROJECT_ENDED viewModel.validateSignInAndProceed(ActionFactory.getIdentifyRequest()) @@ -332,7 +332,7 @@ internal class LoginCheckViewModelTest { @Test fun `Correctly handles if user signed in active project`() = runTest { coEvery { isUserSignedInUseCase.invoke(any()) } returns IsUserSignedInUseCase.SignedInState.SIGNED_IN - coEvery { configManager.getProject()?.state } returns ProjectState.RUNNING + coEvery { configRepository.getProject()?.state } returns ProjectState.RUNNING viewModel.validateSignInAndProceed(ActionFactory.getIdentifyRequest()) diff --git a/feature/login-check/src/test/java/com/simprints/feature/logincheck/usecases/EnsureActionFieldsTokenisedUseCaseTest.kt b/feature/login-check/src/test/java/com/simprints/feature/logincheck/usecases/EnsureActionFieldsTokenisedUseCaseTest.kt index 7e307b5136..8ffaad93b4 100644 --- a/feature/login-check/src/test/java/com/simprints/feature/logincheck/usecases/EnsureActionFieldsTokenisedUseCaseTest.kt +++ b/feature/login-check/src/test/java/com/simprints/feature/logincheck/usecases/EnsureActionFieldsTokenisedUseCaseTest.kt @@ -3,10 +3,10 @@ package com.simprints.feature.logincheck.usecases import com.google.common.truth.Truth.* import com.simprints.core.domain.tokenization.asTokenizableEncrypted import com.simprints.core.domain.tokenization.asTokenizableRaw +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.Project import com.simprints.infra.config.store.models.TokenKeyType import com.simprints.infra.config.store.tokenization.TokenizationProcessor -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.orchestration.data.ActionRequest import io.mockk.* import io.mockk.impl.annotations.MockK @@ -16,7 +16,7 @@ import org.junit.Test class EnsureActionFieldsTokenisedUseCaseTest { @MockK - private lateinit var configManager: ConfigManager + private lateinit var configRepository: ConfigRepository @MockK private lateinit var tokenizationProcessor: TokenizationProcessor @@ -29,14 +29,14 @@ class EnsureActionFieldsTokenisedUseCaseTest { @Before fun setUp() { MockKAnnotations.init(this, relaxed = true) - useCase = EnsureActionFieldsTokenizedUseCase(configManager, tokenizationProcessor) + useCase = EnsureActionFieldsTokenizedUseCase(configRepository, tokenizationProcessor) every { tokenizationProcessor.tokenizeIfNecessary(any(), any(), any()) } returns "value".asTokenizableEncrypted() } @Test fun `when project is null, return original action`() = runTest { - coEvery { configManager.getProject() } returns null + coEvery { configRepository.getProject() } returns null val expected = mockk() val result = useCase(expected) @@ -46,7 +46,7 @@ class EnsureActionFieldsTokenisedUseCaseTest { @Test fun `when invoking with EnrolActionRequest, attempt tokenizing fields`() = runTest { - coEvery { configManager.getProject() } returns project + coEvery { configRepository.getProject() } returns project val action = mockk { every { userId } returns "user".asTokenizableRaw() @@ -64,7 +64,7 @@ class EnsureActionFieldsTokenisedUseCaseTest { @Test fun `when invoking with VerifyActionRequest, attempt tokenizing fields`() = runTest { - coEvery { configManager.getProject() } returns project + coEvery { configRepository.getProject() } returns project val action = mockk { every { userId } returns "user".asTokenizableRaw() @@ -82,7 +82,7 @@ class EnsureActionFieldsTokenisedUseCaseTest { @Test fun `when invoking with IdentifyActionRequest, attempt tokenizing fields`() = runTest { - coEvery { configManager.getProject() } returns project + coEvery { configRepository.getProject() } returns project val action = mockk { every { userId } returns "user".asTokenizableRaw() @@ -100,7 +100,7 @@ class EnsureActionFieldsTokenisedUseCaseTest { @Test fun `when invoking with ConfirmIdentityActionRequest, attempt tokenizing fields`() = runTest { - coEvery { configManager.getProject() } returns project + coEvery { configRepository.getProject() } returns project val action = mockk { every { userId } returns "user".asTokenizableRaw() @@ -116,7 +116,7 @@ class EnsureActionFieldsTokenisedUseCaseTest { @Test fun `when invoking with EnrolLastBiometricActionRequest, attempt tokenizing fields`() = runTest { - coEvery { configManager.getProject() } returns project + coEvery { configRepository.getProject() } returns project val action = mockk { every { userId } returns "user".asTokenizableRaw() diff --git a/feature/login-check/src/test/java/com/simprints/feature/logincheck/usecases/ExtractCrashKeysUseCaseTest.kt b/feature/login-check/src/test/java/com/simprints/feature/logincheck/usecases/ExtractCrashKeysUseCaseTest.kt index 9431813dc5..3ab241c7e5 100644 --- a/feature/login-check/src/test/java/com/simprints/feature/logincheck/usecases/ExtractCrashKeysUseCaseTest.kt +++ b/feature/login-check/src/test/java/com/simprints/feature/logincheck/usecases/ExtractCrashKeysUseCaseTest.kt @@ -2,8 +2,8 @@ package com.simprints.feature.logincheck.usecases import com.simprints.core.domain.tokenization.asTokenizableRaw import com.simprints.infra.authstore.AuthStore +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.Frequency -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.logging.Simber import io.mockk.* import io.mockk.impl.annotations.MockK @@ -14,7 +14,7 @@ import org.junit.Test class ExtractCrashKeysUseCaseTest { @MockK - lateinit var configManager: ConfigManager + lateinit var configRepository: ConfigRepository @MockK lateinit var authStore: AuthStore @@ -26,7 +26,7 @@ class ExtractCrashKeysUseCaseTest { MockKAnnotations.init(this, relaxed = true) mockkObject(Simber) - useCase = ExtractCrashKeysUseCase(configManager, authStore) + useCase = ExtractCrashKeysUseCase(configRepository, authStore) } @After @@ -36,10 +36,10 @@ class ExtractCrashKeysUseCaseTest { @Test fun `Sets values to Simber`() = runTest { - coEvery { configManager.getProjectConfiguration() } returns mockk { + coEvery { configRepository.getProjectConfiguration() } returns mockk { every { synchronization.down.simprints?.frequency } returns Frequency.PERIODICALLY } - coEvery { configManager.getDeviceConfiguration() } returns mockk { + coEvery { configRepository.getDeviceConfiguration() } returns mockk { every { selectedModules } returns listOf( "module1".asTokenizableRaw(), "module2".asTokenizableRaw(), diff --git a/feature/login-check/src/test/java/com/simprints/feature/logincheck/usecases/StartBackgroundSyncUseCaseTest.kt b/feature/login-check/src/test/java/com/simprints/feature/logincheck/usecases/StartBackgroundSyncUseCaseTest.kt index 829f82ba76..6d8fe722b1 100644 --- a/feature/login-check/src/test/java/com/simprints/feature/logincheck/usecases/StartBackgroundSyncUseCaseTest.kt +++ b/feature/login-check/src/test/java/com/simprints/feature/logincheck/usecases/StartBackgroundSyncUseCaseTest.kt @@ -1,7 +1,7 @@ package com.simprints.feature.logincheck.usecases +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.Frequency -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.sync.SyncOrchestrator import io.mockk.* import io.mockk.impl.annotations.MockK @@ -14,7 +14,7 @@ class StartBackgroundSyncUseCaseTest { lateinit var syncOrchestrator: SyncOrchestrator @MockK - lateinit var configManager: ConfigManager + lateinit var configRepository: ConfigRepository private lateinit var useCase: StartBackgroundSyncUseCase @@ -24,14 +24,14 @@ class StartBackgroundSyncUseCaseTest { useCase = StartBackgroundSyncUseCase( syncOrchestrator, - configManager, + configRepository, ) } @Test fun `Schedules all syncs when called`() = runTest { coEvery { - configManager + configRepository .getProjectConfiguration() .synchronization.down.simprints?.frequency } returns @@ -45,7 +45,7 @@ class StartBackgroundSyncUseCaseTest { @Test fun `Starts event sync on start if required`() = runTest { coEvery { - configManager + configRepository .getProjectConfiguration() .synchronization.down.simprints?.frequency } returns @@ -59,7 +59,7 @@ class StartBackgroundSyncUseCaseTest { @Test fun `Does not start event sync on start if not required`() = runTest { coEvery { - configManager + configRepository .getProjectConfiguration() .synchronization.down.simprints?.frequency } returns @@ -73,7 +73,7 @@ class StartBackgroundSyncUseCaseTest { @Test fun `Does not start event sync on start if not Simprints sync`() = runTest { coEvery { - configManager + configRepository .getProjectConfiguration() .synchronization.down.simprints } returns null diff --git a/feature/login-check/src/test/java/com/simprints/feature/logincheck/usecases/UpdateProjectInCurrentSessionUseCaseTest.kt b/feature/login-check/src/test/java/com/simprints/feature/logincheck/usecases/UpdateProjectInCurrentSessionUseCaseTest.kt index 227369063e..c41c3fe492 100644 --- a/feature/login-check/src/test/java/com/simprints/feature/logincheck/usecases/UpdateProjectInCurrentSessionUseCaseTest.kt +++ b/feature/login-check/src/test/java/com/simprints/feature/logincheck/usecases/UpdateProjectInCurrentSessionUseCaseTest.kt @@ -3,7 +3,7 @@ package com.simprints.feature.logincheck.usecases import com.google.common.truth.Truth.assertThat import com.simprints.core.tools.time.Timestamp import com.simprints.infra.authstore.AuthStore -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.events.event.domain.models.Event import com.simprints.infra.events.event.domain.models.EventType import com.simprints.infra.events.event.domain.models.IntentParsingEvent @@ -31,7 +31,7 @@ internal class UpdateProjectInCurrentSessionUseCaseTest { lateinit var authStore: AuthStore @MockK - lateinit var configManager: ConfigManager + lateinit var configRepository: ConfigRepository lateinit var useCase: UpdateProjectInCurrentSessionUseCase @@ -40,11 +40,11 @@ internal class UpdateProjectInCurrentSessionUseCaseTest { MockKAnnotations.init(this, relaxed = true) every { authStore.signedInProjectId } returns SIGNED_PROJECT_ID - coEvery { configManager.getProjectConfiguration() } returns mockk { + coEvery { configRepository.getProjectConfiguration() } returns mockk { every { general.modalities } returns emptyList() } - useCase = UpdateProjectInCurrentSessionUseCase(eventRepository, authStore, configManager) + useCase = UpdateProjectInCurrentSessionUseCase(eventRepository, authStore, configRepository) } @Test @@ -88,7 +88,7 @@ internal class UpdateProjectInCurrentSessionUseCaseTest { @Test fun `Update language in current session event when project ID updates`() = runTest { val language = "lang" - coEvery { configManager.getDeviceConfiguration() } returns mockk { + coEvery { configRepository.getDeviceConfiguration() } returns mockk { every { this@mockk.language } returns language } coEvery { eventRepository.getCurrentSessionScope() } returns createBlankSessionScope(OTHER_PROJECT_ID) diff --git a/feature/login-check/src/test/java/com/simprints/feature/logincheck/usecases/UpdateSessionScopePayloadUseCaseTest.kt b/feature/login-check/src/test/java/com/simprints/feature/logincheck/usecases/UpdateSessionScopePayloadUseCaseTest.kt index 43ea759562..daecbc7a00 100644 --- a/feature/login-check/src/test/java/com/simprints/feature/logincheck/usecases/UpdateSessionScopePayloadUseCaseTest.kt +++ b/feature/login-check/src/test/java/com/simprints/feature/logincheck/usecases/UpdateSessionScopePayloadUseCaseTest.kt @@ -2,7 +2,7 @@ package com.simprints.feature.logincheck.usecases import com.google.common.truth.Truth.assertThat import com.simprints.core.tools.time.Timestamp -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.enrolment.records.repository.EnrolmentRecordRepository import com.simprints.infra.events.event.domain.models.scope.DatabaseInfo import com.simprints.infra.events.event.domain.models.scope.Device @@ -26,7 +26,7 @@ internal class UpdateSessionScopePayloadUseCaseTest { lateinit var enrolmentRecordRepository: EnrolmentRecordRepository @MockK - lateinit var configManager: ConfigManager + lateinit var configRepository: ConfigRepository private lateinit var useCase: UpdateSessionScopePayloadUseCase @@ -37,14 +37,14 @@ internal class UpdateSessionScopePayloadUseCaseTest { useCase = UpdateSessionScopePayloadUseCase( eventRepository, enrolmentRecordRepository, - configManager, + configRepository, ) } @Test fun `Updates current scope with data from enrolments`() = runTest { coEvery { enrolmentRecordRepository.count() } returns 42 - coEvery { configManager.getProjectConfiguration().updatedAt } returns "configUpdatedAt" + coEvery { configRepository.getProjectConfiguration().updatedAt } returns "configUpdatedAt" coEvery { eventRepository.getCurrentSessionScope() } returns createBlankSessionScope() diff --git a/feature/matcher/src/main/java/com/simprints/matcher/screen/MatchViewModel.kt b/feature/matcher/src/main/java/com/simprints/matcher/screen/MatchViewModel.kt index 8bd0f026ac..37206a035d 100644 --- a/feature/matcher/src/main/java/com/simprints/matcher/screen/MatchViewModel.kt +++ b/feature/matcher/src/main/java/com/simprints/matcher/screen/MatchViewModel.kt @@ -8,10 +8,10 @@ import com.simprints.core.domain.comparison.ComparisonResult import com.simprints.core.livedata.LiveDataEventWithContent import com.simprints.core.livedata.send import com.simprints.core.tools.time.TimeHelper +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.DecisionPolicy import com.simprints.infra.config.store.models.FaceConfiguration import com.simprints.infra.config.store.models.getModalitySdkConfig -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.matching.MatchParams import com.simprints.infra.matching.MatchResult import com.simprints.infra.matching.usecase.FaceMatcherUseCase @@ -28,7 +28,7 @@ internal class MatchViewModel @Inject constructor( private val faceMatcher: FaceMatcherUseCase, private val fingerprintMatcher: FingerprintMatcherUseCase, private val saveMatchEvent: SaveMatchEventUseCase, - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val timeHelper: TimeHelper, ) : ViewModel() { var isMatcherRunning = false @@ -57,7 +57,7 @@ internal class MatchViewModel @Inject constructor( is FaceConfiguration.BioSdk -> faceMatcher else -> fingerprintMatcher } - val project = configManager.getProject() ?: return@launch + val project = configRepository.getProject() ?: return@launch val decisionPolicy = getDecisionPolicy(params) candidatesLoaded = 0 @@ -98,7 +98,7 @@ internal class MatchViewModel @Inject constructor( } } - private suspend fun getDecisionPolicy(params: MatchParams): DecisionPolicy = configManager + private suspend fun getDecisionPolicy(params: MatchParams): DecisionPolicy = configRepository .getProjectConfiguration() .getModalitySdkConfig(params.bioSdk) ?.decisionPolicy diff --git a/feature/matcher/src/test/java/com/simprints/matcher/screen/MatchViewModelTest.kt b/feature/matcher/src/test/java/com/simprints/matcher/screen/MatchViewModelTest.kt index fce84a0124..88f665b3f3 100644 --- a/feature/matcher/src/test/java/com/simprints/matcher/screen/MatchViewModelTest.kt +++ b/feature/matcher/src/test/java/com/simprints/matcher/screen/MatchViewModelTest.kt @@ -11,10 +11,10 @@ import com.simprints.core.domain.common.TemplateIdentifier import com.simprints.core.domain.comparison.ComparisonResult import com.simprints.core.tools.time.TimeHelper import com.simprints.core.tools.time.Timestamp +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.DecisionPolicy import com.simprints.infra.config.store.models.FaceConfiguration import com.simprints.infra.config.store.models.FingerprintConfiguration.BioSdk.SECUGEN_SIM_MATCHER -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.enrolment.records.repository.domain.models.BiometricDataSource import com.simprints.infra.matching.MatchBatchInfo import com.simprints.infra.matching.MatchParams @@ -58,7 +58,7 @@ internal class MatchViewModelTest { lateinit var timeHelper: TimeHelper @MockK - lateinit var configManager: ConfigManager + lateinit var configRepository: ConfigRepository private lateinit var cb1: CapturingSlot<(Int) -> Unit> private lateinit var viewModel: MatchViewModel @@ -75,7 +75,7 @@ internal class MatchViewModelTest { faceMatcherUseCase, fingerprintMatcherUseCase, saveMatchEvent, - configManager, + configRepository, timeHelper, ) } @@ -131,7 +131,7 @@ internal class MatchViewModelTest { @Test fun `Handle face match request correctly`() = runTest { coEvery { - configManager + configRepository .getProjectConfiguration() .face ?.rankOne @@ -224,7 +224,7 @@ internal class MatchViewModelTest { @Test fun `Handle fingerprint match request correctly`() = runTest { coEvery { - configManager + configRepository .getProjectConfiguration() .fingerprint ?.secugenSimMatcher @@ -319,7 +319,7 @@ internal class MatchViewModelTest { @Test fun `Handle missing decision policy`() = runTest { coEvery { - configManager + configRepository .getProjectConfiguration() .face ?.rankOne diff --git a/feature/orchestrator/src/main/java/com/simprints/feature/orchestrator/OrchestratorViewModel.kt b/feature/orchestrator/src/main/java/com/simprints/feature/orchestrator/OrchestratorViewModel.kt index fb7d686807..9561101053 100644 --- a/feature/orchestrator/src/main/java/com/simprints/feature/orchestrator/OrchestratorViewModel.kt +++ b/feature/orchestrator/src/main/java/com/simprints/feature/orchestrator/OrchestratorViewModel.kt @@ -6,9 +6,9 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.fasterxml.jackson.core.type.TypeReference import com.fasterxml.jackson.databind.module.SimpleModule +import com.simprints.core.domain.capture.BiometricReferenceCapture import com.simprints.core.domain.common.FlowType import com.simprints.core.domain.common.Modality -import com.simprints.core.domain.capture.BiometricReferenceCapture import com.simprints.core.domain.response.AppErrorReason import com.simprints.core.domain.step.StepResult import com.simprints.core.domain.tokenization.TokenizableString @@ -38,7 +38,7 @@ import com.simprints.feature.orchestrator.usecases.steps.BuildStepsUseCase import com.simprints.feature.selectagegroup.SelectSubjectAgeGroupResult import com.simprints.feature.setup.LocationStore import com.simprints.fingerprint.capture.FingerprintCaptureParams -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.logging.LoggingConstants.CrashReportTag.ORCHESTRATION import com.simprints.infra.logging.Simber import com.simprints.infra.orchestration.data.ActionRequest @@ -52,7 +52,7 @@ import javax.inject.Inject @HiltViewModel internal class OrchestratorViewModel @Inject constructor( - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val cache: OrchestratorCache, private val locationStore: LocationStore, private val stepsBuilder: BuildStepsUseCase, @@ -79,7 +79,7 @@ internal class OrchestratorViewModel @Inject constructor( private val _appResponse = MutableLiveData>() fun handleAction(action: ActionRequest) = viewModelScope.launch { - val projectConfiguration = configManager.getProjectConfiguration() + val projectConfiguration = configRepository.getProjectConfiguration() modalities = projectConfiguration.general.modalities.toSet() actionRequest = action @@ -118,7 +118,7 @@ internal class OrchestratorViewModel @Inject constructor( Simber.i("Handling step result: ${result.javaClass.simpleName}", tag = ORCHESTRATION) Simber.d(result.toString(), tag = ORCHESTRATION) - val projectConfiguration = configManager.getProjectConfiguration() + val projectConfiguration = configRepository.getProjectConfiguration() val errorResponse = mapRefusalOrErrorResult(result, projectConfiguration) if (errorResponse != null) { // Shortcut the flow execution if any refusal or error result is found @@ -168,7 +168,7 @@ internal class OrchestratorViewModel @Inject constructor( fun restoreModalitiesIfNeeded() { viewModelScope.launch { if (modalities.isEmpty()) { - val projectConfiguration = configManager.getProjectConfiguration() + val projectConfiguration = configRepository.getProjectConfiguration() modalities = projectConfiguration.general.modalities.toSet() } } @@ -237,8 +237,8 @@ internal class OrchestratorViewModel @Inject constructor( } private fun buildAppResponse() = viewModelScope.launch { - val projectConfiguration = configManager.getProjectConfiguration() - val project = configManager.getProject() ?: return@launch + val projectConfiguration = configRepository.getProjectConfiguration() + val project = configRepository.getProject() ?: return@launch val appResponse = appResponseBuilder( projectConfiguration = projectConfiguration, request = actionRequest, diff --git a/feature/orchestrator/src/test/java/com/simprints/feature/orchestrator/OrchestratorViewModelTest.kt b/feature/orchestrator/src/test/java/com/simprints/feature/orchestrator/OrchestratorViewModelTest.kt index b7fad3ba1a..5f4f4887d5 100644 --- a/feature/orchestrator/src/test/java/com/simprints/feature/orchestrator/OrchestratorViewModelTest.kt +++ b/feature/orchestrator/src/test/java/com/simprints/feature/orchestrator/OrchestratorViewModelTest.kt @@ -4,11 +4,11 @@ import androidx.arch.core.executor.testing.InstantTaskExecutorRule import androidx.test.ext.junit.runners.* import com.google.common.truth.Truth.* import com.jraska.livedata.test +import com.simprints.core.domain.capture.BiometricReferenceCapture +import com.simprints.core.domain.capture.BiometricTemplateCapture import com.simprints.core.domain.common.AgeGroup import com.simprints.core.domain.common.FlowType import com.simprints.core.domain.common.Modality -import com.simprints.core.domain.capture.BiometricReferenceCapture -import com.simprints.core.domain.capture.BiometricTemplateCapture import com.simprints.core.domain.common.TemplateIdentifier import com.simprints.core.domain.response.AppErrorReason import com.simprints.core.domain.step.StepParams @@ -35,10 +35,10 @@ import com.simprints.feature.selectagegroup.SelectSubjectAgeGroupResult import com.simprints.feature.setup.LocationStore import com.simprints.feature.setup.SetupResult import com.simprints.fingerprint.capture.FingerprintCaptureContract +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.FaceConfiguration import com.simprints.infra.config.store.models.FingerprintConfiguration.BioSdk.NEC import com.simprints.infra.config.store.models.FingerprintConfiguration.BioSdk.SECUGEN_SIM_MATCHER -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.enrolment.records.repository.domain.models.BiometricDataSource import com.simprints.infra.enrolment.records.repository.domain.models.EnrolmentRecordQuery import com.simprints.infra.events.sampledata.SampleDefaults.GUID1 @@ -63,7 +63,7 @@ internal class OrchestratorViewModelTest { val testCoroutineRule = TestCoroutineRule() @MockK - private lateinit var configManager: ConfigManager + private lateinit var configRepository: ConfigRepository @MockK private lateinit var cache: OrchestratorCache @@ -96,7 +96,7 @@ internal class OrchestratorViewModelTest { MockKAnnotations.init(this, relaxed = true) viewModel = OrchestratorViewModel( - configManager, + configRepository, cache, locationStore, stepsBuilder, @@ -364,16 +364,16 @@ internal class OrchestratorViewModelTest { mockk(), ) val id = "projectId" - coEvery { configManager.getProjectConfiguration() } returns mockk { + coEvery { configRepository.getProjectConfiguration() } returns mockk { every { projectId } returns id every { general.modalities } returns emptyList() andThen projectModalities } - coEvery { configManager.getProject() } returns mockk() + coEvery { configRepository.getProject() } returns mockk() viewModel.handleAction(mockk()) viewModel.restoreModalitiesIfNeeded() - coVerify(exactly = 3) { configManager.getProjectConfiguration() } + coVerify(exactly = 3) { configRepository.getProjectConfiguration() } } @Test @@ -383,16 +383,16 @@ internal class OrchestratorViewModelTest { mockk(), ) val id = "projectId" - coEvery { configManager.getProjectConfiguration() } returns mockk { + coEvery { configRepository.getProjectConfiguration() } returns mockk { every { projectId } returns id every { general.modalities } returns projectModalities } - coEvery { configManager.getProject() } returns mockk() + coEvery { configRepository.getProject() } returns mockk() viewModel.handleAction(mockk()) viewModel.restoreModalitiesIfNeeded() - coVerify(exactly = 2) { configManager.getProjectConfiguration() } + coVerify(exactly = 2) { configRepository.getProjectConfiguration() } } @Test diff --git a/feature/select-subject/src/main/java/com/simprints/feature/selectsubject/screen/SelectSubjectViewModel.kt b/feature/select-subject/src/main/java/com/simprints/feature/selectsubject/screen/SelectSubjectViewModel.kt index f0a90404d8..c92edddcd6 100644 --- a/feature/select-subject/src/main/java/com/simprints/feature/selectsubject/screen/SelectSubjectViewModel.kt +++ b/feature/select-subject/src/main/java/com/simprints/feature/selectsubject/screen/SelectSubjectViewModel.kt @@ -17,9 +17,9 @@ import com.simprints.feature.selectsubject.SelectSubjectParams import com.simprints.feature.selectsubject.SelectSubjectResult import com.simprints.feature.selectsubject.model.SelectSubjectState import com.simprints.infra.authstore.AuthStore +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.TokenKeyType import com.simprints.infra.config.store.tokenization.TokenizationProcessor -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.enrolment.records.repository.EnrolmentRecordRepository import com.simprints.infra.enrolment.records.repository.domain.models.EnrolmentRecordQuery import com.simprints.infra.events.event.domain.models.EnrolmentUpdateEvent @@ -39,7 +39,7 @@ internal class SelectSubjectViewModel @AssistedInject constructor( private val timeHelper: TimeHelper, private val authStore: AuthStore, private val eventRepository: SessionEventRepository, - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val resetExternalCredentialsUseCase: ResetExternalCredentialsInSessionUseCase, private val enrolmentRecordRepository: EnrolmentRecordRepository, private val tokenizationProcessor: TokenizationProcessor, @@ -98,7 +98,7 @@ internal class SelectSubjectViewModel @AssistedInject constructor( ): SelectSubjectState.CredentialDialogDisplayed? { if (scannedCredential == null) return null val credential = scannedCredential.credential - val project = configManager.getProject() ?: return null + val project = configRepository.getProject() ?: return null val alreadyLinkedSubject = enrolmentRecordRepository .load( EnrolmentRecordQuery( diff --git a/feature/select-subject/src/test/java/com/simprints/feature/selectsubject/screen/SelectSubjectViewModelTest.kt b/feature/select-subject/src/test/java/com/simprints/feature/selectsubject/screen/SelectSubjectViewModelTest.kt index 8f48f2b6ea..2b64bc2e63 100644 --- a/feature/select-subject/src/test/java/com/simprints/feature/selectsubject/screen/SelectSubjectViewModelTest.kt +++ b/feature/select-subject/src/test/java/com/simprints/feature/selectsubject/screen/SelectSubjectViewModelTest.kt @@ -13,10 +13,10 @@ import com.simprints.feature.externalcredential.usecase.ResetExternalCredentials import com.simprints.feature.selectsubject.SelectSubjectParams import com.simprints.feature.selectsubject.model.SelectSubjectState import com.simprints.infra.authstore.AuthStore +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.Project import com.simprints.infra.config.store.models.TokenKeyType import com.simprints.infra.config.store.tokenization.TokenizationProcessor -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.enrolment.records.repository.EnrolmentRecordRepository import com.simprints.infra.enrolment.records.repository.domain.models.EnrolmentRecord import com.simprints.infra.events.event.domain.models.EnrolmentUpdateEvent @@ -49,7 +49,7 @@ internal class SelectSubjectViewModelTest { lateinit var eventRepository: SessionEventRepository @MockK - lateinit var configManager: ConfigManager + lateinit var configRepository: ConfigRepository @MockK lateinit var project: Project @@ -79,7 +79,7 @@ internal class SelectSubjectViewModelTest { timeHelper = timeHelper, authStore = authStore, eventRepository = eventRepository, - configManager = configManager, + configRepository = configRepository, resetExternalCredentialsUseCase = resetScannedCredentialsInSession, enrolmentRecordRepository = enrolmentRecordRepository, tokenizationProcessor = tokenizationProcessor, @@ -92,7 +92,7 @@ internal class SelectSubjectViewModelTest { timeHelper = timeHelper, authStore = authStore, eventRepository = eventRepository, - configManager = configManager, + configRepository = configRepository, resetExternalCredentialsUseCase = resetScannedCredentialsInSession, enrolmentRecordRepository = enrolmentRecordRepository, tokenizationProcessor = tokenizationProcessor, @@ -272,7 +272,7 @@ internal class SelectSubjectViewModelTest { coEvery { authStore.isProjectIdSignedIn(PROJECT_ID) } returns true coEvery { authStore.signedInProjectId } returns PROJECT_ID every { project?.id } returns PROJECT_ID - coEvery { configManager.getProject() } returns configuredProject + coEvery { configRepository.getProject() } returns configuredProject coEvery { enrolmentRecordRepository.load(any()) } returns repositoryResponse coEvery { tokenizationProcessor.decrypt( diff --git a/feature/setup/src/main/java/com/simprints/feature/setup/screen/SetupViewModel.kt b/feature/setup/src/main/java/com/simprints/feature/setup/screen/SetupViewModel.kt index f09d6438bc..72dd481c0d 100644 --- a/feature/setup/src/main/java/com/simprints/feature/setup/screen/SetupViewModel.kt +++ b/feature/setup/src/main/java/com/simprints/feature/setup/screen/SetupViewModel.kt @@ -9,11 +9,11 @@ import com.simprints.core.DeviceID import com.simprints.core.domain.common.Modality import com.simprints.feature.setup.LocationStore import com.simprints.infra.authstore.AuthStore +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.FaceConfiguration import com.simprints.infra.config.store.models.FingerprintConfiguration import com.simprints.infra.config.store.models.ProjectConfiguration import com.simprints.infra.config.store.models.isCommCareEventDownSyncAllowed -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.license.LicenseRepository import com.simprints.infra.license.LicenseStatus import com.simprints.infra.license.SaveLicenseCheckEventUseCase @@ -27,7 +27,7 @@ import javax.inject.Inject @HiltViewModel internal class SetupViewModel @Inject constructor( private val locationStore: LocationStore, - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val licenseRepository: LicenseRepository, @param:DeviceID private val deviceID: String, private val authStore: AuthStore, @@ -112,7 +112,7 @@ internal class SetupViewModel @Inject constructor( private fun downloadRequiredLicenses() { viewModelScope.launch { - requiredLicenses = configManager.getProjectConfiguration().requiredLicenses + requiredLicenses = configRepository.getProjectConfiguration().requiredLicenses // if there are no required licenses, then the setup is complete if (requiredLicenses.isEmpty()) { @@ -144,9 +144,9 @@ internal class SetupViewModel @Inject constructor( } } - private suspend fun shouldCollectLocation() = configManager.getProjectConfiguration().general.collectLocation + private suspend fun shouldCollectLocation() = configRepository.getProjectConfiguration().general.collectLocation - private suspend fun shouldRequestCommCarePermission() = configManager.getProjectConfiguration().isCommCareEventDownSyncAllowed() + private suspend fun shouldRequestCommCarePermission() = configRepository.getProjectConfiguration().isCommCareEventDownSyncAllowed() private fun shouldRequestNotificationPermission() = Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU } diff --git a/feature/setup/src/test/java/com/simprints/feature/setup/screen/SetupViewModelTest.kt b/feature/setup/src/test/java/com/simprints/feature/setup/screen/SetupViewModelTest.kt index 8369182d06..a017b529eb 100644 --- a/feature/setup/src/test/java/com/simprints/feature/setup/screen/SetupViewModelTest.kt +++ b/feature/setup/src/test/java/com/simprints/feature/setup/screen/SetupViewModelTest.kt @@ -5,10 +5,10 @@ import com.jraska.livedata.test import com.simprints.core.domain.common.Modality import com.simprints.feature.setup.LocationStore import com.simprints.infra.authstore.AuthStore +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.FaceConfiguration import com.simprints.infra.config.store.models.FingerprintConfiguration import com.simprints.infra.config.store.models.ProjectConfiguration -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.license.LicenseRepository import com.simprints.infra.license.LicenseStatus import com.simprints.infra.license.SaveLicenseCheckEventUseCase @@ -44,7 +44,7 @@ class SetupViewModelTest { @MockK private lateinit var saveLicenseCheckEvent: SaveLicenseCheckEventUseCase - private val configManager = mockk() + private val configRepository = mockk() private lateinit var viewModel: SetupViewModel private val deviceID = "deviceID" @@ -57,7 +57,7 @@ class SetupViewModelTest { viewModel = SetupViewModel( locationStore, - configManager, + configRepository, licenseRepository, deviceID, authStore, @@ -68,7 +68,7 @@ class SetupViewModelTest { @Test fun `should request location permission if collectLocation is enabled`() = runTest { // Given - coEvery { configManager.getProjectConfiguration().general.collectLocation } returns true + coEvery { configRepository.getProjectConfiguration().general.collectLocation } returns true // When viewModel.start() @@ -80,9 +80,9 @@ class SetupViewModelTest { @Test fun `should not request location permission if collectLocation is disabled`() = runTest { // Given - coEvery { configManager.getProjectConfiguration().general.collectLocation } returns false + coEvery { configRepository.getProjectConfiguration().general.collectLocation } returns false coEvery { - configManager + configRepository .getProjectConfiguration() .synchronization.down.commCare } returns mockk() @@ -98,9 +98,9 @@ class SetupViewModelTest { fun `should call locationStore collectLocationInBackground() if location permission is granted`() = runTest { // Given justRun { locationStore.collectLocationInBackground() } - coEvery { configManager.getProjectConfiguration() } returns mockk() + coEvery { configRepository.getProjectConfiguration() } returns mockk() coEvery { - configManager + configRepository .getProjectConfiguration() .synchronization.down.commCare } returns mockk() @@ -116,9 +116,9 @@ class SetupViewModelTest { fun `should not call locationStore collectLocationInBackground() if location permission is not granted`() = runTest { // Given justRun { locationStore.collectLocationInBackground() } - coEvery { configManager.getProjectConfiguration() } returns mockk() + coEvery { configRepository.getProjectConfiguration() } returns mockk() coEvery { - configManager + configRepository .getProjectConfiguration() .synchronization.down.commCare } returns mockk() @@ -135,7 +135,7 @@ class SetupViewModelTest { // Given justRun { locationStore.collectLocationInBackground() } coEvery { - configManager + configRepository .getProjectConfiguration() .synchronization.down.commCare } returns mockk() @@ -152,7 +152,7 @@ class SetupViewModelTest { // Given justRun { locationStore.collectLocationInBackground() } coEvery { - configManager + configRepository .getProjectConfiguration() .synchronization.down.commCare } returns mockk() @@ -167,7 +167,7 @@ class SetupViewModelTest { @Test fun `should download required licenses`() = runTest { // Given - coEvery { configManager.getProjectConfiguration() } returns mockk { + coEvery { configRepository.getProjectConfiguration() } returns mockk { every { general } returns mockk { every { modalities } returns listOf( Modality.FINGERPRINT, @@ -198,7 +198,7 @@ class SetupViewModelTest { @Test fun `should download required licenses with unlimited versions`() = runTest { // Given - coEvery { configManager.getProjectConfiguration() } returns mockk { + coEvery { configRepository.getProjectConfiguration() } returns mockk { every { general } returns mockk { every { modalities } returns listOf( Modality.FINGERPRINT, @@ -229,7 +229,7 @@ class SetupViewModelTest { @Test fun `should not download required licenses if there are no required licenses`() = runTest { // Given - coEvery { configManager.getProjectConfiguration() } returns mockk { + coEvery { configRepository.getProjectConfiguration() } returns mockk { every { general } returns mockk { every { modalities } returns listOf( Modality.FINGERPRINT, @@ -254,7 +254,7 @@ class SetupViewModelTest { @Test fun `should fail if any license fails`() = runTest { // Given - coEvery { configManager.getProjectConfiguration() } returns mockk { + coEvery { configRepository.getProjectConfiguration() } returns mockk { every { general } returns mockk { every { modalities } returns listOf( Modality.FINGERPRINT, diff --git a/feature/troubleshooting/src/main/java/com/simprints/feature/troubleshooting/overview/usecase/ExportLogsUseCase.kt b/feature/troubleshooting/src/main/java/com/simprints/feature/troubleshooting/overview/usecase/ExportLogsUseCase.kt index 0779ca9d36..580136d37e 100644 --- a/feature/troubleshooting/src/main/java/com/simprints/feature/troubleshooting/overview/usecase/ExportLogsUseCase.kt +++ b/feature/troubleshooting/src/main/java/com/simprints/feature/troubleshooting/overview/usecase/ExportLogsUseCase.kt @@ -3,7 +3,7 @@ package com.simprints.feature.troubleshooting.overview.usecase import android.content.Context import com.simprints.core.DeviceID import com.simprints.feature.troubleshooting.FileNameDateTimeFormatter -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.logging.LogDirectoryProvider import dagger.hilt.android.qualifiers.ApplicationContext import kotlinx.coroutines.flow.Flow @@ -20,7 +20,7 @@ internal class ExportLogsUseCase @Inject constructor( @param:DeviceID private val deviceId: String, @param:ApplicationContext private val context: Context, private val logDirectoryProvider: LogDirectoryProvider, - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, @param:FileNameDateTimeFormatter private val dateFormatter: SimpleDateFormat, ) { operator fun invoke(): Flow = flow { @@ -49,7 +49,7 @@ internal class ExportLogsUseCase @Inject constructor( it.mkdirs() }.let { File(it, "$name.zip") } - private suspend fun getPassword() = configManager + private suspend fun getPassword() = configRepository .getProjectConfiguration() .let { it.general.settingsPassword.getNullablePassword() ?: it.projectId } .toCharArray() diff --git a/feature/troubleshooting/src/test/java/com/simprints/feature/troubleshooting/overview/usecase/ExportLogsUseCaseTest.kt b/feature/troubleshooting/src/test/java/com/simprints/feature/troubleshooting/overview/usecase/ExportLogsUseCaseTest.kt index 160d7e6405..dd69b2b964 100644 --- a/feature/troubleshooting/src/test/java/com/simprints/feature/troubleshooting/overview/usecase/ExportLogsUseCaseTest.kt +++ b/feature/troubleshooting/src/test/java/com/simprints/feature/troubleshooting/overview/usecase/ExportLogsUseCaseTest.kt @@ -2,8 +2,8 @@ package com.simprints.feature.troubleshooting.overview.usecase import android.content.Context import com.google.common.truth.Truth.assertThat +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.ProjectConfiguration -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.logging.LogDirectoryProvider import io.mockk.MockKAnnotations import io.mockk.coEvery @@ -26,7 +26,7 @@ class ExportLogsUseCaseTest { private lateinit var logDirectoryProvider: LogDirectoryProvider @MockK - private lateinit var configManager: ConfigManager + private lateinit var configRepository: ConfigRepository @MockK private lateinit var projectConfiguration: ProjectConfiguration @@ -48,13 +48,13 @@ class ExportLogsUseCaseTest { every { context.cacheDir } returns cacheFileRoot every { dateFormatter.format(any()) } returns "fileName" - coEvery { configManager.getProjectConfiguration() } returns projectConfiguration + coEvery { configRepository.getProjectConfiguration() } returns projectConfiguration exportLogsUseCase = ExportLogsUseCase( deviceId = "deviceId", context = context, logDirectoryProvider = logDirectoryProvider, - configManager = configManager, + configRepository = configRepository, dateFormatter = dateFormatter, ) } diff --git a/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/screen/FingerprintCaptureViewModel.kt b/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/screen/FingerprintCaptureViewModel.kt index 103197a3e6..1c5d029281 100644 --- a/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/screen/FingerprintCaptureViewModel.kt +++ b/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/screen/FingerprintCaptureViewModel.kt @@ -6,9 +6,9 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.simprints.core.ExternalScope -import com.simprints.core.domain.common.Modality import com.simprints.core.domain.capture.BiometricReferenceCapture import com.simprints.core.domain.capture.BiometricTemplateCapture +import com.simprints.core.domain.common.Modality import com.simprints.core.domain.common.TemplateIdentifier import com.simprints.core.livedata.LiveDataEvent import com.simprints.core.livedata.LiveDataEventWithContent @@ -45,13 +45,13 @@ import com.simprints.fingerprint.infra.scanner.exceptions.safe.NoFingerDetectedE import com.simprints.fingerprint.infra.scanner.exceptions.safe.ScannerDisconnectedException import com.simprints.fingerprint.infra.scanner.exceptions.safe.ScannerOperationInterruptedException import com.simprints.fingerprint.infra.scanner.wrapper.ScannerWrapper +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.FingerprintConfiguration import com.simprints.infra.config.store.models.Vero2Configuration.ImageSavingStrategy.EAGER import com.simprints.infra.config.store.models.Vero2Configuration.ImageSavingStrategy.NEVER import com.simprints.infra.config.store.models.Vero2Configuration.ImageSavingStrategy.ONLY_GOOD_SCAN import com.simprints.infra.config.store.models.Vero2Configuration.ImageSavingStrategy.ONLY_USED_IN_REFERENCE import com.simprints.infra.config.store.models.Vero2Configuration.LedsMode.LIVE_QUALITY_FEEDBACK -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.logging.LoggingConstants.CrashReportTag.FINGER_CAPTURE import com.simprints.infra.logging.Simber import dagger.hilt.android.lifecycle.HiltViewModel @@ -69,7 +69,7 @@ import kotlin.math.min @HiltViewModel internal class FingerprintCaptureViewModel @Inject constructor( private val scannerManager: ScannerManager, - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val timeHelper: TimeHelper, private val resolveBioSdkWrapperUseCase: ResolveBioSdkWrapperUseCase, private val saveImage: SaveFingerprintSampleUseCase, @@ -175,7 +175,7 @@ internal class FingerprintCaptureViewModel @Inject constructor( runBlocking { // Configuration must be initialised when start returns for UI to be initialised correctly, // and since fetching happens on IO thread execution must be suspended until it is available - configuration = configManager.getProjectConfiguration().fingerprint!! + configuration = configRepository.getProjectConfiguration().fingerprint!! initBioSdk(fingerprintSdk) } diff --git a/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/screen/ObserveFingerprintScanStatusUseCase.kt b/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/screen/ObserveFingerprintScanStatusUseCase.kt index 7abb87ddd7..31f48438c8 100644 --- a/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/screen/ObserveFingerprintScanStatusUseCase.kt +++ b/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/screen/ObserveFingerprintScanStatusUseCase.kt @@ -5,11 +5,11 @@ import androidx.preference.PreferenceManager import com.simprints.fingerprint.infra.scanner.ScannerManager import com.simprints.fingerprint.infra.scanner.capture.FingerprintScanState import com.simprints.fingerprint.infra.scanner.capture.FingerprintScanningStatusTracker +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.FingerprintConfiguration import com.simprints.infra.config.store.models.Vero2Configuration import com.simprints.infra.config.store.models.Vero2Configuration.LedsMode.BASIC import com.simprints.infra.config.store.models.Vero2Configuration.LedsMode.VISUAL_SCAN_FEEDBACK -import com.simprints.infra.config.sync.ConfigManager import dagger.hilt.android.qualifiers.ApplicationContext import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Job @@ -22,7 +22,7 @@ import javax.inject.Singleton class ObserveFingerprintScanStatusUseCase @Inject constructor( private val statusTracker: FingerprintScanningStatusTracker, private val playAudioBeep: PlayAudioBeepUseCase, - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val scannerManager: ScannerManager, @ApplicationContext private val context: Context, ) { @@ -36,7 +36,7 @@ class ObserveFingerprintScanStatusUseCase @Inject constructor( ) { stopObserving() observeJob = coroutineScope.launch { - ledsMode = configManager + ledsMode = configRepository .getProjectConfiguration() .fingerprint ?.getSdkConfiguration( diff --git a/fingerprint/capture/src/test/java/com/simprints/fingerprint/capture/screen/FingerprintCaptureViewModelTest.kt b/fingerprint/capture/src/test/java/com/simprints/fingerprint/capture/screen/FingerprintCaptureViewModelTest.kt index 927d32343f..5fdc12ac4c 100644 --- a/fingerprint/capture/src/test/java/com/simprints/fingerprint/capture/screen/FingerprintCaptureViewModelTest.kt +++ b/fingerprint/capture/src/test/java/com/simprints/fingerprint/capture/screen/FingerprintCaptureViewModelTest.kt @@ -34,13 +34,13 @@ import com.simprints.fingerprint.infra.scanner.exceptions.safe.NoFingerDetectedE import com.simprints.fingerprint.infra.scanner.exceptions.safe.ScannerDisconnectedException import com.simprints.fingerprint.infra.scanner.wrapper.ScannerWrapper import com.simprints.fingerprint.testtools.FingerprintGenerator +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.FingerprintConfiguration.BioSdk.SECUGEN_SIM_MATCHER import com.simprints.infra.config.store.models.Vero1Configuration import com.simprints.infra.config.store.models.Vero2Configuration import com.simprints.infra.config.store.models.Vero2Configuration.ImageSavingStrategy import com.simprints.infra.config.store.models.Vero2Configuration.LedsMode.BASIC import com.simprints.infra.config.store.models.Vero2Configuration.LedsMode.LIVE_QUALITY_FEEDBACK -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.images.model.Path import com.simprints.testtools.common.coroutines.TestCoroutineRule import com.simprints.testtools.common.livedata.assertEventNotReceived @@ -74,7 +74,7 @@ class FingerprintCaptureViewModelTest { private lateinit var vero2Configuration: Vero2Configuration @MockK - private lateinit var configManager: ConfigManager + private lateinit var configRepository: ConfigRepository @MockK private lateinit var scanner: ScannerWrapper @@ -120,7 +120,7 @@ class FingerprintCaptureViewModelTest { every { vero2Configuration.ledsMode } returns BASIC every { vero2Configuration.captureStrategy } returns Vero2Configuration.CaptureStrategy.SECUGEN_ISO_1000_DPI every { vero2Configuration.imageSavingStrategy } returns ImageSavingStrategy.NEVER - coEvery { configManager.getProjectConfiguration().fingerprint?.getSdkConfiguration(any()) } returns mockk { + coEvery { configRepository.getProjectConfiguration().fingerprint?.getSdkConfiguration(any()) } returns mockk { every { vero1 } returns Vero1Configuration(60) every { vero2 } returns vero2Configuration } @@ -143,7 +143,7 @@ class FingerprintCaptureViewModelTest { vm = FingerprintCaptureViewModel( scannerManager = scannerManager, - configManager = configManager, + configRepository = configRepository, timeHelper = timeHelper, resolveBioSdkWrapperUseCase = resolveBioSdkWrapperUseCase, saveImage = saveFingerprintSampleUseCase, diff --git a/fingerprint/capture/src/test/java/com/simprints/fingerprint/capture/screen/ObserveFingerprintScanStatusUseCaseTest.kt b/fingerprint/capture/src/test/java/com/simprints/fingerprint/capture/screen/ObserveFingerprintScanStatusUseCaseTest.kt index 765cb8b961..eef56fa958 100644 --- a/fingerprint/capture/src/test/java/com/simprints/fingerprint/capture/screen/ObserveFingerprintScanStatusUseCaseTest.kt +++ b/fingerprint/capture/src/test/java/com/simprints/fingerprint/capture/screen/ObserveFingerprintScanStatusUseCaseTest.kt @@ -6,10 +6,10 @@ import android.media.MediaPlayer import androidx.preference.PreferenceManager import com.simprints.fingerprint.infra.scanner.ScannerManager import com.simprints.fingerprint.infra.scanner.capture.FingerprintScanningStatusTracker +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.FingerprintConfiguration import com.simprints.infra.config.store.models.Vero2Configuration.LedsMode.LIVE_QUALITY_FEEDBACK import com.simprints.infra.config.store.models.Vero2Configuration.LedsMode.VISUAL_SCAN_FEEDBACK -import com.simprints.infra.config.sync.ConfigManager import io.mockk.MockKAnnotations import io.mockk.coEvery import io.mockk.coVerify @@ -32,7 +32,7 @@ class ObserveFingerprintScanStatusUseCaseTest { private lateinit var playAudioBeep: PlayAudioBeepUseCase @RelaxedMockK - private lateinit var configManager: ConfigManager + private lateinit var configRepository: ConfigRepository @RelaxedMockK private lateinit var scannerManager: ScannerManager @@ -60,7 +60,7 @@ class ObserveFingerprintScanStatusUseCaseTest { observeFingerprintScanStatus = ObserveFingerprintScanStatusUseCase( tracker, playAudioBeep, - configManager, + configRepository, scannerManager, context, ) @@ -71,7 +71,7 @@ class ObserveFingerprintScanStatusUseCaseTest { // Given every { sharedPreferences.getBoolean(any(), any()) } returns true coEvery { - configManager + configRepository .getProjectConfiguration() .fingerprint ?.getSdkConfiguration( @@ -154,7 +154,7 @@ class ObserveFingerprintScanStatusUseCaseTest { // Given every { sharedPreferences.getBoolean(any(), any()) } returns true coEvery { - configManager + configRepository .getProjectConfiguration() .fingerprint ?.getSdkConfiguration( @@ -178,7 +178,7 @@ class ObserveFingerprintScanStatusUseCaseTest { // Given every { sharedPreferences.getBoolean(any(), any()) } returns true coEvery { - configManager + configRepository .getProjectConfiguration() .fingerprint ?.getSdkConfiguration( diff --git a/fingerprint/connect/src/main/java/com/simprints/fingerprint/connect/screens/ConnectScannerViewModel.kt b/fingerprint/connect/src/main/java/com/simprints/fingerprint/connect/screens/ConnectScannerViewModel.kt index 31749a19c1..8b5adc040e 100644 --- a/fingerprint/connect/src/main/java/com/simprints/fingerprint/connect/screens/ConnectScannerViewModel.kt +++ b/fingerprint/connect/src/main/java/com/simprints/fingerprint/connect/screens/ConnectScannerViewModel.kt @@ -21,8 +21,8 @@ import com.simprints.fingerprint.infra.scanner.exceptions.safe.ScannerDisconnect import com.simprints.fingerprint.infra.scanner.exceptions.safe.ScannerLowBatteryException import com.simprints.fingerprint.infra.scanner.exceptions.safe.ScannerNotPairedException import com.simprints.fingerprint.infra.scanner.exceptions.unexpected.UnknownScannerIssueException +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.FingerprintConfiguration -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.logging.LoggingConstants.AnalyticsUserProperties import com.simprints.infra.logging.LoggingConstants.CrashReportTag.FINGER_CAPTURE import com.simprints.infra.logging.Simber @@ -34,7 +34,7 @@ import javax.inject.Inject @HiltViewModel internal class ConnectScannerViewModel @Inject constructor( - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val scannerManager: ScannerManager, private val nfcManager: NfcManager, private val recentUserActivityManager: RecentUserActivityManager, @@ -68,7 +68,7 @@ internal class ConnectScannerViewModel @Inject constructor( fun init(params: FingerprintConnectParams) = viewModelScope.launch { fingerprintSdk = params.fingerprintSDK - allowedGenerations = configManager + allowedGenerations = configRepository .getProjectConfiguration() .fingerprint ?.allowedScanners diff --git a/fingerprint/connect/src/main/java/com/simprints/fingerprint/connect/screens/ota/OtaViewModel.kt b/fingerprint/connect/src/main/java/com/simprints/fingerprint/connect/screens/ota/OtaViewModel.kt index 3c4bcf96d0..965c8a1f36 100644 --- a/fingerprint/connect/src/main/java/com/simprints/fingerprint/connect/screens/ota/OtaViewModel.kt +++ b/fingerprint/connect/src/main/java/com/simprints/fingerprint/connect/screens/ota/OtaViewModel.kt @@ -18,8 +18,8 @@ import com.simprints.fingerprint.infra.scanner.domain.ota.OtaRecoveryStrategy.HA import com.simprints.fingerprint.infra.scanner.domain.ota.OtaRecoveryStrategy.SOFT_RESET import com.simprints.fingerprint.infra.scanner.domain.ota.OtaRecoveryStrategy.SOFT_RESET_AFTER_DELAY import com.simprints.fingerprint.infra.scanner.domain.ota.OtaStep +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.FingerprintConfiguration -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.logging.LoggingConstants.CrashReportTag.FINGER_CAPTURE import com.simprints.infra.logging.Simber import com.simprints.infra.network.exceptions.BackendMaintenanceException @@ -39,7 +39,7 @@ internal class OtaViewModel @Inject constructor( private val reportFirmwareUpdate: ReportFirmwareUpdateEventUseCase, private val timeHelper: TimeHelper, private val recentUserActivityManager: RecentUserActivityManager, - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, ) : ViewModel() { val progress: LiveData get() = _progress @@ -101,7 +101,7 @@ internal class OtaViewModel @Inject constructor( private suspend fun targetVersions(availableOta: AvailableOta): String { val scannerVersion = recentUserActivityManager.getRecentUserActivity().lastScannerVersion val availableFirmwareVersions = - configManager + configRepository .getProjectConfiguration() .fingerprint ?.getSdkConfiguration(fingerprintSdk) diff --git a/fingerprint/connect/src/test/java/com/simprints/fingerprint/connect/screens/ConnectScannerViewModelTest.kt b/fingerprint/connect/src/test/java/com/simprints/fingerprint/connect/screens/ConnectScannerViewModelTest.kt index 760dc33675..75e4248a36 100644 --- a/fingerprint/connect/src/test/java/com/simprints/fingerprint/connect/screens/ConnectScannerViewModelTest.kt +++ b/fingerprint/connect/src/test/java/com/simprints/fingerprint/connect/screens/ConnectScannerViewModelTest.kt @@ -26,9 +26,9 @@ import com.simprints.fingerprint.infra.scanner.tools.SerialNumberConverter import com.simprints.fingerprint.infra.scanner.wrapper.ScannerFactory import com.simprints.fingerprint.infra.scanner.wrapper.ScannerWrapper import com.simprints.fingerprint.infra.scannermock.dummy.DummyBluetoothDevice +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.FingerprintConfiguration import com.simprints.infra.config.store.models.FingerprintConfiguration.BioSdk.SECUGEN_SIM_MATCHER -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.recent.user.activity.RecentUserActivityManager import com.simprints.infra.recent.user.activity.domain.RecentUserActivity import com.simprints.testtools.common.coroutines.TestCoroutineRule @@ -64,7 +64,7 @@ class ConnectScannerViewModelTest { private lateinit var fingerprintConfiguration: FingerprintConfiguration @MockK - private lateinit var configManager: ConfigManager + private lateinit var configRepository: ConfigRepository @MockK private lateinit var bluetoothAdapter: ComponentBluetoothAdapter @@ -93,7 +93,7 @@ class ConnectScannerViewModelTest { FingerprintConfiguration.VeroGeneration.VERO_1, FingerprintConfiguration.VeroGeneration.VERO_2, ) - coEvery { configManager.getProjectConfiguration().fingerprint } returns fingerprintConfiguration + coEvery { configRepository.getProjectConfiguration().fingerprint } returns fingerprintConfiguration coJustRun { scannerFactory.initScannerOperationWrappers(any()) } scannerManager = ScannerManagerImpl( @@ -104,7 +104,7 @@ class ConnectScannerViewModelTest { mockk(relaxed = true), ) viewModel = ConnectScannerViewModel( - configManager, + configRepository, scannerManager, nfcManager, recentUserActivityManager, @@ -212,7 +212,7 @@ class ConnectScannerViewModelTest { fun start_noScannersPairedWithoutFingerprintConfigAndNfc_sendsSerialEntryIssueEvent() = runTest { setupBluetooth(numberOfPairedScanners = 0) setupNfc(doesDeviceHaveNfcCapability = false, isEnabled = true) - coEvery { configManager.getProjectConfiguration().fingerprint } returns null + coEvery { configRepository.getProjectConfiguration().fingerprint } returns null val connectScannerIssueObserver = viewModel.showScannerIssueScreen.testObserver() diff --git a/fingerprint/connect/src/test/java/com/simprints/fingerprint/connect/screens/ota/OtaViewModelTest.kt b/fingerprint/connect/src/test/java/com/simprints/fingerprint/connect/screens/ota/OtaViewModelTest.kt index 58b2173b2d..0f1d2a7b31 100644 --- a/fingerprint/connect/src/test/java/com/simprints/fingerprint/connect/screens/ota/OtaViewModelTest.kt +++ b/fingerprint/connect/src/test/java/com/simprints/fingerprint/connect/screens/ota/OtaViewModelTest.kt @@ -14,9 +14,9 @@ import com.simprints.fingerprint.infra.scanner.domain.ota.StmOtaStep import com.simprints.fingerprint.infra.scanner.domain.ota.Un20OtaStep import com.simprints.fingerprint.infra.scanner.exceptions.safe.OtaFailedException import com.simprints.fingerprint.infra.scanner.wrapper.ScannerOtaOperationsWrapper +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.FingerprintConfiguration.BioSdk.SECUGEN_SIM_MATCHER import com.simprints.infra.config.store.models.Vero2Configuration -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.network.exceptions.BackendMaintenanceException import com.simprints.infra.recent.user.activity.RecentUserActivityManager import com.simprints.infra.recent.user.activity.domain.RecentUserActivity @@ -62,7 +62,7 @@ class OtaViewModelTest { private lateinit var recentUserActivityManager: RecentUserActivityManager @MockK - private lateinit var configManager: ConfigManager + private lateinit var configRepository: ConfigRepository private lateinit var otaViewModel: OtaViewModel @@ -75,7 +75,7 @@ class OtaViewModelTest { recentUserActivityManager.getRecentUserActivity() } returns RecentUserActivity(HARDWARE_VERSION, "", "".asTokenizableRaw(), 0, 0, 0, 0) coEvery { - configManager + configRepository .getProjectConfiguration() .fingerprint ?.getSdkConfiguration( @@ -101,7 +101,7 @@ class OtaViewModelTest { reportFirmwareUpdate, timeHelperMock, recentUserActivityManager, - configManager, + configRepository, ) } diff --git a/fingerprint/infra/image-distortion-config/src/main/java/com/simprints/fingerprint/infra/imagedistortionconfig/remote/ImageDistortionConfigRemoteRepo.kt b/fingerprint/infra/image-distortion-config/src/main/java/com/simprints/fingerprint/infra/imagedistortionconfig/remote/ImageDistortionConfigRemoteRepo.kt index 1366c77b8d..c93c7096fb 100644 --- a/fingerprint/infra/image-distortion-config/src/main/java/com/simprints/fingerprint/infra/imagedistortionconfig/remote/ImageDistortionConfigRemoteRepo.kt +++ b/fingerprint/infra/image-distortion-config/src/main/java/com/simprints/fingerprint/infra/imagedistortionconfig/remote/ImageDistortionConfigRemoteRepo.kt @@ -3,13 +3,13 @@ package com.simprints.fingerprint.infra.imagedistortionconfig.remote import com.google.firebase.storage.FirebaseStorage import com.google.firebase.storage.StorageException import com.simprints.infra.authstore.AuthStore -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.logging.Simber import kotlinx.coroutines.tasks.await import javax.inject.Inject internal class ImageDistortionConfigRemoteRepo @Inject constructor( - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val authStore: AuthStore, ) { /** @@ -34,7 +34,7 @@ internal class ImageDistortionConfigRemoteRepo @Inject constructor( return false } - val bucketUrl = configManager.getProject()?.imageBucket + val bucketUrl = configRepository.getProject()?.imageBucket if (bucketUrl == null) { log("bucketUrl projectId is empty") return false diff --git a/fingerprint/infra/image-distortion-config/src/test/java/com/simprints/fingerprint/infra/imagedistortionconfig/remote/ImageDistortionConfigRemoteRepoTest.kt b/fingerprint/infra/image-distortion-config/src/test/java/com/simprints/fingerprint/infra/imagedistortionconfig/remote/ImageDistortionConfigRemoteRepoTest.kt index e215d6e26d..f24f91c5eb 100644 --- a/fingerprint/infra/image-distortion-config/src/test/java/com/simprints/fingerprint/infra/imagedistortionconfig/remote/ImageDistortionConfigRemoteRepoTest.kt +++ b/fingerprint/infra/image-distortion-config/src/test/java/com/simprints/fingerprint/infra/imagedistortionconfig/remote/ImageDistortionConfigRemoteRepoTest.kt @@ -6,7 +6,7 @@ import com.google.firebase.storage.StorageException import com.google.firebase.storage.StorageReference import com.google.firebase.storage.UploadTask import com.simprints.infra.authstore.AuthStore -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import io.mockk.coEvery import io.mockk.every import io.mockk.mockk @@ -21,13 +21,13 @@ import org.junit.Test class ImageDistortionConfigRemoteRepoTest { private lateinit var repo: ImageDistortionConfigRemoteRepo - private val configManager: ConfigManager = mockk() + private val configRepository: ConfigRepository = mockk() private val authStore: AuthStore = mockk() @Before fun setUp() { repo = ImageDistortionConfigRemoteRepo( - configManager = configManager, + configRepository = configRepository, authStore = authStore, ) } @@ -55,7 +55,7 @@ class ImageDistortionConfigRemoteRepoTest { fun `uploadConfig returns false when project is missing`() = runTest { every { authStore.getCoreApp().options.projectId } returns "firebaseProject" every { authStore.signedInProjectId } returns PROJECT_ID - coEvery { configManager.getProject() } returns null + coEvery { configRepository.getProject() } returns null val result = repo.uploadConfig(UN20_SERIAL_NUMBER, byteArrayOf()) @@ -66,7 +66,7 @@ class ImageDistortionConfigRemoteRepoTest { fun `uploadConfig returns true when file is already uploaded`() = runTest { val mockFileRef: StorageReference = mockk(relaxed = true) setupMockFirebase(mockFileRef) - coEvery { configManager.getProject()?.imageBucket } returns BUCKET_URL + coEvery { configRepository.getProject()?.imageBucket } returns BUCKET_URL coEvery { mockFileRef.metadata.await() } returns mockk() val result = repo.uploadConfig(UN20_SERIAL_NUMBER, byteArrayOf()) @@ -80,7 +80,7 @@ class ImageDistortionConfigRemoteRepoTest { every { task.isSuccessful } returns true } setupMockFirebase(mockFileRef) - coEvery { configManager.getProject()?.imageBucket } returns BUCKET_URL + coEvery { configRepository.getProject()?.imageBucket } returns BUCKET_URL coEvery { mockFileRef.metadata.await() } throws mockk { every { errorCode } returns StorageException.ERROR_OBJECT_NOT_FOUND } @@ -100,7 +100,7 @@ class ImageDistortionConfigRemoteRepoTest { } setupMockFirebase(mockFileRef) - coEvery { configManager.getProject()?.imageBucket } returns BUCKET_URL + coEvery { configRepository.getProject()?.imageBucket } returns BUCKET_URL coEvery { mockFileRef.putBytes(any()).await() } returns mockUploadTask coEvery { mockFileRef.metadata.await() } throws mockk { every { errorCode } returns StorageException.ERROR_OBJECT_NOT_FOUND diff --git a/fingerprint/infra/scanner/src/main/java/com/simprints/fingerprint/infra/scanner/data/FirmwareRepository.kt b/fingerprint/infra/scanner/src/main/java/com/simprints/fingerprint/infra/scanner/data/FirmwareRepository.kt index 7320205249..f302904fe6 100644 --- a/fingerprint/infra/scanner/src/main/java/com/simprints/fingerprint/infra/scanner/data/FirmwareRepository.kt +++ b/fingerprint/infra/scanner/src/main/java/com/simprints/fingerprint/infra/scanner/data/FirmwareRepository.kt @@ -5,8 +5,8 @@ import com.simprints.fingerprint.infra.scanner.data.remote.FirmwareRemoteDataSou import com.simprints.fingerprint.infra.scanner.domain.ota.DownloadableFirmwareVersion import com.simprints.fingerprint.infra.scanner.domain.ota.DownloadableFirmwareVersion.Chip import com.simprints.fingerprint.infra.scanner.domain.versions.getMissingVersionsToDownload +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.Vero2Configuration.Vero2FirmwareVersions -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.logging.Simber import javax.inject.Inject @@ -17,17 +17,17 @@ import javax.inject.Inject class FirmwareRepository @Inject internal constructor( private val firmwareRemoteDataSource: FirmwareRemoteDataSource, private val firmwareLocalDataSource: FirmwareLocalDataSource, - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, ) { /** * This method is responsible for updating the firmware versions stored locally on the phone. It * first checks the local version and matches that against the remote versions, then subsequently updating the local versions that need to be updated. */ suspend fun updateStoredFirmwareFilesWithLatest() { - configManager.getProjectConfiguration().fingerprint?.secugenSimMatcher?.vero2?.firmwareVersions?.let { + configRepository.getProjectConfiguration().fingerprint?.secugenSimMatcher?.vero2?.firmwareVersions?.let { updateStoredFirmwareFilesWithLatest(it) } - configManager.getProjectConfiguration().fingerprint?.nec?.vero2?.firmwareVersions?.let { + configRepository.getProjectConfiguration().fingerprint?.nec?.vero2?.firmwareVersions?.let { updateStoredFirmwareFilesWithLatest(it) } } @@ -82,14 +82,14 @@ class FirmwareRepository @Inject internal constructor( val stmOfficialVersions = mutableSetOf() val un20OfficialVersions = mutableSetOf() - val secuGenFirmwareVersions = configManager + val secuGenFirmwareVersions = configRepository .getProjectConfiguration() .fingerprint ?.secugenSimMatcher ?.vero2 ?.firmwareVersions ?.entries - val necFirmwareVersions = configManager + val necFirmwareVersions = configRepository .getProjectConfiguration() .fingerprint ?.nec diff --git a/fingerprint/infra/scanner/src/main/java/com/simprints/fingerprint/infra/scanner/helpers/ScannerInitialSetupHelper.kt b/fingerprint/infra/scanner/src/main/java/com/simprints/fingerprint/infra/scanner/helpers/ScannerInitialSetupHelper.kt index 0d2e0e51a8..d41cb79239 100644 --- a/fingerprint/infra/scanner/src/main/java/com/simprints/fingerprint/infra/scanner/helpers/ScannerInitialSetupHelper.kt +++ b/fingerprint/infra/scanner/src/main/java/com/simprints/fingerprint/infra/scanner/helpers/ScannerInitialSetupHelper.kt @@ -9,9 +9,9 @@ import com.simprints.fingerprint.infra.scanner.domain.versions.ScannerVersion import com.simprints.fingerprint.infra.scanner.exceptions.safe.OtaAvailableException import com.simprints.fingerprint.infra.scanner.tools.BatteryLevelChecker import com.simprints.fingerprint.infra.scanner.v2.scanner.Scanner +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.FingerprintConfiguration import com.simprints.infra.config.store.models.Vero2Configuration -import com.simprints.infra.config.sync.ConfigManager import kotlinx.coroutines.delay import javax.inject.Inject @@ -22,7 +22,7 @@ import javax.inject.Inject internal class ScannerInitialSetupHelper @Inject constructor( private val connectionHelper: ConnectionHelper, private val batteryLevelChecker: BatteryLevelChecker, - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val firmwareLocalDataSource: FirmwareLocalDataSource, ) { private lateinit var scannerVersion: ScannerVersion @@ -90,7 +90,7 @@ internal class ScannerInitialSetupHelper @Inject constructor( macAddress: String, batteryInfo: BatteryInfo, ) { - val configuredVersions = configManager + val configuredVersions = configRepository .getProjectConfiguration() .fingerprint ?.getSdkConfiguration(fingerprintSdk) diff --git a/fingerprint/infra/scanner/src/main/java/com/simprints/fingerprint/infra/scanner/wrapper/ScannerFactory.kt b/fingerprint/infra/scanner/src/main/java/com/simprints/fingerprint/infra/scanner/wrapper/ScannerFactory.kt index e9c28f9be4..f36bab597b 100644 --- a/fingerprint/infra/scanner/src/main/java/com/simprints/fingerprint/infra/scanner/wrapper/ScannerFactory.kt +++ b/fingerprint/infra/scanner/src/main/java/com/simprints/fingerprint/infra/scanner/wrapper/ScannerFactory.kt @@ -12,8 +12,8 @@ import com.simprints.fingerprint.infra.scanner.tools.ScannerGenerationDeterminer import com.simprints.fingerprint.infra.scanner.tools.SerialNumberConverter import com.simprints.fingerprint.infra.scanner.v2.scanner.ScannerInfo import com.simprints.fingerprint.infra.scanner.v2.tools.ScannerUiHelper +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.FingerprintConfiguration -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.logging.LoggingConstants.CrashReportTag.FINGER_CAPTURE import com.simprints.infra.logging.Simber import kotlinx.coroutines.CoroutineDispatcher @@ -25,7 +25,7 @@ import com.simprints.fingerprint.infra.scanner.v2.scanner.Scanner as ScannerV2 @Singleton class ScannerFactory @Inject internal constructor( private val bluetoothAdapter: ComponentBluetoothAdapter, - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val scannerUiHelper: ScannerUiHelper, private val serialNumberConverter: SerialNumberConverter, private val scannerGenerationDeterminer: ScannerGenerationDeterminer, @@ -45,7 +45,7 @@ class ScannerFactory @Inject internal constructor( suspend fun initScannerOperationWrappers(macAddress: String) { val availableScannerGenerations = - configManager.getProjectConfiguration().fingerprint?.allowedScanners ?: listOf() + configRepository.getProjectConfiguration().fingerprint?.allowedScanners ?: listOf() val scannerId = serialNumberConverter.convertMacAddressToSerialNumber(macAddress) val scannerGenerationToUse = when (availableScannerGenerations.size) { 1 -> availableScannerGenerations.single() diff --git a/fingerprint/infra/scanner/src/test/java/com/simprints/fingerprint/infra/scanner/data/FirmwareRepositoryTest.kt b/fingerprint/infra/scanner/src/test/java/com/simprints/fingerprint/infra/scanner/data/FirmwareRepositoryTest.kt index 088454b869..1f674e19e1 100644 --- a/fingerprint/infra/scanner/src/test/java/com/simprints/fingerprint/infra/scanner/data/FirmwareRepositoryTest.kt +++ b/fingerprint/infra/scanner/src/test/java/com/simprints/fingerprint/infra/scanner/data/FirmwareRepositoryTest.kt @@ -4,9 +4,9 @@ import com.simprints.fingerprint.infra.scanner.data.local.FirmwareLocalDataSourc import com.simprints.fingerprint.infra.scanner.data.remote.FirmwareRemoteDataSource import com.simprints.fingerprint.infra.scanner.domain.ota.DownloadableFirmwareVersion import com.simprints.fingerprint.infra.scanner.domain.versions.getMissingVersionsToDownload +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.Vero2Configuration import com.simprints.infra.config.store.models.Vero2Configuration.Vero2FirmwareVersions -import com.simprints.infra.config.sync.ConfigManager import io.mockk.MockKAnnotations import io.mockk.Ordering import io.mockk.coEvery @@ -29,7 +29,7 @@ class FirmwareRepositoryTest { private lateinit var vero2Configuration: Vero2Configuration @MockK - private lateinit var configManager: ConfigManager + private lateinit var configRepository: ConfigRepository private lateinit var firmwareRepository: FirmwareRepository @@ -38,7 +38,7 @@ class FirmwareRepositoryTest { MockKAnnotations.init(this, relaxed = true) coEvery { - configManager + configRepository .getProjectConfiguration() .fingerprint ?.secugenSimMatcher @@ -56,7 +56,7 @@ class FirmwareRepositoryTest { firmwareRepository = FirmwareRepository( firmwareRemoteDataSourceMock, firmwareLocalDataSourceMock, - configManager, + configRepository, ) mockkStatic("com.simprints.fingerprint.infra.scanner.domain.versions.ScannerHardwareRevisionsKt") diff --git a/fingerprint/infra/scanner/src/test/java/com/simprints/fingerprint/infra/scanner/helpers/ScannerInitialSetupHelperTest.kt b/fingerprint/infra/scanner/src/test/java/com/simprints/fingerprint/infra/scanner/helpers/ScannerInitialSetupHelperTest.kt index 6e387972cf..9516fe0852 100644 --- a/fingerprint/infra/scanner/src/test/java/com/simprints/fingerprint/infra/scanner/helpers/ScannerInitialSetupHelperTest.kt +++ b/fingerprint/infra/scanner/src/test/java/com/simprints/fingerprint/infra/scanner/helpers/ScannerInitialSetupHelperTest.kt @@ -14,9 +14,9 @@ import com.simprints.fingerprint.infra.scanner.v2.domain.root.models.CypressFirm import com.simprints.fingerprint.infra.scanner.v2.domain.root.models.ScannerInformation import com.simprints.fingerprint.infra.scanner.v2.domain.root.models.UnifiedVersionInformation import com.simprints.fingerprint.infra.scanner.v2.scanner.Scanner +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.FingerprintConfiguration.BioSdk.SECUGEN_SIM_MATCHER import com.simprints.infra.config.store.models.Vero2Configuration -import com.simprints.infra.config.sync.ConfigManager import com.simprints.testtools.common.syntax.assertThrows import io.mockk.coEvery import io.mockk.coJustRun @@ -35,7 +35,7 @@ class ScannerInitialSetupHelperTest { private val connectionHelperMock = mockk() private val batteryLevelChecker = mockk() private val vero2Configuration = mockk() - private val configManager = mockk { + private val configRepository = mockk { coEvery { getProjectConfiguration() } returns mockk { every { fingerprint?.getSdkConfiguration(SECUGEN_SIM_MATCHER)?.vero2 } returns vero2Configuration } @@ -45,7 +45,7 @@ class ScannerInitialSetupHelperTest { private val scannerInitialSetupHelper = ScannerInitialSetupHelper( connectionHelperMock, batteryLevelChecker, - configManager, + configRepository, firmwareLocalDataSource, ) diff --git a/fingerprint/infra/scanner/src/test/java/com/simprints/fingerprint/infra/scanner/wrapper/ScannerFactoryTest.kt b/fingerprint/infra/scanner/src/test/java/com/simprints/fingerprint/infra/scanner/wrapper/ScannerFactoryTest.kt index 1fd7fa7c03..1efef47cbf 100644 --- a/fingerprint/infra/scanner/src/test/java/com/simprints/fingerprint/infra/scanner/wrapper/ScannerFactoryTest.kt +++ b/fingerprint/infra/scanner/src/test/java/com/simprints/fingerprint/infra/scanner/wrapper/ScannerFactoryTest.kt @@ -8,8 +8,8 @@ import com.simprints.fingerprint.infra.scanner.tools.SerialNumberConverter import com.simprints.fingerprint.infra.scanner.v2.scanner.Scanner import com.simprints.fingerprint.infra.scanner.v2.scanner.ScannerInfo import com.simprints.fingerprint.infra.scanner.v2.tools.ScannerUiHelper +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.FingerprintConfiguration -import com.simprints.infra.config.sync.ConfigManager import io.mockk.MockKAnnotations import io.mockk.every import io.mockk.impl.annotations.MockK @@ -26,7 +26,7 @@ class ScannerFactoryTest { private lateinit var componentBluetoothAdapter: ComponentBluetoothAdapter @MockK(relaxed = true) - private lateinit var configManager: ConfigManager + private lateinit var configRepository: ConfigRepository @MockK private lateinit var scannerUiHelper: ScannerUiHelper @@ -49,7 +49,7 @@ class ScannerFactoryTest { MockKAnnotations.init(this) scannerFactory = ScannerFactory( componentBluetoothAdapter, - configManager, + configRepository, scannerUiHelper, serialNumberConverter, scannerGenerationDeterminer, diff --git a/infra/auth-logic/src/main/java/com/simprints/infra/authlogic/authenticator/ProjectAuthenticator.kt b/infra/auth-logic/src/main/java/com/simprints/infra/authlogic/authenticator/ProjectAuthenticator.kt index 22ad15efac..08c42618c9 100644 --- a/infra/auth-logic/src/main/java/com/simprints/infra/authlogic/authenticator/ProjectAuthenticator.kt +++ b/infra/auth-logic/src/main/java/com/simprints/infra/authlogic/authenticator/ProjectAuthenticator.kt @@ -8,7 +8,7 @@ import com.simprints.infra.authlogic.model.NonceScope import com.simprints.infra.authstore.domain.models.AuthRequest import com.simprints.infra.authstore.domain.models.Token import com.simprints.infra.authstore.exceptions.AuthRequestInvalidCredentialsException -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.network.exceptions.BackendMaintenanceException import com.simprints.infra.network.exceptions.SyncCloudIntegrationException import com.simprints.infra.security.SecurityManager @@ -18,7 +18,7 @@ import javax.inject.Inject internal class ProjectAuthenticator @Inject constructor( private val secureDataManager: SecurityManager, - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val signerManager: SignerManager, private val authenticationRemoteDataSource: AuthenticationRemoteDataSource, private val integrityTokenRequester: IntegrityTokenRequester, @@ -40,7 +40,7 @@ internal class ProjectAuthenticator @Inject constructor( makeAuthRequest(prepareAuthRequestParameters(nonceScope, projectSecret), nonceScope) .signIn(nonceScope.projectId) - val config = configManager.getProjectConfiguration() + val config = configRepository.getProjectConfiguration() fetchProjectLongConsentTexts(config.general.languageOptions, config.projectId) // This is safe to call even on face-only projects as it will do nothing in such cases @@ -93,7 +93,7 @@ internal class ProjectAuthenticator @Inject constructor( projectId: String, ) { languages.forEach { language -> - configManager.getPrivacyNotice(projectId, language).collect() + configRepository.getPrivacyNotice(projectId, language).collect() } } } diff --git a/infra/auth-logic/src/main/java/com/simprints/infra/authlogic/authenticator/SignerManager.kt b/infra/auth-logic/src/main/java/com/simprints/infra/authlogic/authenticator/SignerManager.kt index a033f3535b..d12c90da67 100644 --- a/infra/auth-logic/src/main/java/com/simprints/infra/authlogic/authenticator/SignerManager.kt +++ b/infra/auth-logic/src/main/java/com/simprints/infra/authlogic/authenticator/SignerManager.kt @@ -4,7 +4,7 @@ import com.simprints.core.DispatcherIO import com.simprints.fingerprint.infra.scanner.ScannerManager import com.simprints.infra.authstore.AuthStore import com.simprints.infra.authstore.domain.models.Token -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.enrolment.records.repository.EnrolmentRecordRepository import com.simprints.infra.events.EventRepository import com.simprints.infra.images.ImageRepository @@ -18,7 +18,7 @@ import kotlinx.coroutines.withContext import javax.inject.Inject internal class SignerManager @Inject constructor( - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val authStore: AuthStore, private val recentUserActivityManager: RecentUserActivityManager, private val simNetwork: SimNetwork, @@ -37,16 +37,16 @@ internal class SignerManager @Inject constructor( token: Token, ) = withContext(dispatcher) { try { - // Store Firebase token so it can be used by ConfigManager + // Store Firebase token so it can be used by ConfigRepository authStore.storeFirebaseToken(token) - configManager.refreshProject(projectId) + configRepository.refreshProject(projectId) // Only store credentials if all other calls succeeded. This avoids the undefined state // where credentials are store (i.e. user is considered logged in) but project configuration // is missing authStore.signedInProjectId = projectId } catch (e: Exception) { authStore.clearFirebaseToken() - configManager.clearData() + configRepository.clearData() authStore.cleanCredentials() throw e @@ -55,7 +55,7 @@ internal class SignerManager @Inject constructor( suspend fun signOut() = withContext(dispatcher) { simNetwork.resetApiBaseUrl() - configManager.clearData() + configRepository.clearData() recentUserActivityManager.clearRecentActivity() imageRepository.deleteStoredImages() diff --git a/infra/auth-logic/src/test/java/com/simprints/infra/authlogic/authenticator/ProjectAuthenticatorTest.kt b/infra/auth-logic/src/test/java/com/simprints/infra/authlogic/authenticator/ProjectAuthenticatorTest.kt index e38b099a26..7b76992b06 100644 --- a/infra/auth-logic/src/test/java/com/simprints/infra/authlogic/authenticator/ProjectAuthenticatorTest.kt +++ b/infra/auth-logic/src/test/java/com/simprints/infra/authlogic/authenticator/ProjectAuthenticatorTest.kt @@ -8,17 +8,14 @@ import com.simprints.infra.authlogic.integrity.exceptions.RequestingIntegrityTok import com.simprints.infra.authlogic.model.NonceScope import com.simprints.infra.authstore.domain.models.AuthenticationData import com.simprints.infra.authstore.domain.models.Token +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.GeneralConfiguration import com.simprints.infra.config.store.models.ProjectConfiguration -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.network.exceptions.BackendMaintenanceException import com.simprints.infra.security.SecurityManager import com.simprints.testtools.common.syntax.assertThrows -import io.mockk.MockKAnnotations -import io.mockk.coEvery -import io.mockk.coVerify +import io.mockk.* import io.mockk.impl.annotations.MockK -import io.mockk.mockk import kotlinx.coroutines.flow.emptyFlow import kotlinx.coroutines.test.StandardTestDispatcher import kotlinx.coroutines.test.runTest @@ -28,7 +25,7 @@ import java.io.IOException class ProjectAuthenticatorTest { @MockK - private lateinit var configManager: ConfigManager + private lateinit var configRepository: ConfigRepository @MockK private lateinit var secureDataManager: SecurityManager @@ -54,7 +51,7 @@ class ProjectAuthenticatorTest { authenticator = ProjectAuthenticator( secureDataManager, - configManager, + configRepository, signerManager, authenticationRemoteDataSource, integrityTokenRequester, @@ -132,8 +129,8 @@ class ProjectAuthenticatorTest { fun `authenticate should fetch the correct long consents`() = runTest(StandardTestDispatcher()) { authenticator.authenticate(NonceScope(PROJECT_ID, DEVICE_ID), PROJECT_SECRET) - coVerify(exactly = 1) { configManager.getPrivacyNotice(PROJECT_ID, LANGUAGE_1) } - coVerify(exactly = 1) { configManager.getPrivacyNotice(PROJECT_ID, LANGUAGE_2) } + coVerify(exactly = 1) { configRepository.getPrivacyNotice(PROJECT_ID, LANGUAGE_1) } + coVerify(exactly = 1) { configRepository.getPrivacyNotice(PROJECT_ID, LANGUAGE_2) } } @Test @@ -163,7 +160,7 @@ class ProjectAuthenticatorTest { authenticationRemoteDataSource.requestAuthToken(PROJECT_ID, DEVICE_ID, any()) } returns Token("", "", "", "") - coEvery { configManager.getProjectConfiguration() } returns ProjectConfiguration( + coEvery { configRepository.getProjectConfiguration() } returns ProjectConfiguration( id = "id", projectId = PROJECT_ID, updatedAt = "", @@ -184,7 +181,7 @@ class ProjectAuthenticatorTest { multifactorId = mockk(), custom = mockk(), ) - coEvery { configManager.getPrivacyNotice(any(), any()) } returns emptyFlow() + coEvery { configRepository.getPrivacyNotice(any(), any()) } returns emptyFlow() coEvery { integrityTokenRequester.getToken(any()) } returns "token" } diff --git a/infra/auth-logic/src/test/java/com/simprints/infra/authlogic/authenticator/SignerManagerTest.kt b/infra/auth-logic/src/test/java/com/simprints/infra/authlogic/authenticator/SignerManagerTest.kt index af8a2c6dc8..2f17621390 100644 --- a/infra/auth-logic/src/test/java/com/simprints/infra/authlogic/authenticator/SignerManagerTest.kt +++ b/infra/auth-logic/src/test/java/com/simprints/infra/authlogic/authenticator/SignerManagerTest.kt @@ -1,13 +1,14 @@ package com.simprints.infra.authlogic.authenticator +import androidx.arch.core.executor.testing.InstantTaskExecutorRule import com.simprints.fingerprint.infra.scanner.ScannerManager import com.simprints.infra.authstore.AuthStore import com.simprints.infra.authstore.domain.models.Token +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.Project import com.simprints.infra.config.store.models.ProjectConfiguration import com.simprints.infra.config.store.models.ProjectState import com.simprints.infra.config.store.models.ProjectWithConfig -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.enrolment.records.repository.EnrolmentRecordRepository import com.simprints.infra.events.EventRepository import com.simprints.infra.events.sampledata.SampleDefaults.DEFAULT_PROJECT_ID @@ -15,22 +16,26 @@ import com.simprints.infra.images.ImageRepository import com.simprints.infra.license.LicenseRepository import com.simprints.infra.network.SimNetwork import com.simprints.infra.recent.user.activity.RecentUserActivityManager +import com.simprints.testtools.common.coroutines.TestCoroutineRule import com.simprints.testtools.common.syntax.assertThrows -import io.mockk.MockKAnnotations -import io.mockk.coEvery -import io.mockk.coVerify -import io.mockk.every +import io.mockk.* import io.mockk.impl.annotations.MockK -import io.mockk.mockk -import io.mockk.verify -import kotlinx.coroutines.test.UnconfinedTestDispatcher +import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runTest import org.junit.Before +import org.junit.Rule import org.junit.Test +@OptIn(ExperimentalCoroutinesApi::class) internal class SignerManagerTest { + @get:Rule + val rule = InstantTaskExecutorRule() + + @get:Rule + val testCoroutineRule = TestCoroutineRule() + @MockK - lateinit var configManager: ConfigManager + lateinit var configRepository: ConfigRepository @MockK lateinit var mockAuthStore: AuthStore @@ -70,7 +75,7 @@ internal class SignerManagerTest { MockKAnnotations.init(this, relaxed = true) signerManager = SignerManager( - configManager, + configRepository, mockAuthStore, mockRecentUserActivityManager, mockSimNetwork, @@ -79,12 +84,12 @@ internal class SignerManagerTest { mockEnrolmentRecordRepository, mockLicenseRepository, scannerManager, - UnconfinedTestDispatcher(), + testCoroutineRule.testCoroutineDispatcher, ) } @Test - fun signIn_shouldSignInToRemoteDb() = runTest(UnconfinedTestDispatcher()) { + fun signIn_shouldSignInToRemoteDb() = runTest { mockRemoteSignedIn() mockFetchingProjectInfo() @@ -94,14 +99,14 @@ internal class SignerManagerTest { } @Test - fun signInToRemoteFails_signInShouldFail() = runTest(UnconfinedTestDispatcher()) { + fun signInToRemoteFails_signInShouldFail() = runTest { mockRemoteSignedIn(true) assertThrows { signIn() } } @Test - fun signIn_shouldStoreCredentialsLocally() = runTest(UnconfinedTestDispatcher()) { + fun signIn_shouldStoreCredentialsLocally() = runTest { mockRemoteSignedIn() mockStoreCredentialsLocally() mockFetchingProjectInfo() @@ -112,7 +117,7 @@ internal class SignerManagerTest { } @Test - fun storeCredentialsFails_signInShouldFail() = runTest(UnconfinedTestDispatcher()) { + fun storeCredentialsFails_signInShouldFail() = runTest { mockRemoteSignedIn() every { mockAuthStore.signedInProjectId = any() } throws Throwable("Failed to store credentials") @@ -120,18 +125,18 @@ internal class SignerManagerTest { } @Test - fun signIn_shouldFetchProjectInfo() = runTest(UnconfinedTestDispatcher()) { + fun signIn_shouldFetchProjectInfo() = runTest { mockRemoteSignedIn() mockStoreCredentialsLocally() mockFetchingProjectInfo() signIn() - coVerify { configManager.refreshProject(DEFAULT_PROJECT_ID) } + coVerify { configRepository.refreshProject(DEFAULT_PROJECT_ID) } } @Test - fun refreshProjectInfoFails_signInShouldFail() = runTest(UnconfinedTestDispatcher()) { + fun refreshProjectInfoFails_signInShouldFail() = runTest { mockRemoteSignedIn() mockStoreCredentialsLocally() mockFetchingProjectInfo(true) @@ -139,12 +144,12 @@ internal class SignerManagerTest { assertThrows { signIn() } verify { mockAuthStore.clearFirebaseToken() } - coVerify { configManager.clearData() } + coVerify { configRepository.clearData() } verify { mockAuthStore.cleanCredentials() } } @Test - fun signIn_shouldSucceed() = runTest(UnconfinedTestDispatcher()) { + fun signIn_shouldSucceed() = runTest { mockRemoteSignedIn() mockStoreCredentialsLocally() mockFetchingProjectInfo() @@ -153,37 +158,37 @@ internal class SignerManagerTest { } @Test - fun signOut_shouldRemoveAnyState() = runTest(UnconfinedTestDispatcher()) { + fun signOut_shouldRemoveAnyState() = runTest { signerManager.signOut() verify { mockAuthStore.cleanCredentials() } verify { mockAuthStore.clearFirebaseToken() } - coVerify(exactly = 1) { configManager.clearData() } + coVerify(exactly = 1) { configRepository.clearData() } } @Test - fun signOut_apiBaseUrlIsReset() = runTest(UnconfinedTestDispatcher()) { + fun signOut_apiBaseUrlIsReset() = runTest { signerManager.signOut() verify { mockSimNetwork.resetApiBaseUrl() } } @Test - fun signOut_recentActivityIsCleared() = runTest(UnconfinedTestDispatcher()) { + fun signOut_recentActivityIsCleared() = runTest { signerManager.signOut() coVerify { mockRecentUserActivityManager.clearRecentActivity() } } @Test - fun signOut_clearConfiguration() = runTest(UnconfinedTestDispatcher()) { + fun signOut_clearConfiguration() = runTest { signerManager.signOut() - coVerify { configManager.clearData() } + coVerify { configRepository.clearData() } } @Test - fun signOut_shouldDeleteLocalData() = runTest(UnconfinedTestDispatcher()) { + fun signOut_shouldDeleteLocalData() = runTest { signerManager.signOut() coVerify { mockImageRepository.deleteStoredImages() } @@ -212,7 +217,7 @@ internal class SignerManagerTest { } } - private fun mockFetchingProjectInfo(error: Boolean = false) = coEvery { configManager.refreshProject(any()) }.apply { + private fun mockFetchingProjectInfo(error: Boolean = false) = coEvery { configRepository.refreshProject(any()) }.apply { if (!error) { this.returns( ProjectWithConfig( diff --git a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/status/down/EventDownSyncScopeRepository.kt b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/status/down/EventDownSyncScopeRepository.kt index 574f967cee..4a02e70a1a 100644 --- a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/status/down/EventDownSyncScopeRepository.kt +++ b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/status/down/EventDownSyncScopeRepository.kt @@ -4,9 +4,9 @@ import com.simprints.core.domain.common.Modality import com.simprints.core.domain.common.Partitioning import com.simprints.core.domain.tokenization.TokenizableString import com.simprints.infra.authstore.AuthStore +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.TokenKeyType import com.simprints.infra.config.store.tokenization.TokenizationProcessor -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.eventsync.exceptions.MissingArgumentForDownSyncScopeException import com.simprints.infra.eventsync.status.down.domain.EventDownSyncOperation import com.simprints.infra.eventsync.status.down.domain.EventDownSyncScope @@ -22,7 +22,7 @@ internal class EventDownSyncScopeRepository @Inject constructor( private val authStore: AuthStore, private val recentUserActivityManager: RecentUserActivityManager, private val downSyncOperationOperationDao: DbEventDownSyncOperationStateDao, - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val tokenizationProcessor: TokenizationProcessor, ) { suspend fun getDownSyncScope( @@ -59,7 +59,7 @@ internal class EventDownSyncScopeRepository @Inject constructor( throw MissingArgumentForDownSyncScopeException("UserId required") } return when (possibleUserId) { - is TokenizableString.Raw -> configManager.getProject()?.let { project -> + is TokenizableString.Raw -> configRepository.getProject()?.let { project -> tokenizationProcessor .encrypt(decrypted = possibleUserId, tokenKeyType = TokenKeyType.AttendantId, project = project) .value diff --git a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/down/BaseEventDownSyncWorkersBuilder.kt b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/down/BaseEventDownSyncWorkersBuilder.kt index 599da3f0d5..9cf38d0a14 100644 --- a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/down/BaseEventDownSyncWorkersBuilder.kt +++ b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/down/BaseEventDownSyncWorkersBuilder.kt @@ -6,7 +6,7 @@ import androidx.work.OneTimeWorkRequest import androidx.work.WorkRequest import androidx.work.workDataOf import com.simprints.core.tools.json.JsonHelper -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.eventsync.status.down.EventDownSyncScopeRepository import com.simprints.infra.eventsync.status.down.domain.EventDownSyncOperation import com.simprints.infra.eventsync.sync.MIN_BACKOFF_SECS @@ -24,9 +24,8 @@ import java.util.concurrent.TimeUnit internal abstract class BaseEventDownSyncWorkersBuilder( protected val downSyncScopeRepository: EventDownSyncScopeRepository, protected val jsonHelper: JsonHelper, - protected val configManager: ConfigManager, + protected val configRepository: ConfigRepository, ) { - abstract fun getWorkerClass(): Class abstract fun getDownSyncWorkerConstraints(): Constraints diff --git a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/down/CommCareEventSyncWorkersBuilder.kt b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/down/CommCareEventSyncWorkersBuilder.kt index 83e1f944eb..73e064c482 100644 --- a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/down/CommCareEventSyncWorkersBuilder.kt +++ b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/down/CommCareEventSyncWorkersBuilder.kt @@ -4,7 +4,7 @@ import androidx.work.Constraints import androidx.work.OneTimeWorkRequest import com.simprints.core.domain.common.Partitioning import com.simprints.core.tools.json.JsonHelper -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.eventsync.status.down.EventDownSyncScopeRepository import com.simprints.infra.eventsync.sync.down.workers.BaseEventDownSyncDownloaderWorker import com.simprints.infra.eventsync.sync.down.workers.CommCareEventSyncDownloaderWorker @@ -13,11 +13,11 @@ import javax.inject.Inject internal class CommCareEventSyncWorkersBuilder @Inject constructor( downSyncScopeRepository: EventDownSyncScopeRepository, jsonHelper: JsonHelper, - configManager: ConfigManager, + configRepository: ConfigRepository, ) : BaseEventDownSyncWorkersBuilder( downSyncScopeRepository, jsonHelper, - configManager, + configRepository, ) { override fun getWorkerClass(): Class = CommCareEventSyncDownloaderWorker::class.java @@ -29,7 +29,7 @@ internal class CommCareEventSyncWorkersBuilder @Inject constructor( uniqueSyncId: String, uniqueDownSyncId: String, ): List { - val projectConfiguration = configManager.getProjectConfiguration() + val projectConfiguration = configRepository.getProjectConfiguration() val downSyncScope = downSyncScopeRepository.getDownSyncScope( modes = projectConfiguration.general.modalities, diff --git a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/down/SimprintsEventDownSyncWorkersBuilder.kt b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/down/SimprintsEventDownSyncWorkersBuilder.kt index c4baca270d..286003e9ac 100644 --- a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/down/SimprintsEventDownSyncWorkersBuilder.kt +++ b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/down/SimprintsEventDownSyncWorkersBuilder.kt @@ -5,7 +5,7 @@ import androidx.work.NetworkType import androidx.work.OneTimeWorkRequest import com.simprints.core.domain.tokenization.values import com.simprints.core.tools.json.JsonHelper -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.eventsync.status.down.EventDownSyncScopeRepository import com.simprints.infra.eventsync.sync.down.workers.BaseEventDownSyncDownloaderWorker import com.simprints.infra.eventsync.sync.down.workers.SimprintsEventDownSyncDownloaderWorker @@ -14,11 +14,11 @@ import javax.inject.Inject internal class SimprintsEventDownSyncWorkersBuilder @Inject constructor( downSyncScopeRepository: EventDownSyncScopeRepository, jsonHelper: JsonHelper, - configManager: ConfigManager, + configRepository: ConfigRepository, ) : BaseEventDownSyncWorkersBuilder( downSyncScopeRepository, jsonHelper, - configManager, + configRepository, ) { override fun getWorkerClass(): Class = SimprintsEventDownSyncDownloaderWorker::class.java @@ -31,8 +31,8 @@ internal class SimprintsEventDownSyncWorkersBuilder @Inject constructor( uniqueSyncId: String, uniqueDownSyncId: String, ): List { - val projectConfiguration = configManager.getProjectConfiguration() - val deviceConfiguration = configManager.getDeviceConfiguration() + val projectConfiguration = configRepository.getProjectConfiguration() + val deviceConfiguration = configRepository.getDeviceConfiguration() val downSyncScope = downSyncScopeRepository.getDownSyncScope( modes = projectConfiguration.general.modalities, diff --git a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/down/tasks/BaseEventDownSyncTask.kt b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/down/tasks/BaseEventDownSyncTask.kt index 346c128cb7..3c558ee55c 100644 --- a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/down/tasks/BaseEventDownSyncTask.kt +++ b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/down/tasks/BaseEventDownSyncTask.kt @@ -3,8 +3,8 @@ package com.simprints.infra.eventsync.sync.down.tasks import com.simprints.core.domain.tokenization.values import com.simprints.core.tools.time.TimeHelper import com.simprints.core.tools.time.Timestamp +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.Project -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.enrolment.records.repository.EnrolmentRecordRepository import com.simprints.infra.enrolment.records.repository.domain.models.EnrolmentRecordAction import com.simprints.infra.enrolment.records.repository.domain.models.EnrolmentRecordAction.Creation @@ -38,7 +38,7 @@ internal abstract class BaseEventDownSyncTask( protected val enrolmentRecordRepository: EnrolmentRecordRepository, protected val eventDownSyncScopeRepository: EventDownSyncScopeRepository, protected val enrolmentRecordFactory: EnrolmentRecordFactory, - protected val configManager: ConfigManager, + protected val configRepository: ConfigRepository, protected val timeHelper: TimeHelper, protected val eventRepository: EventRepository, ) { @@ -234,7 +234,7 @@ internal abstract class BaseEventDownSyncTask( ): Boolean = when { // When syncing by module, check whether record was moved in a module selected for syncing operation.isSyncingByModule() -> { - configManager + configRepository .getDeviceConfiguration() .selectedModules .values() diff --git a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/down/tasks/CommCareEventSyncTask.kt b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/down/tasks/CommCareEventSyncTask.kt index ab9476eb5d..85406d8f27 100644 --- a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/down/tasks/CommCareEventSyncTask.kt +++ b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/down/tasks/CommCareEventSyncTask.kt @@ -1,7 +1,7 @@ package com.simprints.infra.eventsync.sync.down.tasks import com.simprints.core.tools.time.TimeHelper -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.enrolment.records.repository.EnrolmentRecordRepository import com.simprints.infra.events.EventRepository import com.simprints.infra.events.event.domain.models.subject.EnrolmentRecordEvent @@ -18,7 +18,7 @@ internal class CommCareEventSyncTask @Inject constructor( enrolmentRecordRepository: EnrolmentRecordRepository, eventDownSyncScopeRepository: EventDownSyncScopeRepository, enrolmentRecordFactory: EnrolmentRecordFactory, - configManager: ConfigManager, + configRepository: ConfigRepository, timeHelper: TimeHelper, eventRepository: EventRepository, private val commCareEventDataSource: CommCareEventDataSource, @@ -26,7 +26,7 @@ internal class CommCareEventSyncTask @Inject constructor( enrolmentRecordRepository, eventDownSyncScopeRepository, enrolmentRecordFactory, - configManager, + configRepository, timeHelper, eventRepository, ) { diff --git a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/down/tasks/SimprintsEventDownSyncTask.kt b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/down/tasks/SimprintsEventDownSyncTask.kt index c6fd03d582..419cd2871b 100644 --- a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/down/tasks/SimprintsEventDownSyncTask.kt +++ b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/down/tasks/SimprintsEventDownSyncTask.kt @@ -2,7 +2,7 @@ package com.simprints.infra.eventsync.sync.down.tasks import com.simprints.core.tools.time.TimeHelper import com.simprints.infra.authstore.exceptions.RemoteDbNotSignedInException -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.enrolment.records.repository.EnrolmentRecordRepository import com.simprints.infra.events.EventRepository import com.simprints.infra.eventsync.event.remote.EventRemoteDataSource @@ -18,7 +18,7 @@ internal class SimprintsEventDownSyncTask @Inject constructor( enrolmentRecordRepository: EnrolmentRecordRepository, eventDownSyncScopeRepository: EventDownSyncScopeRepository, enrolmentRecordFactory: EnrolmentRecordFactory, - configManager: ConfigManager, + configRepository: ConfigRepository, timeHelper: TimeHelper, eventRepository: EventRepository, private val eventRemoteDataSource: EventRemoteDataSource, @@ -26,7 +26,7 @@ internal class SimprintsEventDownSyncTask @Inject constructor( enrolmentRecordRepository, eventDownSyncScopeRepository, enrolmentRecordFactory, - configManager, + configRepository, timeHelper, eventRepository, ) { diff --git a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/master/EventSyncMasterWorker.kt b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/master/EventSyncMasterWorker.kt index a343fa8d7b..bff38c3cf9 100644 --- a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/master/EventSyncMasterWorker.kt +++ b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/master/EventSyncMasterWorker.kt @@ -10,12 +10,12 @@ import androidx.work.workDataOf import com.simprints.core.DispatcherBG import com.simprints.core.tools.time.TimeHelper import com.simprints.core.workers.SimCoroutineWorker +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.ProjectConfiguration import com.simprints.infra.config.store.models.ProjectState import com.simprints.infra.config.store.models.canSyncDataToSimprints import com.simprints.infra.config.store.models.isCommCareEventDownSyncAllowed import com.simprints.infra.config.store.models.isSimprintsEventDownSyncAllowed -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.events.EventRepository import com.simprints.infra.events.event.domain.models.scope.EventScopeType import com.simprints.infra.eventsync.sync.common.EventSyncCache @@ -40,7 +40,7 @@ class EventSyncMasterWorker @AssistedInject internal constructor( private val simprintsDownSyncWorkerBuilder: SimprintsEventDownSyncWorkersBuilder, private val commCareDownSyncWorkerBuilder: CommCareEventSyncWorkersBuilder, private val upSyncWorkerBuilder: EventUpSyncWorkersBuilder, - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val eventSyncCache: EventSyncCache, private val eventRepository: EventRepository, private val eventSyncSubMasterWorkersBuilder: EventSyncSubMasterWorkersBuilder, @@ -69,7 +69,7 @@ class EventSyncMasterWorker @AssistedInject internal constructor( try { // check if device is rooted before starting the sync securityManager.checkIfDeviceIsRooted() - val configuration = configManager.getProjectConfiguration() + val configuration = configRepository.getProjectConfiguration() if (!configuration.canSyncDataToSimprints() && !isEventDownSyncAllowed(configuration)) { return@withContext success(message = "Can't sync to SimprintsID, skip") @@ -161,7 +161,7 @@ class EventSyncMasterWorker @AssistedInject internal constructor( } private suspend fun isEventDownSyncAllowed(configuration: ProjectConfiguration): Boolean { - val isProjectPaused = configManager.getProject()?.state == ProjectState.PROJECT_PAUSED + val isProjectPaused = configRepository.getProject()?.state == ProjectState.PROJECT_PAUSED val isSimprintsDownSyncEnabled = configuration.isSimprintsEventDownSyncAllowed() val isCommCareDownSyncEnabled = configuration.isCommCareEventDownSyncAllowed() diff --git a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/up/tasks/EventUpSyncTask.kt b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/up/tasks/EventUpSyncTask.kt index 01184887ff..82f4855782 100644 --- a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/up/tasks/EventUpSyncTask.kt +++ b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/up/tasks/EventUpSyncTask.kt @@ -7,12 +7,12 @@ import com.simprints.core.tools.time.TimeHelper import com.simprints.core.tools.time.Timestamp import com.simprints.infra.authstore.AuthStore import com.simprints.infra.authstore.exceptions.RemoteDbNotSignedInException +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.Project import com.simprints.infra.config.store.models.ProjectConfiguration import com.simprints.infra.config.store.models.canSyncAllDataToSimprints import com.simprints.infra.config.store.models.canSyncAnalyticsDataToSimprints import com.simprints.infra.config.store.models.canSyncBiometricDataToSimprints -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.events.EventRepository import com.simprints.infra.events.event.domain.models.BiometricReferenceCreationEvent import com.simprints.infra.events.event.domain.models.EnrolmentEventV2 @@ -57,7 +57,7 @@ internal class EventUpSyncTask @Inject constructor( private val eventRemoteDataSource: EventRemoteDataSource, private val mapDomainEventScopeToApiUseCase: MapDomainEventScopeToApiUseCase, private val timeHelper: TimeHelper, - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val jsonHelper: JsonHelper, ) { fun upSync( @@ -70,8 +70,8 @@ internal class EventUpSyncTask @Inject constructor( } } - val project = configManager.getProject() ?: throw IllegalStateException("Project is missing") - val config = configManager.getProjectConfiguration() + val project = configRepository.getProject() ?: throw IllegalStateException("Project is missing") + val config = configRepository.getProjectConfiguration() var lastOperation = operation.copy() var isUsefulUpload = false diff --git a/infra/event-sync/src/test/java/com/simprints/infra/eventsync/status/down/EventDownSyncScopeRepositoryTest.kt b/infra/event-sync/src/test/java/com/simprints/infra/eventsync/status/down/EventDownSyncScopeRepositoryTest.kt index 10950e92ac..401ca785b0 100644 --- a/infra/event-sync/src/test/java/com/simprints/infra/eventsync/status/down/EventDownSyncScopeRepositoryTest.kt +++ b/infra/event-sync/src/test/java/com/simprints/infra/eventsync/status/down/EventDownSyncScopeRepositoryTest.kt @@ -6,8 +6,8 @@ import com.simprints.core.domain.common.Partitioning import com.simprints.core.domain.tokenization.TokenizableString import com.simprints.core.domain.tokenization.asTokenizableEncrypted import com.simprints.infra.authstore.AuthStore +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.tokenization.TokenizationProcessor -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.events.sampledata.SampleDefaults.DEFAULT_MODES import com.simprints.infra.events.sampledata.SampleDefaults.DEFAULT_MODULES import com.simprints.infra.events.sampledata.SampleDefaults.DEFAULT_MODULE_ID @@ -60,7 +60,7 @@ internal class EventDownSyncScopeRepositoryTest { lateinit var downSyncOperationOperationDao: DbEventDownSyncOperationStateDao @MockK - lateinit var configManager: ConfigManager + lateinit var configRepository: ConfigRepository @MockK lateinit var tokenizationProcessor: TokenizationProcessor @@ -78,7 +78,7 @@ internal class EventDownSyncScopeRepositoryTest { authStore, recentUserActivityManager, downSyncOperationOperationDao, - configManager, + configRepository, tokenizationProcessor, ) diff --git a/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/down/CommCareEventSyncWorkersBuilderTest.kt b/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/down/CommCareEventSyncWorkersBuilderTest.kt index 0336431c69..9991947dba 100644 --- a/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/down/CommCareEventSyncWorkersBuilderTest.kt +++ b/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/down/CommCareEventSyncWorkersBuilderTest.kt @@ -6,8 +6,8 @@ import com.google.common.truth.Truth.assertThat import com.simprints.core.domain.common.Modality import com.simprints.core.domain.common.Partitioning import com.simprints.core.tools.json.JsonHelper +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.GeneralConfiguration -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.eventsync.SampleSyncScopes import com.simprints.infra.eventsync.status.down.EventDownSyncScopeRepository import com.simprints.infra.eventsync.status.down.domain.EventDownSyncScope @@ -34,7 +34,7 @@ class CommCareEventSyncWorkersBuilderTest { private lateinit var generalConfiguration: GeneralConfiguration @MockK - private lateinit var configManager: ConfigManager + private lateinit var configRepository: ConfigRepository @MockK private lateinit var eventDownSyncScopeRepository: EventDownSyncScopeRepository @@ -45,14 +45,14 @@ class CommCareEventSyncWorkersBuilderTest { fun setUp() { MockKAnnotations.init(this, relaxed = true) - coEvery { configManager.getProjectConfiguration() } returns mockk { + coEvery { configRepository.getProjectConfiguration() } returns mockk { every { general } returns generalConfiguration } commCareEventSyncWorkersBuilder = CommCareEventSyncWorkersBuilder( eventDownSyncScopeRepository, JsonHelper, - configManager, + configRepository, ) } diff --git a/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/down/SimprintsEventDownSyncWorkersBuilderTest.kt b/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/down/SimprintsEventDownSyncWorkersBuilderTest.kt index aa95b4d17f..a52b859c28 100644 --- a/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/down/SimprintsEventDownSyncWorkersBuilderTest.kt +++ b/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/down/SimprintsEventDownSyncWorkersBuilderTest.kt @@ -2,16 +2,16 @@ package com.simprints.infra.eventsync.sync.down import androidx.work.WorkRequest import androidx.work.workDataOf -import com.google.common.truth.Truth.assertThat +import com.google.common.truth.Truth.* import com.simprints.core.domain.common.Modality import com.simprints.core.domain.common.Partitioning import com.simprints.core.domain.tokenization.asTokenizableEncrypted import com.simprints.core.domain.tokenization.values import com.simprints.core.tools.json.JsonHelper +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.DeviceConfiguration import com.simprints.infra.config.store.models.DownSynchronizationConfiguration import com.simprints.infra.config.store.models.GeneralConfiguration -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.eventsync.SampleSyncScopes import com.simprints.infra.eventsync.status.down.EventDownSyncScopeRepository import com.simprints.infra.eventsync.status.down.domain.EventDownSyncScope @@ -24,11 +24,8 @@ import com.simprints.infra.eventsync.sync.common.TAG_SUBJECTS_SYNC_ALL_WORKERS import com.simprints.infra.eventsync.sync.down.workers.BaseEventDownSyncDownloaderWorker.Companion.INPUT_DOWN_SYNC_OPS import com.simprints.infra.eventsync.sync.down.workers.BaseEventDownSyncDownloaderWorker.Companion.INPUT_EVENT_DOWN_SYNC_SCOPE_ID import com.simprints.infra.eventsync.sync.down.workers.SimprintsEventDownSyncDownloaderWorker -import io.mockk.MockKAnnotations -import io.mockk.coEvery -import io.mockk.every +import io.mockk.* import io.mockk.impl.annotations.MockK -import io.mockk.mockk import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.Test @@ -45,7 +42,7 @@ class SimprintsEventDownSyncWorkersBuilderTest { private lateinit var downSyncConfiguration: DownSynchronizationConfiguration @MockK - private lateinit var configManager: ConfigManager + private lateinit var configRepository: ConfigRepository @MockK private lateinit var eventDownSyncScopeRepository: EventDownSyncScopeRepository @@ -56,12 +53,12 @@ class SimprintsEventDownSyncWorkersBuilderTest { fun setUp() { MockKAnnotations.init(this, relaxed = true) - coEvery { configManager.getDeviceConfiguration() } returns DeviceConfiguration( + coEvery { configRepository.getDeviceConfiguration() } returns DeviceConfiguration( "", SELECTED_MODULE, "", ) - coEvery { configManager.getProjectConfiguration() } returns mockk { + coEvery { configRepository.getProjectConfiguration() } returns mockk { every { general } returns generalConfiguration every { synchronization } returns mockk { every { down } returns downSyncConfiguration @@ -71,7 +68,7 @@ class SimprintsEventDownSyncWorkersBuilderTest { eventDownSyncWorkersBuilder = SimprintsEventDownSyncWorkersBuilder( eventDownSyncScopeRepository, JsonHelper, - configManager, + configRepository, ) } diff --git a/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/down/tasks/CommCareEventSyncTaskTest.kt b/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/down/tasks/CommCareEventSyncTaskTest.kt index 3f86693b97..c346ca4d9a 100644 --- a/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/down/tasks/CommCareEventSyncTaskTest.kt +++ b/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/down/tasks/CommCareEventSyncTaskTest.kt @@ -9,9 +9,9 @@ import com.simprints.core.domain.reference.BiometricTemplate import com.simprints.core.domain.tokenization.asTokenizableEncrypted import com.simprints.core.domain.tokenization.asTokenizableRaw import com.simprints.core.tools.time.TimeHelper +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.DeviceConfiguration import com.simprints.infra.config.store.models.Project -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.enrolment.records.repository.EnrolmentRecordRepository import com.simprints.infra.enrolment.records.repository.domain.models.EnrolmentRecord import com.simprints.infra.enrolment.records.repository.domain.models.EnrolmentRecordAction @@ -149,7 +149,7 @@ class CommCareEventSyncTaskTest { private lateinit var timeHelper: TimeHelper @MockK - private lateinit var configManager: ConfigManager + private lateinit var configRepository: ConfigRepository @MockK private lateinit var commCareEventDataSource: CommCareEventDataSource @@ -180,7 +180,7 @@ class CommCareEventSyncTaskTest { enrolmentRecordRepository, eventDownSyncScopeRepository, enrolmentRecordFactory, - configManager, + configRepository, timeHelper, eventRepository, commCareEventDataSource, @@ -378,7 +378,7 @@ class CommCareEventSyncTaskTest { fun moveSubjectFromModulesUnderSyncing_shouldPerformBothActions() = runTest { val eventToMoveToModule2 = ENROLMENT_RECORD_MOVE_MODULE mockCommCareDataSource(listOf(eventToMoveToModule2)) - coEvery { configManager.getDeviceConfiguration() } returns DeviceConfiguration( + coEvery { configRepository.getDeviceConfiguration() } returns DeviceConfiguration( "", listOf(DEFAULT_MODULE_ID, DEFAULT_MODULE_ID_2), "", diff --git a/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/down/tasks/SimprintsEventDownSyncTaskTest.kt b/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/down/tasks/SimprintsEventDownSyncTaskTest.kt index f68265eda6..76947659f6 100644 --- a/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/down/tasks/SimprintsEventDownSyncTaskTest.kt +++ b/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/down/tasks/SimprintsEventDownSyncTaskTest.kt @@ -10,9 +10,9 @@ import com.simprints.core.domain.tokenization.asTokenizableEncrypted import com.simprints.core.domain.tokenization.asTokenizableRaw import com.simprints.core.tools.time.TimeHelper import com.simprints.infra.authstore.exceptions.RemoteDbNotSignedInException +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.DeviceConfiguration import com.simprints.infra.config.store.models.Project -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.enrolment.records.repository.EnrolmentRecordRepository import com.simprints.infra.enrolment.records.repository.domain.models.EnrolmentRecord import com.simprints.infra.enrolment.records.repository.domain.models.EnrolmentRecordAction @@ -174,7 +174,7 @@ class SimprintsEventDownSyncTaskTest { private lateinit var timeHelper: TimeHelper @MockK - private lateinit var configManager: ConfigManager + private lateinit var configRepository: ConfigRepository @MockK private lateinit var eventRemoteDataSource: EventRemoteDataSource @@ -205,7 +205,7 @@ class SimprintsEventDownSyncTaskTest { enrolmentRecordRepository, eventDownSyncScopeRepository, enrolmentRecordFactory, - configManager, + configRepository, timeHelper, eventRepository, eventRemoteDataSource, @@ -372,7 +372,7 @@ class SimprintsEventDownSyncTaskTest { fun moveSubjectFromModulesUnderSyncing_theOriginalModuleSyncShouldDoNothing() = runTest { val eventToMoveToModule2 = ENROLMENT_RECORD_MOVE_MODULE mockProgressEmission(listOf(eventToMoveToModule2)) - coEvery { configManager.getDeviceConfiguration() } returns DeviceConfiguration( + coEvery { configRepository.getDeviceConfiguration() } returns DeviceConfiguration( "", listOf(DEFAULT_MODULE_ID, DEFAULT_MODULE_ID_2), "", @@ -395,7 +395,7 @@ class SimprintsEventDownSyncTaskTest { fun moveSubjectFromModulesUnderSyncing_theDestinationModuleSyncShouldPerformCreation() = runTest { val eventToMoveToModule2 = ENROLMENT_RECORD_MOVE_MODULE mockProgressEmission(listOf(eventToMoveToModule2)) - coEvery { configManager.getDeviceConfiguration() } returns DeviceConfiguration( + coEvery { configRepository.getDeviceConfiguration() } returns DeviceConfiguration( "", listOf(DEFAULT_MODULE_ID, DEFAULT_MODULE_ID_2), "", @@ -423,7 +423,7 @@ class SimprintsEventDownSyncTaskTest { fun moveSubjectToAModuleNotUnderSyncing_shouldPerformDeletionOnly() = runTest { val eventToMoveToModule2 = ENROLMENT_RECORD_MOVE_MODULE mockProgressEmission(listOf(eventToMoveToModule2)) - coEvery { configManager.getDeviceConfiguration() } returns DeviceConfiguration( + coEvery { configRepository.getDeviceConfiguration() } returns DeviceConfiguration( language = "", selectedModules = listOf(DEFAULT_MODULE_ID), lastInstructionId = "", @@ -445,7 +445,7 @@ class SimprintsEventDownSyncTaskTest { fun moveSubjectToAModuleUnderSyncing_shouldPerformCreation() = runTest { val eventToMoveToModule2 = ENROLMENT_RECORD_MOVE_MODULE mockProgressEmission(listOf(eventToMoveToModule2)) - coEvery { configManager.getDeviceConfiguration() } returns DeviceConfiguration( + coEvery { configRepository.getDeviceConfiguration() } returns DeviceConfiguration( "", listOf(DEFAULT_MODULE_ID_2), "", @@ -473,7 +473,7 @@ class SimprintsEventDownSyncTaskTest { fun moveSubjectToModule2_syncModule1_shouldPerformCreationInModule2() = runTest { val eventToMoveToModule2 = ENROLMENT_RECORD_MOVE_MODULE mockProgressEmission(listOf(eventToMoveToModule2)) - coEvery { configManager.getDeviceConfiguration() } returns DeviceConfiguration( + coEvery { configRepository.getDeviceConfiguration() } returns DeviceConfiguration( "", listOf(DEFAULT_MODULE_ID, DEFAULT_MODULE_ID_2), "", diff --git a/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/master/EventSyncMasterWorkerTest.kt b/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/master/EventSyncMasterWorkerTest.kt index 0aba5b5f20..28a72a8ae7 100644 --- a/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/master/EventSyncMasterWorkerTest.kt +++ b/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/master/EventSyncMasterWorkerTest.kt @@ -1,7 +1,6 @@ package com.simprints.infra.eventsync.sync.master import android.content.Context -import android.os.PowerManager import androidx.test.core.app.ApplicationProvider.* import androidx.test.ext.junit.runners.* import androidx.work.Configuration @@ -15,6 +14,7 @@ import androidx.work.testing.WorkManagerTestInitHelper import androidx.work.workDataOf import com.google.common.truth.Truth.* import com.simprints.core.tools.time.TimeHelper +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.DownSynchronizationConfiguration import com.simprints.infra.config.store.models.Frequency import com.simprints.infra.config.store.models.Frequency.ONLY_PERIODICALLY_UP_SYNC @@ -25,7 +25,6 @@ import com.simprints.infra.config.store.models.SynchronizationConfiguration import com.simprints.infra.config.store.models.UpSynchronizationConfiguration.SimprintsUpSynchronizationConfiguration import com.simprints.infra.config.store.models.UpSynchronizationConfiguration.UpSynchronizationKind.ALL import com.simprints.infra.config.store.models.UpSynchronizationConfiguration.UpSynchronizationKind.NONE -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.events.EventRepository import com.simprints.infra.events.event.domain.models.scope.EventScopeType import com.simprints.infra.eventsync.sync.common.EventSyncCache @@ -104,7 +103,7 @@ internal class EventSyncMasterWorkerTest { lateinit var projectConfiguration: ProjectConfiguration @MockK - lateinit var configManager: ConfigManager + lateinit var configRepository: ConfigRepository @MockK lateinit var timeHelper: TimeHelper @@ -145,7 +144,7 @@ internal class EventSyncMasterWorkerTest { every { synchronizationConfiguration.up.simprints } returns bfsidUpSynchronizationConfiguration every { projectConfiguration.projectId } returns "projectId" every { projectConfiguration.synchronization } returns synchronizationConfiguration - coEvery { configManager.getProjectConfiguration() } returns projectConfiguration + coEvery { configRepository.getProjectConfiguration() } returns projectConfiguration masterWorker = spyk( EventSyncMasterWorker( @@ -157,7 +156,7 @@ internal class EventSyncMasterWorkerTest { simprintsDownSyncWorkerBuilder = simprintsDownSyncWorkerBuilder, commCareDownSyncWorkerBuilder = commCareDownSyncWorkerBuilder, upSyncWorkerBuilder = upSyncWorkerBuilder, - configManager = configManager, + configRepository = configRepository, eventSyncCache = eventSyncCache, eventSyncSubMasterWorkersBuilder = eventSyncSubMasterWorkersBuilder, timeHelper = timeHelper, @@ -323,7 +322,7 @@ internal class EventSyncMasterWorkerTest { @Test fun `doWork should fail if there is an exception`() = runTest { - coEvery { configManager.getProjectConfiguration() } throws Throwable() + coEvery { configRepository.getProjectConfiguration() } throws Throwable() val result = masterWorker.doWork() assertThat(result).isEqualTo(ListenableWorker.Result.failure()) @@ -353,8 +352,8 @@ internal class EventSyncMasterWorkerTest { projectState: ProjectState, syncConfig: Frequency, ): ListenableWorker.Result { - coEvery { configManager.getProject()?.state } returns projectState - coEvery { configManager.getProjectConfiguration() } returns mockk { + coEvery { configRepository.getProject()?.state } returns projectState + coEvery { configRepository.getProjectConfiguration() } returns mockk { every { projectId } returns "projectId" every { synchronization } returns mockk { every { down.simprints?.frequency } returns syncConfig diff --git a/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/up/tasks/EventUpSyncTaskTest.kt b/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/up/tasks/EventUpSyncTaskTest.kt index 2650b0d3e1..241a780475 100644 --- a/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/up/tasks/EventUpSyncTaskTest.kt +++ b/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/up/tasks/EventUpSyncTaskTest.kt @@ -8,12 +8,12 @@ import com.simprints.core.tools.time.Timestamp import com.simprints.core.tools.utils.randomUUID import com.simprints.infra.authstore.AuthStore import com.simprints.infra.authstore.exceptions.RemoteDbNotSignedInException +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.Project import com.simprints.infra.config.store.models.ProjectConfiguration import com.simprints.infra.config.store.models.ProjectWithConfig import com.simprints.infra.config.store.models.SynchronizationConfiguration import com.simprints.infra.config.store.models.UpSynchronizationConfiguration -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.events.EventRepository import com.simprints.infra.events.event.domain.models.Event import com.simprints.infra.events.event.domain.models.scope.EventScope @@ -86,7 +86,7 @@ internal class EventUpSyncTaskTest { private lateinit var project: Project @MockK - private lateinit var configManager: ConfigManager + private lateinit var configRepository: ConfigRepository @MockK private lateinit var eventScope: EventScope @@ -107,11 +107,11 @@ internal class EventUpSyncTaskTest { eventDownSyncs = 10, sampleUpSyncs = 10, ) - coEvery { configManager.refreshProject(any()) } returns projectWithConfig + coEvery { configRepository.refreshProject(any()) } returns projectWithConfig every { projectWithConfig.project } returns project every { projectWithConfig.configuration } returns projectConfiguration every { projectConfiguration.synchronization } returns synchronizationConfiguration - coEvery { configManager.getProjectConfiguration() } returns projectConfiguration + coEvery { configRepository.getProjectConfiguration() } returns projectConfiguration eventUpSyncTask = EventUpSyncTask( authStore = authStore, @@ -119,7 +119,7 @@ internal class EventUpSyncTaskTest { eventRepository = eventRepo, eventRemoteDataSource = eventRemoteDataSource, timeHelper = timeHelper, - configManager = configManager, + configRepository = configRepository, jsonHelper = JsonHelper, mapDomainEventScopeToApiUseCase = mapDomainEventScopeToApiUseCase, ) @@ -330,7 +330,7 @@ internal class EventUpSyncTaskTest { @Test(expected = IllegalStateException::class) fun `should not upload sessions if missing project`() = runTest { - coEvery { configManager.getProject() } returns null + coEvery { configRepository.getProject() } returns null eventUpSyncTask.upSync(operation, eventScope).toList() } diff --git a/infra/images/src/main/java/com/simprints/infra/images/remote/firebase/FirebaseSampleUploader.kt b/infra/images/src/main/java/com/simprints/infra/images/remote/firebase/FirebaseSampleUploader.kt index 82c074ea8a..b801454b76 100644 --- a/infra/images/src/main/java/com/simprints/infra/images/remote/firebase/FirebaseSampleUploader.kt +++ b/infra/images/src/main/java/com/simprints/infra/images/remote/firebase/FirebaseSampleUploader.kt @@ -6,7 +6,7 @@ import com.google.firebase.storage.StorageReference import com.google.firebase.storage.UploadTask import com.simprints.core.tools.time.TimeHelper import com.simprints.infra.authstore.AuthStore -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.events.EventRepository import com.simprints.infra.events.event.domain.models.samples.SampleUpSyncRequestEvent import com.simprints.infra.events.event.domain.models.scope.EventScopeEndCause @@ -24,7 +24,7 @@ import javax.inject.Inject internal class FirebaseSampleUploader @Inject constructor( private val timeHelper: TimeHelper, - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val authStore: AuthStore, private val localDataSource: ImageLocalDataSource, private val metadataStore: ImageMetadataStore, @@ -43,7 +43,7 @@ internal class FirebaseSampleUploader @Inject constructor( var allImagesUploaded = true Simber.i("Starting sample upload to Firebase storage", tag = SAMPLE_UPLOAD) - val bucketUrl = configManager.getProject()?.imageBucket + val bucketUrl = configRepository.getProject()?.imageBucket if (bucketUrl == null) { Simber.i("Bucket url is null", tag = SAMPLE_UPLOAD) return false diff --git a/infra/images/src/test/java/com/simprints/infra/images/remote/firebase/FirebaseSampleUploaderTest.kt b/infra/images/src/test/java/com/simprints/infra/images/remote/firebase/FirebaseSampleUploaderTest.kt index 801e9df6dc..1c0bc40795 100644 --- a/infra/images/src/test/java/com/simprints/infra/images/remote/firebase/FirebaseSampleUploaderTest.kt +++ b/infra/images/src/test/java/com/simprints/infra/images/remote/firebase/FirebaseSampleUploaderTest.kt @@ -7,8 +7,7 @@ import com.simprints.core.domain.common.Modality import com.simprints.core.tools.time.TimeHelper import com.simprints.core.tools.time.Timestamp import com.simprints.infra.authstore.AuthStore -import com.simprints.infra.config.store.models.GeneralConfiguration -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.events.EventRepository import com.simprints.infra.events.event.domain.models.scope.EventScope import com.simprints.infra.events.event.domain.models.scope.EventScopeType @@ -34,7 +33,7 @@ class FirebaseSampleUploaderTest { private lateinit var timeHelper: TimeHelper @MockK - private lateinit var configManager: ConfigManager + private lateinit var configRepository: ConfigRepository @MockK private lateinit var authStore: AuthStore @@ -64,7 +63,7 @@ class FirebaseSampleUploaderTest { remoteDataSource = FirebaseSampleUploader( timeHelper = timeHelper, - configManager = configManager, + configRepository = configRepository, authStore = authStore, localDataSource = localDataSource, metadataStore = metadataStore, @@ -111,7 +110,7 @@ class FirebaseSampleUploaderTest { @Test fun `null project returns failed upload`() = runTest { every { authStore.getLegacyAppFallback().options.projectId } returns "projectId" - coEvery { configManager.getProject() } returns null + coEvery { configRepository.getProject() } returns null val result = remoteDataSource.uploadAllSamples(PROJECT_ID) @@ -217,7 +216,7 @@ class FirebaseSampleUploaderTest { } private fun setupProjectConfig() { - coEvery { configManager.getProject()?.imageBucket } returns "gs://`simprints-dev.appspot.com" + coEvery { configRepository.getProject()?.imageBucket } returns "gs://`simprints-dev.appspot.com" every { authStore.getLegacyAppFallback().options.projectId } returns "projectId" every { authStore.signedInProjectId } returns "projectId" } diff --git a/infra/matching/src/main/java/com/simprints/infra/matching/usecase/FingerprintMatcherUseCase.kt b/infra/matching/src/main/java/com/simprints/infra/matching/usecase/FingerprintMatcherUseCase.kt index 55c4286d17..ea427e10be 100644 --- a/infra/matching/src/main/java/com/simprints/infra/matching/usecase/FingerprintMatcherUseCase.kt +++ b/infra/matching/src/main/java/com/simprints/infra/matching/usecase/FingerprintMatcherUseCase.kt @@ -1,16 +1,16 @@ package com.simprints.infra.matching.usecase import com.simprints.core.DispatcherBG -import com.simprints.core.domain.common.FlowType import com.simprints.core.domain.capture.BiometricReferenceCapture +import com.simprints.core.domain.common.FlowType import com.simprints.core.domain.reference.CandidateRecord import com.simprints.core.tools.time.TimeHelper import com.simprints.fingerprint.infra.biosdk.BioSdkWrapper import com.simprints.fingerprint.infra.biosdk.ResolveBioSdkWrapperUseCase +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.FingerprintConfiguration import com.simprints.infra.config.store.models.FingerprintConfiguration.FingerComparisonStrategy.CROSS_FINGER_USING_MEAN_OF_MAX import com.simprints.infra.config.store.models.Project -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.enrolment.records.repository.EnrolmentRecordRepository import com.simprints.infra.enrolment.records.repository.domain.models.CandidateRecordBatch import com.simprints.infra.logging.LoggingConstants @@ -30,7 +30,7 @@ class FingerprintMatcherUseCase @Inject constructor( private val timeHelper: TimeHelper, private val enrolmentRecordRepository: EnrolmentRecordRepository, private val resolveBioSdkWrapper: ResolveBioSdkWrapperUseCase, - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val createRanges: CreateRangesUseCase, @param:DispatcherBG private val dispatcherBG: CoroutineDispatcher, ) : MatcherUseCase { @@ -151,7 +151,7 @@ class FingerprintMatcherUseCase @Inject constructor( private suspend fun isCrossFingerMatchingEnabled( flowType: FlowType, bioSdk: FingerprintConfiguration.BioSdk, - ): Boolean = configManager + ): Boolean = configRepository .takeIf { flowType == FlowType.VERIFY } ?.getProjectConfiguration() ?.fingerprint diff --git a/infra/matching/src/main/java/com/simprints/infra/matching/usecase/SaveMatchEventUseCase.kt b/infra/matching/src/main/java/com/simprints/infra/matching/usecase/SaveMatchEventUseCase.kt index f31b9648d4..29b6aef10b 100644 --- a/infra/matching/src/main/java/com/simprints/infra/matching/usecase/SaveMatchEventUseCase.kt +++ b/infra/matching/src/main/java/com/simprints/infra/matching/usecase/SaveMatchEventUseCase.kt @@ -4,8 +4,8 @@ import com.simprints.core.SessionCoroutineScope import com.simprints.core.domain.common.FlowType import com.simprints.core.domain.comparison.ComparisonResult import com.simprints.core.tools.time.Timestamp +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.FingerprintConfiguration -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.enrolment.records.repository.domain.models.EnrolmentRecordQuery import com.simprints.infra.events.event.domain.models.FingerComparisonStrategy import com.simprints.infra.events.event.domain.models.MatchEntry @@ -21,7 +21,7 @@ import com.simprints.infra.config.store.models.FingerprintConfiguration.FingerCo class SaveMatchEventUseCase @Inject constructor( private val eventRepository: SessionEventRepository, - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, @param:SessionCoroutineScope private val sessionCoroutineScope: CoroutineScope, ) { operator fun invoke( @@ -63,7 +63,7 @@ class SaveMatchEventUseCase @Inject constructor( } } - private suspend fun getFingerprintComparisonStrategy(bioSdk: FingerprintConfiguration.BioSdk) = configManager + private suspend fun getFingerprintComparisonStrategy(bioSdk: FingerprintConfiguration.BioSdk) = configRepository .getProjectConfiguration() .fingerprint ?.getSdkConfiguration(bioSdk) diff --git a/infra/matching/src/test/java/com/simprints/infra/matching/usecase/FingerprintMatcherUseCaseTest.kt b/infra/matching/src/test/java/com/simprints/infra/matching/usecase/FingerprintMatcherUseCaseTest.kt index 00893758ac..4d244889b5 100644 --- a/infra/matching/src/test/java/com/simprints/infra/matching/usecase/FingerprintMatcherUseCaseTest.kt +++ b/infra/matching/src/test/java/com/simprints/infra/matching/usecase/FingerprintMatcherUseCaseTest.kt @@ -2,22 +2,22 @@ package com.simprints.infra.matching.usecase import androidx.arch.core.executor.testing.InstantTaskExecutorRule import com.google.common.truth.Truth.* +import com.simprints.core.domain.capture.BiometricReferenceCapture +import com.simprints.core.domain.capture.BiometricTemplateCapture import com.simprints.core.domain.common.FlowType import com.simprints.core.domain.common.Modality +import com.simprints.core.domain.common.TemplateIdentifier import com.simprints.core.domain.reference.BiometricReference -import com.simprints.core.domain.capture.BiometricReferenceCapture import com.simprints.core.domain.reference.BiometricTemplate -import com.simprints.core.domain.capture.BiometricTemplateCapture import com.simprints.core.domain.reference.CandidateRecord -import com.simprints.core.domain.common.TemplateIdentifier import com.simprints.core.tools.time.TimeHelper import com.simprints.core.tools.time.Timestamp import com.simprints.fingerprint.infra.biosdk.BioSdkWrapper import com.simprints.fingerprint.infra.biosdk.ResolveBioSdkWrapperUseCase +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.FaceConfiguration import com.simprints.infra.config.store.models.FingerprintConfiguration.BioSdk.SECUGEN_SIM_MATCHER import com.simprints.infra.config.store.models.Project -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.enrolment.records.repository.EnrolmentRecordRepository import com.simprints.infra.enrolment.records.repository.domain.models.BiometricDataSource import com.simprints.infra.enrolment.records.repository.domain.models.CandidateRecordBatch @@ -57,7 +57,7 @@ internal class FingerprintMatcherUseCaseTest { lateinit var resolveBioSdkWrapperUseCase: ResolveBioSdkWrapperUseCase @MockK - lateinit var configManager: ConfigManager + lateinit var configRepository: ConfigRepository @MockK lateinit var project: Project @@ -71,14 +71,14 @@ internal class FingerprintMatcherUseCaseTest { MockKAnnotations.init(this, relaxed = true) coEvery { resolveBioSdkWrapperUseCase(any()) } returns bioSdkWrapper coEvery { - configManager.getProjectConfiguration().fingerprint?.allowedSDKs + configRepository.getProjectConfiguration().fingerprint?.allowedSDKs } returns listOf(SECUGEN_SIM_MATCHER) useCase = FingerprintMatcherUseCase( timeHelper, enrolmentRecordRepository, resolveBioSdkWrapperUseCase, - configManager, + configRepository, createRangesUseCase, testCoroutineRule.testCoroutineDispatcher, ) diff --git a/infra/matching/src/test/java/com/simprints/infra/matching/usecase/SaveMatchEventUseCaseTest.kt b/infra/matching/src/test/java/com/simprints/infra/matching/usecase/SaveMatchEventUseCaseTest.kt index 82e4ddbf11..fa1e9a288d 100644 --- a/infra/matching/src/test/java/com/simprints/infra/matching/usecase/SaveMatchEventUseCaseTest.kt +++ b/infra/matching/src/test/java/com/simprints/infra/matching/usecase/SaveMatchEventUseCaseTest.kt @@ -9,10 +9,10 @@ import com.simprints.core.domain.common.TemplateIdentifier import com.simprints.core.domain.comparison.ComparisonResult import com.simprints.core.domain.tokenization.asTokenizableEncrypted import com.simprints.core.tools.time.Timestamp +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.FaceConfiguration import com.simprints.infra.config.store.models.FingerprintConfiguration.BioSdk.SECUGEN_SIM_MATCHER import com.simprints.infra.config.store.models.FingerprintConfiguration.FingerComparisonStrategy -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.enrolment.records.repository.domain.models.BiometricDataSource import com.simprints.infra.enrolment.records.repository.domain.models.EnrolmentRecordQuery import com.simprints.infra.events.event.domain.models.OneToManyMatchEvent @@ -39,7 +39,7 @@ class SaveMatchEventUseCaseTest { private lateinit var eventRepository: SessionEventRepository @MockK - private lateinit var configManager: ConfigManager + private lateinit var configRepository: ConfigRepository private lateinit var useCase: SaveMatchEventUseCase @@ -50,7 +50,7 @@ class SaveMatchEventUseCaseTest { coEvery { eventRepository.addOrUpdateEvent(any()) } just Runs coEvery { - configManager + configRepository .getProjectConfiguration() .fingerprint ?.getSdkConfiguration(SECUGEN_SIM_MATCHER) @@ -59,7 +59,7 @@ class SaveMatchEventUseCaseTest { useCase = SaveMatchEventUseCase( eventRepository, - configManager, + configRepository, CoroutineScope(testCoroutineRule.testCoroutineDispatcher), ) } diff --git a/infra/sync/src/main/java/com/simprints/infra/sync/SyncOrchestratorImpl.kt b/infra/sync/src/main/java/com/simprints/infra/sync/SyncOrchestratorImpl.kt index ed6c3a22b9..12e19a40df 100644 --- a/infra/sync/src/main/java/com/simprints/infra/sync/SyncOrchestratorImpl.kt +++ b/infra/sync/src/main/java/com/simprints/infra/sync/SyncOrchestratorImpl.kt @@ -9,9 +9,9 @@ import androidx.work.WorkQuery import androidx.work.workDataOf import com.simprints.core.AppScope import com.simprints.infra.authstore.AuthStore +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.imagesUploadRequiresUnmeteredConnection import com.simprints.infra.config.store.models.isCommCareEventDownSyncAllowed -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.eventsync.EventSyncManager import com.simprints.infra.eventsync.sync.master.EventSyncMasterWorker import com.simprints.infra.sync.config.worker.DeviceConfigDownSyncWorker @@ -38,7 +38,7 @@ import javax.inject.Singleton internal class SyncOrchestratorImpl @Inject constructor( private val workManager: WorkManager, private val authStore: AuthStore, - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val eventSyncManager: EventSyncManager, private val shouldScheduleFirmwareUpdate: ShouldScheduleFirmwareUpdateUseCase, private val cleanupDeprecatedWorkers: CleanupDeprecatedWorkersUseCase, @@ -238,7 +238,7 @@ internal class SyncOrchestratorImpl @Inject constructor( } private suspend fun getImageUploadConstraints(): Constraints { - val networkType = configManager + val networkType = configRepository .getProjectConfiguration() .imagesUploadRequiresUnmeteredConnection() .let { if (it) NetworkType.UNMETERED else NetworkType.CONNECTED } @@ -247,7 +247,7 @@ internal class SyncOrchestratorImpl @Inject constructor( private suspend fun getEventSyncConstraints(): Constraints { // CommCare doesn't require network connection - val networkType = configManager + val networkType = configRepository .getProjectConfiguration() .isCommCareEventDownSyncAllowed() .let { if (it) NetworkType.NOT_REQUIRED else NetworkType.CONNECTED } diff --git a/infra/sync/src/main/java/com/simprints/infra/sync/config/worker/DeviceConfigDownSyncWorker.kt b/infra/sync/src/main/java/com/simprints/infra/sync/config/worker/DeviceConfigDownSyncWorker.kt index 8c34a4126e..66f7cff5e1 100644 --- a/infra/sync/src/main/java/com/simprints/infra/sync/config/worker/DeviceConfigDownSyncWorker.kt +++ b/infra/sync/src/main/java/com/simprints/infra/sync/config/worker/DeviceConfigDownSyncWorker.kt @@ -5,7 +5,7 @@ import androidx.hilt.work.HiltWorker import androidx.work.WorkerParameters import com.simprints.core.DispatcherBG import com.simprints.core.workers.SimCoroutineWorker -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.sync.SyncOrchestrator import com.simprints.infra.sync.config.usecase.LogoutUseCase import dagger.assisted.Assisted @@ -17,7 +17,7 @@ import kotlinx.coroutines.withContext internal class DeviceConfigDownSyncWorker @AssistedInject constructor( @Assisted context: Context, @Assisted params: WorkerParameters, - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val logoutUseCase: LogoutUseCase, private val syncOrchestrator: SyncOrchestrator, @param:DispatcherBG private val dispatcher: CoroutineDispatcher, @@ -28,7 +28,7 @@ internal class DeviceConfigDownSyncWorker @AssistedInject constructor( showProgressNotification() crashlyticsLog("Started") try { - val state = configManager.getDeviceState() + val state = configRepository.getDeviceState() if (state.isCompromised) { logoutUseCase() diff --git a/infra/sync/src/main/java/com/simprints/infra/sync/config/worker/ProjectConfigDownSyncWorker.kt b/infra/sync/src/main/java/com/simprints/infra/sync/config/worker/ProjectConfigDownSyncWorker.kt index 4cfd2b2f40..a4aa9225e9 100644 --- a/infra/sync/src/main/java/com/simprints/infra/sync/config/worker/ProjectConfigDownSyncWorker.kt +++ b/infra/sync/src/main/java/com/simprints/infra/sync/config/worker/ProjectConfigDownSyncWorker.kt @@ -6,7 +6,7 @@ import androidx.work.WorkerParameters import com.simprints.core.DispatcherBG import com.simprints.core.workers.SimCoroutineWorker import com.simprints.infra.authstore.AuthStore -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.enrolment.records.repository.local.migration.RealmToRoomMigrationScheduler import com.simprints.infra.sync.config.usecase.HandleProjectStateUseCase import com.simprints.infra.sync.config.usecase.RescheduleWorkersIfConfigChangedUseCase @@ -22,7 +22,7 @@ internal class ProjectConfigDownSyncWorker @AssistedInject constructor( @Assisted context: Context, @Assisted params: WorkerParameters, private val authStore: AuthStore, - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val handleProjectState: HandleProjectStateUseCase, private val rescheduleWorkersIfConfigChanged: RescheduleWorkersIfConfigChangedUseCase, private val resetLocalRecordsIfConfigChanged: ResetLocalRecordsIfConfigChangedUseCase, @@ -37,14 +37,14 @@ internal class ProjectConfigDownSyncWorker @AssistedInject constructor( crashlyticsLog("Started") try { val projectId = authStore.signedInProjectId - val oldProject = configManager.getProject() - val oldConfig = configManager.getProjectConfiguration() + val oldProject = configRepository.getProject() + val oldConfig = configRepository.getProjectConfiguration() // if the user is not signed in, we shouldn't try again if (projectId.isEmpty()) { fail(IllegalStateException("User is not signed in")) } else { - val (project, config) = configManager.refreshProject(projectId) + val (project, config) = configRepository.refreshProject(projectId) handleProjectState(project.state) resetLocalRecordsIfConfigChanged(oldConfig, config) realmToRoomMigrationScheduler.scheduleMigrationWorkerIfNeeded() diff --git a/infra/sync/src/main/java/com/simprints/infra/sync/enrolments/EnrolmentRecordWorker.kt b/infra/sync/src/main/java/com/simprints/infra/sync/enrolments/EnrolmentRecordWorker.kt index fed242c06e..b0239683f9 100644 --- a/infra/sync/src/main/java/com/simprints/infra/sync/enrolments/EnrolmentRecordWorker.kt +++ b/infra/sync/src/main/java/com/simprints/infra/sync/enrolments/EnrolmentRecordWorker.kt @@ -5,7 +5,7 @@ import androidx.hilt.work.HiltWorker import androidx.work.WorkerParameters import com.simprints.core.DispatcherIO import com.simprints.core.workers.SimCoroutineWorker -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.enrolment.records.repository.EnrolmentRecordRepository import com.simprints.infra.sync.SyncConstants import dagger.assisted.Assisted @@ -18,7 +18,7 @@ class EnrolmentRecordWorker @AssistedInject constructor( @Assisted context: Context, @Assisted params: WorkerParameters, private val enrolmentRecordRepository: EnrolmentRecordRepository, - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, @param:DispatcherIO private val dispatcher: CoroutineDispatcher, ) : SimCoroutineWorker(context, params) { override val tag: String = "EnrolmentRecordWorker" @@ -36,7 +36,7 @@ class EnrolmentRecordWorker @AssistedInject constructor( enrolmentRecordRepository.uploadRecords(subjectIds.toList()) - configManager.updateDeviceConfiguration { + configRepository.updateDeviceConfiguration { it.apply { it.lastInstructionId = instructionId } } diff --git a/infra/sync/src/main/java/com/simprints/infra/sync/firmware/ShouldScheduleFirmwareUpdateUseCase.kt b/infra/sync/src/main/java/com/simprints/infra/sync/firmware/ShouldScheduleFirmwareUpdateUseCase.kt index 408d37a767..b88bcdc393 100644 --- a/infra/sync/src/main/java/com/simprints/infra/sync/firmware/ShouldScheduleFirmwareUpdateUseCase.kt +++ b/infra/sync/src/main/java/com/simprints/infra/sync/firmware/ShouldScheduleFirmwareUpdateUseCase.kt @@ -1,13 +1,13 @@ package com.simprints.infra.sync.firmware +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.FingerprintConfiguration -import com.simprints.infra.config.sync.ConfigManager import javax.inject.Inject class ShouldScheduleFirmwareUpdateUseCase @Inject constructor( - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, ) { - suspend operator fun invoke(): Boolean = configManager + suspend operator fun invoke(): Boolean = configRepository .getProjectConfiguration() .fingerprint ?.allowedScanners diff --git a/infra/sync/src/test/java/com/simprints/infra/sync/SyncOrchestratorImplTest.kt b/infra/sync/src/test/java/com/simprints/infra/sync/SyncOrchestratorImplTest.kt index 314cf96755..0feca14aaf 100644 --- a/infra/sync/src/test/java/com/simprints/infra/sync/SyncOrchestratorImplTest.kt +++ b/infra/sync/src/test/java/com/simprints/infra/sync/SyncOrchestratorImplTest.kt @@ -9,7 +9,7 @@ import androidx.work.WorkManager import com.google.common.truth.Truth.assertThat import com.google.common.util.concurrent.ListenableFuture import com.simprints.infra.authstore.AuthStore -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.eventsync.EventSyncManager import com.simprints.infra.eventsync.sync.master.EventSyncMasterWorker import com.simprints.infra.sync.SyncConstants.DEVICE_SYNC_WORK_NAME @@ -57,7 +57,7 @@ class SyncOrchestratorImplTest { private lateinit var authStore: AuthStore @MockK - private lateinit var configManager: ConfigManager + private lateinit var configRepository: ConfigRepository @MockK private lateinit var eventSyncManager: EventSyncManager @@ -111,7 +111,7 @@ class SyncOrchestratorImplTest { @Test fun `schedules images with any connection if not specified`() = runTest { coEvery { - configManager + configRepository .getProjectConfiguration() .synchronization.up.simprints.imagesRequireUnmeteredConnection } returns false @@ -131,7 +131,7 @@ class SyncOrchestratorImplTest { @Test fun `schedules images with unmetered constraint if requested`() = runTest { coEvery { - configManager + configRepository .getProjectConfiguration() .synchronization.up.simprints.imagesRequireUnmeteredConnection } returns true @@ -479,7 +479,7 @@ class SyncOrchestratorImplTest { private fun createSyncOrchestrator() = SyncOrchestratorImpl( workManager, authStore, - configManager, + configRepository, eventSyncManager, shouldScheduleFirmwareUpdate, cleanupDeprecatedWorkers, diff --git a/infra/sync/src/test/java/com/simprints/infra/sync/config/worker/DeviceConfigDownSyncWorkerTest.kt b/infra/sync/src/test/java/com/simprints/infra/sync/config/worker/DeviceConfigDownSyncWorkerTest.kt index 46fb5f60df..f93fd27887 100644 --- a/infra/sync/src/test/java/com/simprints/infra/sync/config/worker/DeviceConfigDownSyncWorkerTest.kt +++ b/infra/sync/src/test/java/com/simprints/infra/sync/config/worker/DeviceConfigDownSyncWorkerTest.kt @@ -3,9 +3,9 @@ package com.simprints.infra.sync.config.worker import android.os.PowerManager import androidx.work.ListenableWorker import com.google.common.truth.Truth.assertThat +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.DeviceState import com.simprints.infra.config.store.models.UpSyncEnrolmentRecords -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.sync.SyncOrchestrator import com.simprints.infra.sync.config.usecase.LogoutUseCase import com.simprints.testtools.common.coroutines.TestCoroutineRule @@ -23,7 +23,7 @@ import org.junit.Test class DeviceConfigDownSyncWorkerTest { @MockK - private lateinit var configManager: ConfigManager + private lateinit var configRepository: ConfigRepository @MockK private lateinit var logoutUseCase: LogoutUseCase @@ -47,7 +47,7 @@ class DeviceConfigDownSyncWorkerTest { } }, params = mockk(relaxed = true), - configManager = configManager, + configRepository = configRepository, logoutUseCase = logoutUseCase, syncOrchestrator = syncOrchestrator, dispatcher = testCoroutineRule.testCoroutineDispatcher, @@ -56,7 +56,7 @@ class DeviceConfigDownSyncWorkerTest { @Test fun `Should succeed if not compromised`() = runTest { - coEvery { configManager.getDeviceState() } returns DeviceState( + coEvery { configRepository.getDeviceState() } returns DeviceState( "deviceId", false, ) @@ -70,7 +70,7 @@ class DeviceConfigDownSyncWorkerTest { @Test fun `Should log out if compromised`() = runTest { - coEvery { configManager.getDeviceState() } returns DeviceState( + coEvery { configRepository.getDeviceState() } returns DeviceState( "deviceId", true, UpSyncEnrolmentRecords("id", listOf("subjectId")), @@ -85,7 +85,7 @@ class DeviceConfigDownSyncWorkerTest { @Test fun `Should schedule record upload if not compromised`() = runTest { - coEvery { configManager.getDeviceState() } returns DeviceState( + coEvery { configRepository.getDeviceState() } returns DeviceState( "deviceId", false, UpSyncEnrolmentRecords("id", listOf("subjectId")), diff --git a/infra/sync/src/test/java/com/simprints/infra/sync/config/worker/ProjectConfigDownSyncWorkerTest.kt b/infra/sync/src/test/java/com/simprints/infra/sync/config/worker/ProjectConfigDownSyncWorkerTest.kt index 6c661d5eda..64e71e812d 100644 --- a/infra/sync/src/test/java/com/simprints/infra/sync/config/worker/ProjectConfigDownSyncWorkerTest.kt +++ b/infra/sync/src/test/java/com/simprints/infra/sync/config/worker/ProjectConfigDownSyncWorkerTest.kt @@ -4,8 +4,8 @@ import android.os.PowerManager import androidx.work.ListenableWorker import com.google.common.truth.Truth.* import com.simprints.infra.authstore.AuthStore +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.ProjectWithConfig -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.enrolment.records.repository.local.migration.RealmToRoomMigrationScheduler import com.simprints.infra.sync.config.testtools.project import com.simprints.infra.sync.config.testtools.projectConfiguration @@ -29,7 +29,7 @@ class ProjectConfigDownSyncWorkerTest { private lateinit var authStore: AuthStore @MockK - private lateinit var configManager: ConfigManager + private lateinit var configRepository: ConfigRepository @MockK private lateinit var handleProjectStateUseCase: HandleProjectStateUseCase @@ -60,7 +60,7 @@ class ProjectConfigDownSyncWorkerTest { }, params = mockk(relaxed = true), authStore = authStore, - configManager = configManager, + configRepository = configRepository, handleProjectState = handleProjectStateUseCase, rescheduleWorkersIfConfigChanged = rescheduleWorkersIfConfigChangedUseCase, resetLocalRecordsIfConfigChanged = resetLocalRecordsIfConfigChangedUseCase, @@ -81,7 +81,7 @@ class ProjectConfigDownSyncWorkerTest { @Test fun `should fail if the config service throws an exception`() = runTest { every { authStore.signedInProjectId } returns PROJECT_ID - coEvery { configManager.refreshProject(PROJECT_ID) } throws Exception() + coEvery { configRepository.refreshProject(PROJECT_ID) } throws Exception() val result = projectConfigDownSyncWorker.doWork() assertThat(result).isEqualTo(ListenableWorker.Result.failure()) @@ -90,7 +90,7 @@ class ProjectConfigDownSyncWorkerTest { @Test fun `should succeed if the config service doesn't throw an exception`() = runTest { every { authStore.signedInProjectId } returns PROJECT_ID - coEvery { configManager.refreshProject(PROJECT_ID) } returns ProjectWithConfig( + coEvery { configRepository.refreshProject(PROJECT_ID) } returns ProjectWithConfig( project, projectConfiguration, ) diff --git a/infra/sync/src/test/java/com/simprints/infra/sync/enrolments/EnrolmentRecordWorkerTest.kt b/infra/sync/src/test/java/com/simprints/infra/sync/enrolments/EnrolmentRecordWorkerTest.kt index 6936f2922c..bb32a37ffa 100644 --- a/infra/sync/src/test/java/com/simprints/infra/sync/enrolments/EnrolmentRecordWorkerTest.kt +++ b/infra/sync/src/test/java/com/simprints/infra/sync/enrolments/EnrolmentRecordWorkerTest.kt @@ -1,57 +1,76 @@ package com.simprints.infra.sync.enrolments import android.os.PowerManager +import androidx.arch.core.executor.testing.InstantTaskExecutorRule import androidx.work.WorkerParameters import androidx.work.workDataOf -import com.google.common.truth.Truth.assertThat +import com.google.common.truth.Truth.* +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.DeviceConfiguration -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.enrolment.records.repository.EnrolmentRecordRepository import com.simprints.infra.sync.SyncConstants -import io.mockk.coEvery -import io.mockk.coVerify -import io.mockk.every -import io.mockk.mockk -import io.mockk.slot -import kotlinx.coroutines.test.UnconfinedTestDispatcher +import com.simprints.testtools.common.coroutines.TestCoroutineRule +import io.mockk.* +import io.mockk.impl.annotations.MockK import kotlinx.coroutines.test.runTest +import org.junit.Before +import org.junit.Rule import org.junit.Test class EnrolmentRecordWorkerTest { - companion object { - private const val INSTRUCTION_ID = "id" - private const val SUBJECT_ID = "subjectId" - } + @get:Rule + val rule = InstantTaskExecutorRule() + + @get:Rule + val testCoroutineRule = TestCoroutineRule() + + @MockK + private lateinit var recordRepository: EnrolmentRecordRepository + + @MockK + private lateinit var configRepository: ConfigRepository + + @MockK + private lateinit var params: WorkerParameters + + private lateinit var worker: EnrolmentRecordWorker - private val repository = mockk(relaxed = true) - private val configManager = mockk() - private val params = mockk(relaxed = true) { - every { inputData } returns workDataOf( + @Before + fun setUp() { + MockKAnnotations.init(this, relaxed = true) + + every { params.inputData } returns workDataOf( SyncConstants.RECORD_UPLOAD_INPUT_ID_NAME to INSTRUCTION_ID, SyncConstants.RECORD_UPLOAD_INPUT_SUBJECT_IDS_NAME to arrayOf(SUBJECT_ID), ) + + worker = EnrolmentRecordWorker( + mockk(relaxed = true) { + every { getSystemService(any()) } returns mockk { + every { isIgnoringBatteryOptimizations(any()) } returns true + } + }, + params, + recordRepository, + configRepository, + testCoroutineRule.testCoroutineDispatcher, + ) } - private val worker = EnrolmentRecordWorker( - mockk(relaxed = true) { - every { getSystemService(any()) } returns mockk { - every { isIgnoringBatteryOptimizations(any()) } returns true - } - }, - params, - repository, - configManager, - UnconfinedTestDispatcher(), - ) @Test fun `should do work correctly`() = runTest { val updateConfigFn = slot DeviceConfiguration>() - coEvery { configManager.updateDeviceConfiguration(capture(updateConfigFn)) } returns Unit + coEvery { configRepository.updateDeviceConfiguration(capture(updateConfigFn)) } returns Unit worker.doWork() - coVerify(exactly = 1) { repository.uploadRecords(listOf(SUBJECT_ID)) } + coVerify(exactly = 1) { recordRepository.uploadRecords(listOf(SUBJECT_ID)) } val updatedConfig = updateConfigFn.captured(DeviceConfiguration("", listOf(), "")) assertThat(updatedConfig.lastInstructionId).isEqualTo(INSTRUCTION_ID) } + + companion object { + private const val INSTRUCTION_ID = "id" + private const val SUBJECT_ID = "subjectId" + } } diff --git a/infra/sync/src/test/java/com/simprints/infra/sync/firmware/ShouldScheduleFirmwareUpdateUseCaseTest.kt b/infra/sync/src/test/java/com/simprints/infra/sync/firmware/ShouldScheduleFirmwareUpdateUseCaseTest.kt index 4becde798a..c395d7968d 100644 --- a/infra/sync/src/test/java/com/simprints/infra/sync/firmware/ShouldScheduleFirmwareUpdateUseCaseTest.kt +++ b/infra/sync/src/test/java/com/simprints/infra/sync/firmware/ShouldScheduleFirmwareUpdateUseCaseTest.kt @@ -1,8 +1,8 @@ package com.simprints.infra.sync.firmware import com.google.common.truth.Truth.assertThat +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.FingerprintConfiguration -import com.simprints.infra.config.sync.ConfigManager import io.mockk.MockKAnnotations import io.mockk.coEvery import io.mockk.impl.annotations.MockK @@ -12,20 +12,20 @@ import org.junit.Test class ShouldScheduleFirmwareUpdateUseCaseTest { @MockK - private lateinit var configManager: ConfigManager + private lateinit var configRepository: ConfigRepository private lateinit var useCase: ShouldScheduleFirmwareUpdateUseCase @Before fun setup() { MockKAnnotations.init(this, relaxed = true) - useCase = ShouldScheduleFirmwareUpdateUseCase(configManager) + useCase = ShouldScheduleFirmwareUpdateUseCase(configRepository) } @Test fun `should return true if Vero 2 is allowed`() = runTest { coEvery { - configManager.getProjectConfiguration().fingerprint?.allowedScanners + configRepository.getProjectConfiguration().fingerprint?.allowedScanners } returns listOf(FingerprintConfiguration.VeroGeneration.VERO_2) assertThat(useCase()).isTrue() @@ -34,7 +34,7 @@ class ShouldScheduleFirmwareUpdateUseCaseTest { @Test fun `should return false if only Vero 1 is allowed`() = runTest { coEvery { - configManager.getProjectConfiguration().fingerprint?.allowedScanners + configRepository.getProjectConfiguration().fingerprint?.allowedScanners } returns listOf(FingerprintConfiguration.VeroGeneration.VERO_1) assertThat(useCase()).isFalse() @@ -42,7 +42,7 @@ class ShouldScheduleFirmwareUpdateUseCaseTest { @Test fun `should return false if no fingerprint config`() = runTest { - coEvery { configManager.getProjectConfiguration().fingerprint } returns null + coEvery { configRepository.getProjectConfiguration().fingerprint } returns null assertThat(useCase()).isFalse() } From 3db1cfb4076f45c7943f1132c10d35ddf27d1b22 Mon Sep 17 00:00:00 2001 From: Sergejs Luhmirins Date: Wed, 7 Jan 2026 15:21:25 +0200 Subject: [PATCH 3/3] MS-448 Remove config-sync module --- .github/workflows/pr-checks.yml | 1 - face/capture/build.gradle.kts | 1 - feature/client-api/build.gradle.kts | 1 - feature/consent/build.gradle.kts | 1 - feature/dashboard/build.gradle.kts | 1 - feature/enrol-last-biometric/build.gradle.kts | 1 - feature/exit-form/build.gradle.kts | 1 - feature/external-credential/build.gradle.kts | 1 - feature/fetch-subject/build.gradle.kts | 1 - feature/login-check/build.gradle.kts | 1 - feature/matcher/build.gradle.kts | 1 - feature/orchestrator/build.gradle.kts | 1 - feature/select-subject/build.gradle.kts | 1 - feature/setup/build.gradle.kts | 1 - feature/troubleshooting/build.gradle.kts | 1 - fingerprint/capture/build.gradle.kts | 1 - fingerprint/connect/build.gradle.kts | 1 - fingerprint/infra/bio-sdk/build.gradle.kts | 1 - .../image-distortion-config/build.gradle.kts | 1 - fingerprint/infra/scanner/build.gradle.kts | 1 - infra/auth-logic/build.gradle.kts | 1 - infra/config-sync/.gitignore | 1 - infra/config-sync/build.gradle.kts | 15 -- .../config-sync/src/main/AndroidManifest.xml | 4 - .../infra/config/sync/ConfigManager.kt | 95 ------- .../infra/config/sync/ConfigManagerTest.kt | 248 ------------------ infra/event-sync/build.gradle.kts | 1 - infra/images/build.gradle.kts | 1 - infra/matching/build.gradle.kts | 1 - infra/sync/build.gradle.kts | 1 - settings.gradle.kts | 1 - 31 files changed, 389 deletions(-) delete mode 100644 infra/config-sync/.gitignore delete mode 100644 infra/config-sync/build.gradle.kts delete mode 100644 infra/config-sync/src/main/AndroidManifest.xml delete mode 100644 infra/config-sync/src/main/java/com/simprints/infra/config/sync/ConfigManager.kt delete mode 100644 infra/config-sync/src/test/java/com/simprints/infra/config/sync/ConfigManagerTest.kt diff --git a/.github/workflows/pr-checks.yml b/.github/workflows/pr-checks.yml index 73ff2ec7d4..06843b40fb 100644 --- a/.github/workflows/pr-checks.yml +++ b/.github/workflows/pr-checks.yml @@ -35,7 +35,6 @@ jobs: infra:enrolment-records:room-store infra:recent-user-activity infra:config-store - infra:config-sync infra:credential-store infra:sync reportsId: infra1 diff --git a/face/capture/build.gradle.kts b/face/capture/build.gradle.kts index adc4666678..bbb3a84762 100644 --- a/face/capture/build.gradle.kts +++ b/face/capture/build.gradle.kts @@ -20,7 +20,6 @@ dependencies { implementation(project(":infra:orchestrator-data")) implementation(project(":infra:auth-store")) implementation(project(":infra:config-store")) - implementation(project(":infra:config-sync")) implementation(project(":infra:enrolment-records:repository")) implementation(project(":infra:events")) implementation(project(":infra:images")) diff --git a/feature/client-api/build.gradle.kts b/feature/client-api/build.gradle.kts index 55268cde4e..2437efe1f7 100644 --- a/feature/client-api/build.gradle.kts +++ b/feature/client-api/build.gradle.kts @@ -9,7 +9,6 @@ android { dependencies { implementation(project(":infra:config-store")) - implementation(project(":infra:config-sync")) implementation(project(":infra:events")) implementation(project(":infra:enrolment-records:repository")) implementation(project(":infra:orchestrator-data")) diff --git a/feature/consent/build.gradle.kts b/feature/consent/build.gradle.kts index b3237edef4..341d9d9e71 100644 --- a/feature/consent/build.gradle.kts +++ b/feature/consent/build.gradle.kts @@ -9,7 +9,6 @@ android { dependencies { implementation(project(":infra:config-store")) - implementation(project(":infra:config-sync")) implementation(project(":infra:auth-store")) implementation(project(":infra:events")) implementation(project(":feature:exit-form")) diff --git a/feature/dashboard/build.gradle.kts b/feature/dashboard/build.gradle.kts index 0f38c0c887..8d339309ed 100644 --- a/feature/dashboard/build.gradle.kts +++ b/feature/dashboard/build.gradle.kts @@ -11,7 +11,6 @@ dependencies { implementation(project(":infra:events")) implementation(project(":infra:event-sync")) implementation(project(":infra:config-store")) - implementation(project(":infra:config-sync")) implementation(project(":infra:sync")) implementation(project(":infra:enrolment-records:repository")) implementation(project(":infra:images")) diff --git a/feature/enrol-last-biometric/build.gradle.kts b/feature/enrol-last-biometric/build.gradle.kts index c1699c9563..9f7ed25730 100644 --- a/feature/enrol-last-biometric/build.gradle.kts +++ b/feature/enrol-last-biometric/build.gradle.kts @@ -13,7 +13,6 @@ dependencies { implementation(project(":feature:external-credential")) implementation(project(":infra:event-sync")) implementation(project(":infra:config-store")) - implementation(project(":infra:config-sync")) implementation(project(":infra:events")) implementation(project(":infra:enrolment-records:repository")) } diff --git a/feature/exit-form/build.gradle.kts b/feature/exit-form/build.gradle.kts index 840daef715..50325cf6bb 100644 --- a/feature/exit-form/build.gradle.kts +++ b/feature/exit-form/build.gradle.kts @@ -10,5 +10,4 @@ android { dependencies { implementation(project(":infra:events")) implementation(project(":infra:config-store")) - implementation(project(":infra:config-sync")) } diff --git a/feature/external-credential/build.gradle.kts b/feature/external-credential/build.gradle.kts index 9ea9fbf615..5813de238e 100644 --- a/feature/external-credential/build.gradle.kts +++ b/feature/external-credential/build.gradle.kts @@ -9,7 +9,6 @@ android { dependencies { implementation(project(":infra:config-store")) - implementation(project(":infra:config-sync")) implementation(project(":infra:ui-base")) implementation(project(":feature:exit-form")) implementation(project(":infra:enrolment-records:repository")) diff --git a/feature/fetch-subject/build.gradle.kts b/feature/fetch-subject/build.gradle.kts index 1e7a5946c6..91f0523f19 100644 --- a/feature/fetch-subject/build.gradle.kts +++ b/feature/fetch-subject/build.gradle.kts @@ -16,5 +16,4 @@ dependencies { implementation(project(":infra:event-sync")) implementation(project(":infra:events")) implementation(project(":infra:config-store")) - implementation(project(":infra:config-sync")) } diff --git a/feature/login-check/build.gradle.kts b/feature/login-check/build.gradle.kts index aed6bacb2d..eb08f29bca 100644 --- a/feature/login-check/build.gradle.kts +++ b/feature/login-check/build.gradle.kts @@ -12,7 +12,6 @@ dependencies { implementation(project(":infra:orchestrator-data")) implementation(project(":infra:config-store")) - implementation(project(":infra:config-sync")) implementation(project(":infra:sync")) implementation(project(":infra:events")) implementation(project(":infra:event-sync")) diff --git a/feature/matcher/build.gradle.kts b/feature/matcher/build.gradle.kts index 76afd68239..24cdbd4338 100644 --- a/feature/matcher/build.gradle.kts +++ b/feature/matcher/build.gradle.kts @@ -15,5 +15,4 @@ dependencies { implementation(project(":infra:enrolment-records:repository")) implementation(project(":infra:matching")) implementation(project(":infra:config-store")) - implementation(project(":infra:config-sync")) } diff --git a/feature/orchestrator/build.gradle.kts b/feature/orchestrator/build.gradle.kts index 8515c2065c..6fa7345088 100644 --- a/feature/orchestrator/build.gradle.kts +++ b/feature/orchestrator/build.gradle.kts @@ -33,7 +33,6 @@ dependencies { implementation(project(":infra:enrolment-records:repository")) implementation(project(":infra:recent-user-activity")) implementation(project(":infra:config-store")) - implementation(project(":infra:config-sync")) implementation(project(":infra:events")) implementation(project(":infra:event-sync")) implementation(project(":infra:images")) diff --git a/feature/select-subject/build.gradle.kts b/feature/select-subject/build.gradle.kts index b7b9aaaeec..68161a9dcb 100644 --- a/feature/select-subject/build.gradle.kts +++ b/feature/select-subject/build.gradle.kts @@ -11,7 +11,6 @@ dependencies { implementation(project(":infra:events")) implementation(project(":infra:auth-store")) implementation(project(":infra:enrolment-records:repository")) - implementation(project(":infra:config-sync")) implementation(project(":infra:config-store")) implementation(project(":feature:external-credential")) } diff --git a/feature/setup/build.gradle.kts b/feature/setup/build.gradle.kts index 3de97bb7ca..6021bb64db 100644 --- a/feature/setup/build.gradle.kts +++ b/feature/setup/build.gradle.kts @@ -10,7 +10,6 @@ android { dependencies { implementation(project(":infra:events")) implementation(project(":infra:config-store")) - implementation(project(":infra:config-sync")) implementation(project(":infra:license")) implementation(project(":infra:auth-store")) implementation(project(":feature:alert")) diff --git a/feature/troubleshooting/build.gradle.kts b/feature/troubleshooting/build.gradle.kts index e1853a3fb3..944ae47a41 100644 --- a/feature/troubleshooting/build.gradle.kts +++ b/feature/troubleshooting/build.gradle.kts @@ -11,7 +11,6 @@ dependencies { implementation(project(":infra:auth-store")) implementation(project(":infra:events")) implementation(project(":infra:config-store")) - implementation(project(":infra:config-sync")) implementation(project(":infra:license")) implementation(project(":infra:network")) implementation(project(":infra:logging-persistent")) diff --git a/fingerprint/capture/build.gradle.kts b/fingerprint/capture/build.gradle.kts index e67b4ed4bd..9b5de23917 100644 --- a/fingerprint/capture/build.gradle.kts +++ b/fingerprint/capture/build.gradle.kts @@ -21,7 +21,6 @@ dependencies { implementation(project(":infra:enrolment-records:repository")) implementation(project(":fingerprint:infra:scanner")) implementation(project(":infra:config-store")) - implementation(project(":infra:config-sync")) implementation(project(":infra:auth-store")) implementation(project(":infra:images")) implementation(project(":infra:recent-user-activity")) diff --git a/fingerprint/connect/build.gradle.kts b/fingerprint/connect/build.gradle.kts index 40438f40a0..447c41f6ae 100644 --- a/fingerprint/connect/build.gradle.kts +++ b/fingerprint/connect/build.gradle.kts @@ -10,7 +10,6 @@ android { dependencies { implementation(project(":infra:config-store")) - implementation(project(":infra:config-sync")) implementation(project(":infra:events")) implementation(project(":infra:recent-user-activity")) diff --git a/fingerprint/infra/bio-sdk/build.gradle.kts b/fingerprint/infra/bio-sdk/build.gradle.kts index 3e1cc89dd7..9fdbd9305b 100644 --- a/fingerprint/infra/bio-sdk/build.gradle.kts +++ b/fingerprint/infra/bio-sdk/build.gradle.kts @@ -9,7 +9,6 @@ android { dependencies { implementation(project(":fingerprint:infra:scanner")) implementation(project(":infra:config-store")) - implementation(project(":infra:config-sync")) api(project(":fingerprint:infra:base-bio-sdk")) implementation(project(":fingerprint:infra:simprints-bio-sdk")) implementation(project(":fingerprint:infra:nec-bio-sdk")) diff --git a/fingerprint/infra/image-distortion-config/build.gradle.kts b/fingerprint/infra/image-distortion-config/build.gradle.kts index f484aec0cb..7b52d8fa3b 100644 --- a/fingerprint/infra/image-distortion-config/build.gradle.kts +++ b/fingerprint/infra/image-distortion-config/build.gradle.kts @@ -11,7 +11,6 @@ dependencies { implementation(project(":infra:auth-store")) implementation(project(":infra:config-store")) - implementation(project(":infra:config-sync")) // Firebase implementation(libs.firebase.storage) diff --git a/fingerprint/infra/scanner/build.gradle.kts b/fingerprint/infra/scanner/build.gradle.kts index 5edfc86beb..64bd3ed10b 100644 --- a/fingerprint/infra/scanner/build.gradle.kts +++ b/fingerprint/infra/scanner/build.gradle.kts @@ -14,7 +14,6 @@ dependencies { runtimeOnly(libs.jackson.core) implementation(project(":infra:config-store")) - implementation(project(":infra:config-sync")) implementation(project(":infra:auth-store")) implementation(project(":infra:recent-user-activity")) diff --git a/infra/auth-logic/build.gradle.kts b/infra/auth-logic/build.gradle.kts index 20f6f8930c..15ba449ec9 100644 --- a/infra/auth-logic/build.gradle.kts +++ b/infra/auth-logic/build.gradle.kts @@ -11,7 +11,6 @@ dependencies { implementation(project(":infra:auth-store")) implementation(project(":infra:config-store")) - implementation(project(":infra:config-sync")) implementation(project(":infra:events")) implementation(project(":infra:enrolment-records:repository")) diff --git a/infra/config-sync/.gitignore b/infra/config-sync/.gitignore deleted file mode 100644 index 42afabfd2a..0000000000 --- a/infra/config-sync/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/infra/config-sync/build.gradle.kts b/infra/config-sync/build.gradle.kts deleted file mode 100644 index bda60c4a8c..0000000000 --- a/infra/config-sync/build.gradle.kts +++ /dev/null @@ -1,15 +0,0 @@ -plugins { - id("simprints.infra") - id("kotlin-parcelize") -} - -android { - namespace = "com.simprints.infra.config.sync" -} - -dependencies { - - implementation(project(":infra:config-store")) - implementation(project(":infra:enrolment-records:repository")) - implementation(project(":infra:auth-store")) -} diff --git a/infra/config-sync/src/main/AndroidManifest.xml b/infra/config-sync/src/main/AndroidManifest.xml deleted file mode 100644 index e100076157..0000000000 --- a/infra/config-sync/src/main/AndroidManifest.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/infra/config-sync/src/main/java/com/simprints/infra/config/sync/ConfigManager.kt b/infra/config-sync/src/main/java/com/simprints/infra/config/sync/ConfigManager.kt deleted file mode 100644 index da88af22ce..0000000000 --- a/infra/config-sync/src/main/java/com/simprints/infra/config/sync/ConfigManager.kt +++ /dev/null @@ -1,95 +0,0 @@ -package com.simprints.infra.config.sync - -import com.simprints.infra.authstore.AuthStore -import com.simprints.infra.config.store.ConfigRepository -import com.simprints.infra.config.store.models.DeviceConfiguration -import com.simprints.infra.config.store.models.DeviceState -import com.simprints.infra.config.store.models.PrivacyNoticeResult -import com.simprints.infra.config.store.models.Project -import com.simprints.infra.config.store.models.ProjectConfiguration -import com.simprints.infra.config.store.models.ProjectWithConfig -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.asStateFlow -import kotlinx.coroutines.flow.onStart -import javax.inject.Inject -import javax.inject.Singleton - -@Singleton -class ConfigManager @Inject constructor( - private val configRepository: ConfigRepository, - private val authStore: AuthStore, -) { - private val isProjectRefreshingFlow: MutableStateFlow = MutableStateFlow(false) - - suspend fun refreshProject(projectId: String): ProjectWithConfig { - isProjectRefreshingFlow.tryEmit(true) - try { - return configRepository.refreshProject(projectId) - } finally { - isProjectRefreshingFlow.tryEmit(false) - } - } - - suspend fun getProject(): Project? = try { - configRepository.getProject() - } catch (_: NoSuchElementException) { - val projectId = authStore.signedInProjectId - if (projectId.isEmpty()) { - null - } else { - try { - refreshProject(projectId).project - } catch (_: Exception) { - null - } - } - } - - suspend fun getProjectConfiguration(): ProjectConfiguration { - val localConfig = configRepository.getProjectConfiguration() - // If projectId is empty, configuration hasn't been downloaded yet - return if (localConfig.projectId.isEmpty()) { - val signedProjectId = authStore.signedInProjectId.takeUnless { it.isEmpty() } ?: return localConfig - - try { - // Try to refresh it with logged in projectId (if any) - refreshProject(signedProjectId).configuration - } catch (_: Exception) { - // If not logged in the above will fail. However we still depend on the 'default' - // configuration to create the session when login is attempted. Possibly in other - // places, too. - localConfig - } - } else { - localConfig - } - } - - fun observeIsProjectRefreshing(): Flow = isProjectRefreshingFlow.asStateFlow() - - fun observeProjectConfiguration(): Flow = configRepository - .observeProjectConfiguration() - .onStart { getProjectConfiguration() } // to invoke download if empty - - suspend fun getDeviceConfiguration(): DeviceConfiguration = configRepository.getDeviceConfiguration() - - fun observeDeviceConfiguration(): Flow = configRepository - .observeDeviceConfiguration() - .onStart { getDeviceConfiguration() } - - suspend fun updateDeviceConfiguration(update: suspend (t: DeviceConfiguration) -> DeviceConfiguration) = - configRepository.updateDeviceConfiguration(update) - - fun getPrivacyNotice( - projectId: String, - language: String, - ): Flow = configRepository.getPrivacyNotice( - projectId = projectId, - language = language, - ) - - suspend fun clearData() = configRepository.clearData() - - suspend fun getDeviceState(): DeviceState = configRepository.getDeviceState() -} diff --git a/infra/config-sync/src/test/java/com/simprints/infra/config/sync/ConfigManagerTest.kt b/infra/config-sync/src/test/java/com/simprints/infra/config/sync/ConfigManagerTest.kt deleted file mode 100644 index c00ad60dbb..0000000000 --- a/infra/config-sync/src/test/java/com/simprints/infra/config/sync/ConfigManagerTest.kt +++ /dev/null @@ -1,248 +0,0 @@ -package com.simprints.infra.config.sync - -import com.google.common.truth.Truth.* -import com.simprints.infra.authstore.AuthStore -import com.simprints.infra.config.store.ConfigRepository -import com.simprints.infra.config.store.models.DeviceConfiguration -import com.simprints.infra.config.store.models.Project -import com.simprints.infra.config.store.models.ProjectConfiguration -import com.simprints.infra.config.store.models.ProjectWithConfig -import io.mockk.* -import io.mockk.impl.annotations.MockK -import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.delay -import kotlinx.coroutines.flow.first -import kotlinx.coroutines.flow.flow -import kotlinx.coroutines.flow.toList -import kotlinx.coroutines.launch -import kotlinx.coroutines.test.advanceTimeBy -import kotlinx.coroutines.test.runTest -import org.junit.Before -import org.junit.Test - -class ConfigManagerTest { - companion object { - private const val PROJECT_ID = "projectId" - private const val LANGUAGE = "fr" - } - - private lateinit var configManager: ConfigManager - - @MockK - private lateinit var configRepository: ConfigRepository - - @MockK - private lateinit var authStore: AuthStore - - @MockK - private lateinit var projectWithConfig: ProjectWithConfig - - @MockK - private lateinit var projectConfiguration: ProjectConfiguration - - @MockK - private lateinit var deviceConfiguration: DeviceConfiguration - - @MockK - private lateinit var project: Project - - @Before - fun setup() { - MockKAnnotations.init(this, relaxed = true) - configManager = ConfigManager( - configRepository = configRepository, - authStore = authStore, - ) - } - - @Test - fun `refreshProject should call the correct method`() = runTest { - coEvery { configRepository.refreshProject(PROJECT_ID) } returns projectWithConfig - - val refreshedProject = configManager.refreshProject(PROJECT_ID) - assertThat(refreshedProject).isEqualTo(projectWithConfig) - } - - @Test - fun `getProject should call the correct method`() = runTest { - coEvery { configRepository.getProject() } returns project - - val gottenProject = configManager.getProject() - assertThat(gottenProject).isEqualTo(project) - } - - @Test - fun `getProject should call the refresh method when cannot get from local`() = runTest { - every { authStore.signedInProjectId } returns PROJECT_ID - coEvery { configRepository.getProject() } throws NoSuchElementException() - - configManager.getProject() - coVerify(exactly = 1) { configRepository.refreshProject(PROJECT_ID) } - } - - @Test - fun `getProject should returns null when refresh fails`() = runTest { - every { authStore.signedInProjectId } returns "" - coEvery { configRepository.getProject() } throws NoSuchElementException() - coEvery { configRepository.refreshProject(any()) } throws NoSuchElementException() - - assertThat(configManager.getProject()).isNull() - } - - @Test - fun `getProjectConfiguration should call the correct method`() = runTest { - coEvery { configRepository.getProjectConfiguration() } returns projectConfiguration - every { projectConfiguration.projectId } returns PROJECT_ID - - val gottenProjectConfiguration = configManager.getProjectConfiguration() - assertThat(gottenProjectConfiguration).isEqualTo(projectConfiguration) - } - - @Test - fun `getProjectConfiguration return default config if not logged in`() = runTest { - every { projectConfiguration.projectId } returns "" - every { authStore.signedInProjectId } returns "" - coEvery { configRepository.getProjectConfiguration() } returns projectConfiguration - - val gottenProjectConfiguration = configManager.getProjectConfiguration() - assertThat(gottenProjectConfiguration).isEqualTo(projectConfiguration) - } - - @Test - fun `getProjectConfiguration return default config refresh fails`() = runTest { - every { projectConfiguration.projectId } returns "" - every { authStore.signedInProjectId } returns "projectId" - coEvery { configRepository.getProjectConfiguration() } returns projectConfiguration - coEvery { configRepository.refreshProject(any()) } throws Exception() - - val gottenProjectConfiguration = configManager.getProjectConfiguration() - assertThat(gottenProjectConfiguration).isEqualTo(projectConfiguration) - } - - @Test - fun `refreshProjectConfiguration should call the correct method`() = runTest { - coEvery { configRepository.refreshProject(PROJECT_ID) } returns projectWithConfig - - val refreshedProjectConfiguration = configManager.refreshProject(PROJECT_ID) - assertThat(refreshedProjectConfiguration).isEqualTo(projectWithConfig) - } - - @Test - fun `getDeviceConfiguration should call the correct method`() = runTest { - coEvery { configRepository.getDeviceConfiguration() } returns deviceConfiguration - - val gottenDeviceConfiguration = configManager.getDeviceConfiguration() - assertThat(gottenDeviceConfiguration).isEqualTo(deviceConfiguration) - } - - @Test - fun `updateDeviceConfiguration should call the correct method`() = runTest { - val update: (c: DeviceConfiguration) -> DeviceConfiguration = { - it - } - - configManager.updateDeviceConfiguration(update) - coVerify(exactly = 1) { configRepository.updateDeviceConfiguration(update) } - } - - @Test - fun `clearData should call the correct method`() = runTest { - configManager.clearData() - coVerify(exactly = 1) { configRepository.clearData() } - } - - @Test - fun `getPrivacyNotice should call the correct method`() = runTest { - configManager.getPrivacyNotice(PROJECT_ID, LANGUAGE) - coVerify(exactly = 1) { configRepository.getPrivacyNotice(PROJECT_ID, LANGUAGE) } - } - - @Test - fun `observeProjectConfiguration should emit values from the local data source`() = runTest { - val config1 = projectConfiguration.copy(projectId = "project1") - val config2 = projectConfiguration.copy(projectId = "project2") - - coEvery { configRepository.observeProjectConfiguration() } returns flow { - emit(config1) - emit(config2) - } - - val emittedConfigs = configManager.observeProjectConfiguration().toList() - - assertThat(emittedConfigs).hasSize(2) - assertThat(emittedConfigs[0]).isEqualTo(config1) - assertThat(emittedConfigs[1]).isEqualTo(config2) - } - - @Test - fun `observeProjectConfiguration should call getProjectConfiguration on start to invoke download if config empty`() = runTest { - coEvery { configRepository.observeProjectConfiguration() } returns flow { - emit(projectConfiguration) - } - - val emittedConfigs = configManager.observeProjectConfiguration().toList() - - coVerify(exactly = 1) { configRepository.getProjectConfiguration() } - - assertThat(emittedConfigs).hasSize(1) - assertThat(emittedConfigs[0]).isEqualTo(projectConfiguration) - } - - @Test - fun `observeIsProjectRefreshing should initially emit false`() = runTest { - val isRefreshing = configManager.observeIsProjectRefreshing().first() - assertThat(isRefreshing).isFalse() - } - - @Test - fun `observeIsProjectRefreshing should emit false after refreshProject completes`() = runTest { - coEvery { configRepository.refreshProject(PROJECT_ID) } returns projectWithConfig - configManager.refreshProject(PROJECT_ID) - - val isRefreshing = configManager.observeIsProjectRefreshing().first() - - assertThat(isRefreshing).isFalse() - } - - @OptIn(ExperimentalCoroutinesApi::class) - @Test - fun `observeIsProjectRefreshing should emit true during refreshProject and false when done`() = runTest { - coEvery { configRepository.refreshProject(PROJECT_ID) } coAnswers { - delay(1000) - projectWithConfig - } - - assertThat(configManager.observeIsProjectRefreshing().first()).isFalse() // before - - launch { configManager.refreshProject(PROJECT_ID) } - advanceTimeBy(500) - - assertThat(configManager.observeIsProjectRefreshing().first()).isTrue() // during - - advanceTimeBy(1000) - - assertThat(configManager.observeIsProjectRefreshing().first()).isFalse() // after - } - - @OptIn(ExperimentalCoroutinesApi::class) - @Test - fun `observeIsProjectRefreshing should emit false even when refreshProject fails`() = runTest { - coEvery { configRepository.refreshProject(PROJECT_ID) } coAnswers { - delay(500) - throw Exception("Test exception") - } - - assertThat(configManager.observeIsProjectRefreshing().first()).isFalse() // before - - launch { - try { - configManager.refreshProject(PROJECT_ID) - } catch (_: Exception) { - // Expected - } - } - advanceTimeBy(1000) - - assertThat(configManager.observeIsProjectRefreshing().first()).isFalse() // after failure - } -} diff --git a/infra/event-sync/build.gradle.kts b/infra/event-sync/build.gradle.kts index 6dd070304e..a619786ee5 100644 --- a/infra/event-sync/build.gradle.kts +++ b/infra/event-sync/build.gradle.kts @@ -28,7 +28,6 @@ dependencies { implementation(project(":infra:images")) implementation(project(":infra:events")) implementation(project(":infra:config-store")) - implementation(project(":infra:config-sync")) implementation(project(":infra:auth-store")) implementation(project(":infra:enrolment-records:repository")) implementation(project(":infra:recent-user-activity")) diff --git a/infra/images/build.gradle.kts b/infra/images/build.gradle.kts index 136dd7b163..1558c001e8 100644 --- a/infra/images/build.gradle.kts +++ b/infra/images/build.gradle.kts @@ -12,7 +12,6 @@ android { dependencies { implementation(project(":infra:auth-store")) implementation(project(":infra:config-store")) - implementation(project(":infra:config-sync")) implementation(project(":infra:events")) // Firebase diff --git a/infra/matching/build.gradle.kts b/infra/matching/build.gradle.kts index 6d93bcfa4c..e2e7a27818 100644 --- a/infra/matching/build.gradle.kts +++ b/infra/matching/build.gradle.kts @@ -12,7 +12,6 @@ dependencies { implementation(project(":infra:enrolment-records:repository")) implementation(project(":infra:events")) implementation(project(":infra:config-store")) - implementation(project(":infra:config-sync")) implementation(project(":face:infra:bio-sdk-resolver")) diff --git a/infra/sync/build.gradle.kts b/infra/sync/build.gradle.kts index 1e3c347ab3..a5e236bbe2 100644 --- a/infra/sync/build.gradle.kts +++ b/infra/sync/build.gradle.kts @@ -34,7 +34,6 @@ dependencies { implementation(project(":infra:auth-store")) implementation(project(":infra:auth-logic")) implementation(project(":infra:config-store")) - implementation(project(":infra:config-sync")) implementation(project(":infra:enrolment-records:repository")) implementation(project(":infra:events")) implementation(project(":infra:event-sync")) diff --git a/settings.gradle.kts b/settings.gradle.kts index 278048100f..bbf703f746 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -131,7 +131,6 @@ include( ":infra:test-tools", ":infra:events", ":infra:config-store", - ":infra:config-sync", ":infra:credential-store", ":infra:enrolment-records:repository", ":infra:enrolment-records:realm-store",