Merge pull request #43 from garfiec/fix/stop-double-logout

fix(settings): stop double-invoking authRepository.logout on logout/delete
This commit is contained in:
Garfie Chiu 2026-04-15 01:59:57 -05:00 committed by GitHub
commit 47b3cb1e96
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 6 additions and 17 deletions

View file

@ -23,7 +23,6 @@ import com.garfiec.librechat.feature.settings.util.PlatformCacheCleaner
import com.garfiec.librechat.feature.settings.viewmodel.delegate.SpeechSettingsContract import com.garfiec.librechat.feature.settings.viewmodel.delegate.SpeechSettingsContract
import com.garfiec.librechat.feature.settings.viewmodel.delegate.SpeechSettingsFactory import com.garfiec.librechat.feature.settings.viewmodel.delegate.SpeechSettingsFactory
import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat
import io.mockk.Ordering
import io.mockk.coEvery import io.mockk.coEvery
import io.mockk.coVerify import io.mockk.coVerify
import io.mockk.every import io.mockk.every
@ -158,23 +157,20 @@ class SettingsViewModelTest {
} }
@Test @Test
fun `logout calls authRepository and sets isLoggedOut`() = runTest { fun `logout sets isLoggedOut flag without calling authRepository`() = runTest {
coEvery { authRepository.logout() } returns Result.Success(Unit)
viewModel = createViewModel() viewModel = createViewModel()
advanceUntilIdle() advanceUntilIdle()
viewModel.logout() viewModel.logout()
advanceUntilIdle() advanceUntilIdle()
coVerify { authRepository.logout() } coVerify(exactly = 0) { authRepository.logout() }
assertThat(viewModel.uiState.value.isLoggedOut).isTrue() assertThat(viewModel.uiState.value.isLoggedOut).isTrue()
} }
@Test @Test
fun `deleteAccount calls userRepository then authRepository`() = runTest { fun `deleteAccount calls userRepository and sets isAccountDeleted without calling authRepository`() = runTest {
coEvery { userRepository.deleteUser() } returns Result.Success(Unit) coEvery { userRepository.deleteUser() } returns Result.Success(Unit)
coEvery { authRepository.logout() } returns Result.Success(Unit)
viewModel = createViewModel() viewModel = createViewModel()
advanceUntilIdle() advanceUntilIdle()
@ -182,10 +178,8 @@ class SettingsViewModelTest {
viewModel.deleteAccount() viewModel.deleteAccount()
advanceUntilIdle() advanceUntilIdle()
coVerify(ordering = Ordering.ORDERED) { coVerify { userRepository.deleteUser() }
userRepository.deleteUser() coVerify(exactly = 0) { authRepository.logout() }
authRepository.logout()
}
assertThat(viewModel.uiState.value.isAccountDeleted).isTrue() assertThat(viewModel.uiState.value.isAccountDeleted).isTrue()
} }

View file

@ -585,11 +585,7 @@ class SettingsViewModel(
// ── Auth actions ─────────────────────────────────────────────── // ── Auth actions ───────────────────────────────────────────────
fun logout() { fun logout() {
viewModelScope.launch { _uiState.update { it.copy(isLoggedOut = true) }
_uiState.update { it.copy(isLoading = true) }
authRepository.logout()
_uiState.update { it.copy(isLoading = false, isLoggedOut = true) }
}
} }
fun deleteAccount(token: String? = null, backupCode: String? = null) { fun deleteAccount(token: String? = null, backupCode: String? = null) {
@ -597,7 +593,6 @@ class SettingsViewModel(
_uiState.update { it.copy(isLoading = true) } _uiState.update { it.copy(isLoading = true) }
when (val result = userRepository.deleteUser(token = token, backupCode = backupCode)) { when (val result = userRepository.deleteUser(token = token, backupCode = backupCode)) {
is Result.Success -> { is Result.Success -> {
authRepository.logout()
_uiState.update { it.copy(isLoading = false, isAccountDeleted = true, showDeleteAccountOtpDialog = false) } _uiState.update { it.copy(isLoading = false, isAccountDeleted = true, showDeleteAccountOtpDialog = false) }
} }
is Result.Error -> { is Result.Error -> {