From 9442c873cabeff8392a96125e7d4900aa7f8faec Mon Sep 17 00:00:00 2001 From: Sergejs Luhmirins Date: Wed, 16 Jul 2025 17:25:40 +0300 Subject: [PATCH] Do not keep sessions if project is paused or ended --- .../DeleteSessionEventsIfNeededUseCase.kt | 8 +- .../DeleteSessionEventsIfNeededUseCaseTest.kt | 74 ++++++++++++++++--- 2 files changed, 72 insertions(+), 10 deletions(-) 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 e5696198a1..ee652f0917 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,6 +1,8 @@ package com.simprints.feature.clientapi.usecases import com.simprints.core.SessionCoroutineScope +import com.simprints.infra.authstore.AuthStore +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 @@ -9,12 +11,16 @@ import kotlinx.coroutines.launch import javax.inject.Inject internal class DeleteSessionEventsIfNeededUseCase @Inject constructor( + private val authStore: AuthStore, private val configManager: ConfigManager, private val eventRepository: EventRepository, @SessionCoroutineScope private val sessionCoroutineScope: CoroutineScope, ) { operator fun invoke(sessionId: String) = sessionCoroutineScope.launch { - if (!configManager.getProjectConfiguration().canSyncDataToSimprints()) { + val projectNotRunning = configManager.getProject(authStore.signedInProjectId).state != ProjectState.RUNNING + val simprintsDataSyncDisabled = !configManager.getProjectConfiguration().canSyncDataToSimprints() + + if (simprintsDataSyncDisabled || projectNotRunning) { eventRepository.deleteEventScope(sessionId) } } 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 e4ac6b227a..7084a1a931 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,5 +1,7 @@ package com.simprints.feature.clientapi.usecases +import com.simprints.infra.authstore.AuthStore +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 @@ -7,8 +9,8 @@ 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.impl.annotations.MockK -import io.mockk.mockk import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.test.runTest import org.junit.Before @@ -19,6 +21,9 @@ class DeleteSessionEventsIfNeededUseCaseTest { @get:Rule val testCoroutineRule = TestCoroutineRule() + @MockK + private lateinit var authStore: AuthStore + @MockK private lateinit var configManager: ConfigManager @@ -31,7 +36,10 @@ class DeleteSessionEventsIfNeededUseCaseTest { fun setUp() { MockKAnnotations.init(this, relaxed = true) + every { authStore.signedInProjectId } returns "projectId" + deleteUseCase = DeleteSessionEventsIfNeededUseCase( + authStore, configManager, eventRepository, CoroutineScope(testCoroutineRule.testCoroutineDispatcher), @@ -39,10 +47,55 @@ class DeleteSessionEventsIfNeededUseCaseTest { } @Test - fun `deletes session events if data sync disabled`() = runTest { - coEvery { configManager.getProjectConfiguration() } returns mockk { - coEvery { synchronization.up.simprints.kind } returns UpSynchronizationConfiguration.UpSynchronizationKind.NONE - } + fun `deletes session events if project paused`() = runTest { + coEvery { configManager.getProject(any()).state } returns ProjectState.PROJECT_PAUSED + coEvery { + configManager + .getProjectConfiguration() + .synchronization.up.simprints.kind + } returns UpSynchronizationConfiguration.UpSynchronizationKind.ALL + + deleteUseCase("sessionId") + + coVerify { eventRepository.deleteEventScope("sessionId") } + } + + @Test + fun `deletes session events if project ending`() = runTest { + coEvery { configManager.getProject(any()).state } returns ProjectState.PROJECT_ENDING + coEvery { + configManager + .getProjectConfiguration() + .synchronization.up.simprints.kind + } returns UpSynchronizationConfiguration.UpSynchronizationKind.ALL + + deleteUseCase("sessionId") + + coVerify { eventRepository.deleteEventScope("sessionId") } + } + + @Test + fun `deletes session events if project ended`() = runTest { + coEvery { configManager.getProject(any()).state } returns ProjectState.PROJECT_ENDED + coEvery { + configManager + .getProjectConfiguration() + .synchronization.up.simprints.kind + } returns UpSynchronizationConfiguration.UpSynchronizationKind.ALL + + deleteUseCase("sessionId") + + coVerify { eventRepository.deleteEventScope("sessionId") } + } + + @Test + fun `deletes session events if data sync disabled in running project`() = runTest { + coEvery { configManager.getProject(any()).state } returns ProjectState.RUNNING + coEvery { + configManager + .getProjectConfiguration() + .synchronization.up.simprints.kind + } returns UpSynchronizationConfiguration.UpSynchronizationKind.NONE deleteUseCase("sessionId") @@ -50,10 +103,13 @@ class DeleteSessionEventsIfNeededUseCaseTest { } @Test - fun `does not delete session events if data sync enabled`() = runTest { - coEvery { configManager.getProjectConfiguration() } returns mockk { - coEvery { synchronization.up.simprints.kind } returns UpSynchronizationConfiguration.UpSynchronizationKind.ALL - } + fun `does not delete session events if data sync enabled in running project`() = runTest { + coEvery { configManager.getProject(any()).state } returns ProjectState.RUNNING + coEvery { + configManager + .getProjectConfiguration() + .synchronization.up.simprints.kind + } returns UpSynchronizationConfiguration.UpSynchronizationKind.ALL deleteUseCase("sessionId")