Fix nullability bug in combineDataStates (#857)

This commit is contained in:
David Perez 2024-01-29 17:15:43 -06:00 committed by Álison Fernandes
parent d12776483d
commit 79988db49a
4 changed files with 38 additions and 11 deletions

View file

@ -96,16 +96,14 @@ fun <T1, T2, R> combineDataStates(
// Pending state for everything while any one piece of data is updating.
dataState1 is DataState.Pending || dataState2 is DataState.Pending -> {
DataState.Pending(
transform(requireNotNull(dataState1.data), requireNotNull(dataState2.data)),
)
@Suppress("UNCHECKED_CAST")
DataState.Pending(transform(dataState1.data as T1, dataState2.data as T2))
}
// Both states are Loaded and have data
else -> {
DataState.Loaded(
transform(requireNotNull(dataState1.data), requireNotNull(dataState2.data)),
)
@Suppress("UNCHECKED_CAST")
DataState.Loaded(transform(dataState1.data as T1, dataState2.data as T2))
}
}
}

View file

@ -437,11 +437,10 @@ class VaultRepositoryImpl(
cipher = cipher,
)
.map { totpCodeDataState ->
val totpCodeData = totpCodeDataState.data
combineDataStates(
totpCodeDataState.map { Unit },
totpCodeDataState,
cipherDataState,
) { _, _ ->
) { totpCodeData, _ ->
// Just return the verification items; we are only combining the
// DataStates to know the overall state.
totpCodeData

View file

@ -12,7 +12,6 @@ import com.x8bit.bitwarden.data.auth.repository.model.ValidatePasswordResult
import com.x8bit.bitwarden.data.platform.manager.clipboard.BitwardenClipboardManager
import com.x8bit.bitwarden.data.platform.repository.model.DataState
import com.x8bit.bitwarden.data.platform.repository.util.combineDataStates
import com.x8bit.bitwarden.data.platform.repository.util.map
import com.x8bit.bitwarden.data.vault.repository.VaultRepository
import com.x8bit.bitwarden.data.vault.repository.model.DeleteCipherResult
import com.x8bit.bitwarden.data.vault.repository.model.RestoreCipherResult
@ -76,7 +75,7 @@ class VaultItemViewModel @Inject constructor(
userState = userState,
vaultDataState = combineDataStates(
cipherViewState,
authCodeState.map { Unit },
authCodeState,
) { vaultData, _ ->
VaultItemStateData(
cipher = vaultData,

View file

@ -234,6 +234,22 @@ class DataStateExtensionsTest {
assertEquals(DataState.Pending("data" to 5), result)
}
@Suppress("MaxLineLength")
@Test
fun `combineDataStates should return Pending when both dataStates are Pending with null data`() {
val dataState1: DataState<String?> = DataState.Pending(null)
val dataState2: DataState<Int?> = DataState.Pending(null)
val result = combineDataStates(
dataState1 = dataState1,
dataState2 = dataState2,
) { data1, data2 ->
data1 to data2
}
assertEquals(DataState.Pending<Pair<String?, Int?>>(null to null), result)
}
@Test
fun `combineDataStates should return Loaded when the both dataStates are Loaded`() {
val dataState1 = DataState.Loaded("data")
@ -248,4 +264,19 @@ class DataStateExtensionsTest {
assertEquals(DataState.Loaded("data" to 5), result)
}
@Test
fun `combineDataStates should return Loaded when both dataStates are Loaded with null data`() {
val dataState1: DataState<String?> = DataState.Loaded(null)
val dataState2: DataState<Int?> = DataState.Loaded(null)
val result = combineDataStates(
dataState1 = dataState1,
dataState2 = dataState2,
) { data1, data2 ->
data1 to data2
}
assertEquals(DataState.Loaded<Pair<String?, Int?>>(null to null), result)
}
}