summaryrefslogtreecommitdiffhomepage
path: root/android/app/src/test
diff options
context:
space:
mode:
authorDavid Göransson <david.goransson@mullvad.net>2024-12-20 07:04:56 +0100
committerJonatan Rhodin <jonatan.rhodin@mullvad.net>2024-12-20 14:23:05 +0100
commit99bd27986089de8dd05b839d2b8361cae8aefcda (patch)
tree1fa7ab88903fe748d1c218cd0bda5bf23d4265b2 /android/app/src/test
parent92465444d8a51b73fe225461e459449d9ab6e600 (diff)
downloadmullvadvpn-99bd27986089de8dd05b839d2b8361cae8aefcda.tar.xz
mullvadvpn-99bd27986089de8dd05b839d2b8361cae8aefcda.zip
Remove one-to-one relationship between provider and ownership
Diffstat (limited to 'android/app/src/test')
-rw-r--r--android/app/src/test/kotlin/net/mullvad/mullvadvpn/usecase/FilterChipUseCaseTest.kt48
-rw-r--r--android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/CustomListLocationsViewModelTest.kt11
-rw-r--r--android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/FilterViewModelTest.kt85
3 files changed, 89 insertions, 55 deletions
diff --git a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/usecase/FilterChipUseCaseTest.kt b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/usecase/FilterChipUseCaseTest.kt
index 221d89cf40..bd1a759b77 100644
--- a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/usecase/FilterChipUseCaseTest.kt
+++ b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/usecase/FilterChipUseCaseTest.kt
@@ -9,7 +9,6 @@ import net.mullvad.mullvadvpn.compose.state.RelayListType
import net.mullvad.mullvadvpn.lib.common.test.assertLists
import net.mullvad.mullvadvpn.lib.model.Constraint
import net.mullvad.mullvadvpn.lib.model.Ownership
-import net.mullvad.mullvadvpn.lib.model.Provider
import net.mullvad.mullvadvpn.lib.model.ProviderId
import net.mullvad.mullvadvpn.lib.model.Providers
import net.mullvad.mullvadvpn.lib.model.Settings
@@ -23,13 +22,13 @@ import org.junit.jupiter.api.Test
class FilterChipUseCaseTest {
private val mockRelayListFilterRepository: RelayListFilterRepository = mockk()
- private val mockAvailableProvidersUseCase: AvailableProvidersUseCase = mockk()
+ private val mockProviderToOwnershipsUseCase: ProviderToOwnershipsUseCase = mockk()
private val mockSettingRepository: SettingsRepository = mockk()
private val mockWireguardConstraintsRepository: WireguardConstraintsRepository = mockk()
private val selectedOwnership = MutableStateFlow<Constraint<Ownership>>(Constraint.Any)
private val selectedProviders = MutableStateFlow<Constraint<Providers>>(Constraint.Any)
- private val availableProviders = MutableStateFlow<List<Provider>>(emptyList())
+ private val providerToOwnerships = MutableStateFlow<Map<ProviderId, Set<Ownership>>>(emptyMap())
private val settings = MutableStateFlow<Settings>(mockk(relaxed = true))
private val wireguardConstraints = MutableStateFlow<WireguardConstraints>(mockk(relaxed = true))
@@ -39,7 +38,7 @@ class FilterChipUseCaseTest {
fun setUp() {
every { mockRelayListFilterRepository.selectedOwnership } returns selectedOwnership
every { mockRelayListFilterRepository.selectedProviders } returns selectedProviders
- every { mockAvailableProvidersUseCase() } returns availableProviders
+ every { mockProviderToOwnershipsUseCase() } returns providerToOwnerships
every { mockSettingRepository.settingsUpdates } returns settings
every { mockWireguardConstraintsRepository.wireguardConstraints } returns
wireguardConstraints
@@ -47,7 +46,7 @@ class FilterChipUseCaseTest {
filterChipUseCase =
FilterChipUseCase(
relayListFilterRepository = mockRelayListFilterRepository,
- availableProvidersUseCase = mockAvailableProvidersUseCase,
+ providerToOwnershipsUseCase = mockProviderToOwnershipsUseCase,
settingsRepository = mockSettingRepository,
wireguardConstraintsRepository = mockWireguardConstraintsRepository,
)
@@ -74,10 +73,10 @@ class FilterChipUseCaseTest {
// Arrange
val expectedProviders = Providers(providers = setOf(ProviderId("1"), ProviderId("2")))
selectedProviders.value = Constraint.Only(expectedProviders)
- availableProviders.value =
- listOf(
- Provider(ProviderId("1"), Ownership.MullvadOwned),
- Provider(ProviderId("2"), Ownership.Rented),
+ providerToOwnerships.value =
+ mapOf(
+ ProviderId("1") to setOf(Ownership.MullvadOwned),
+ ProviderId("2") to setOf(Ownership.Rented),
)
filterChipUseCase(RelayListType.EXIT).test {
@@ -93,10 +92,10 @@ class FilterChipUseCaseTest {
val expectedOwnership = Ownership.MullvadOwned
selectedProviders.value = Constraint.Only(expectedProviders)
selectedOwnership.value = Constraint.Only(expectedOwnership)
- availableProviders.value =
- listOf(
- Provider(ProviderId("1"), Ownership.MullvadOwned),
- Provider(ProviderId("2"), Ownership.Rented),
+ providerToOwnerships.value =
+ mapOf(
+ ProviderId("1") to setOf(Ownership.MullvadOwned),
+ ProviderId("2") to setOf(Ownership.Rented),
)
filterChipUseCase(RelayListType.EXIT).test {
@@ -185,4 +184,27 @@ class FilterChipUseCaseTest {
filterChipUseCase(RelayListType.EXIT).test { assertLists(emptyList(), awaitItem()) }
}
+
+ @Test
+ fun `ensure that a selected provider that is not in the provider list is still counted`() =
+ runTest {
+ // Arrange
+ val expectedProviders = Providers(providers = setOf(ProviderId("1")))
+ val expectedOwnership = Ownership.MullvadOwned
+ selectedProviders.value = Constraint.Only(expectedProviders)
+ selectedOwnership.value = Constraint.Only(expectedOwnership)
+ providerToOwnerships.value =
+ mapOf(
+ ProviderId("2") to setOf(Ownership.MullvadOwned),
+ ProviderId("3") to setOf(Ownership.Rented),
+ )
+
+ // Act, Assert
+ filterChipUseCase(RelayListType.EXIT).test {
+ assertLists(
+ listOf(FilterChip.Ownership(expectedOwnership), FilterChip.Provider(1)),
+ awaitItem(),
+ )
+ }
+ }
}
diff --git a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/CustomListLocationsViewModelTest.kt b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/CustomListLocationsViewModelTest.kt
index 75b8deca8f..865b4ce471 100644
--- a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/CustomListLocationsViewModelTest.kt
+++ b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/CustomListLocationsViewModelTest.kt
@@ -22,7 +22,6 @@ import net.mullvad.mullvadvpn.lib.model.CustomListId
import net.mullvad.mullvadvpn.lib.model.CustomListName
import net.mullvad.mullvadvpn.lib.model.GeoLocationId
import net.mullvad.mullvadvpn.lib.model.Ownership
-import net.mullvad.mullvadvpn.lib.model.Provider
import net.mullvad.mullvadvpn.lib.model.ProviderId
import net.mullvad.mullvadvpn.lib.model.RelayItem
import net.mullvad.mullvadvpn.relaylist.descendants
@@ -357,11 +356,8 @@ class CustomListLocationsViewModelTest {
"gbg-1",
),
active = true,
- provider =
- Provider(
- ProviderId("Provider"),
- ownership = Ownership.MullvadOwned,
- ),
+ provider = ProviderId("Provider"),
+ ownership = Ownership.MullvadOwned,
daita = false,
)
),
@@ -377,7 +373,8 @@ class CustomListLocationsViewModelTest {
"cph-1",
),
active = true,
- provider = Provider(ProviderId("Provider"), ownership = Ownership.MullvadOwned),
+ provider = ProviderId("Provider"),
+ ownership = Ownership.MullvadOwned,
daita = false,
)
}
diff --git a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/FilterViewModelTest.kt b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/FilterViewModelTest.kt
index 4453f08ee4..49b9b4baff 100644
--- a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/FilterViewModelTest.kt
+++ b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/FilterViewModelTest.kt
@@ -19,11 +19,10 @@ import net.mullvad.mullvadvpn.lib.common.test.TestCoroutineRule
import net.mullvad.mullvadvpn.lib.common.test.assertLists
import net.mullvad.mullvadvpn.lib.model.Constraint
import net.mullvad.mullvadvpn.lib.model.Ownership
-import net.mullvad.mullvadvpn.lib.model.Provider
import net.mullvad.mullvadvpn.lib.model.ProviderId
import net.mullvad.mullvadvpn.lib.model.Providers
import net.mullvad.mullvadvpn.repository.RelayListFilterRepository
-import net.mullvad.mullvadvpn.usecase.AvailableProvidersUseCase
+import net.mullvad.mullvadvpn.usecase.ProviderToOwnershipsUseCase
import org.junit.jupiter.api.AfterEach
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
@@ -31,49 +30,43 @@ import org.junit.jupiter.api.extension.ExtendWith
@ExtendWith(TestCoroutineRule::class)
class FilterViewModelTest {
- private val mockAvailableProvidersUseCase: AvailableProvidersUseCase = mockk(relaxed = true)
+ private val mockProvidersOwnershipUseCase: ProviderToOwnershipsUseCase = mockk(relaxed = true)
private val mockRelayListFilterRepository: RelayListFilterRepository = mockk()
private lateinit var viewModel: FilterViewModel
private val selectedOwnership =
MutableStateFlow<Constraint<Ownership>>(Constraint.Only(Ownership.MullvadOwned))
private val dummyListOfAllProviders =
- listOf(
- Provider(ProviderId("31173"), Ownership.MullvadOwned),
- Provider(ProviderId("100TB"), Ownership.Rented),
- Provider(ProviderId("Blix"), Ownership.MullvadOwned),
- Provider(ProviderId("Creanova"), Ownership.MullvadOwned),
- Provider(ProviderId("DataPacket"), Ownership.Rented),
- Provider(ProviderId("HostRoyale"), Ownership.Rented),
- Provider(ProviderId("hostuniversal"), Ownership.Rented),
- Provider(ProviderId("iRegister"), Ownership.Rented),
- Provider(ProviderId("M247"), Ownership.Rented),
- Provider(ProviderId("Makonix"), Ownership.Rented),
- Provider(ProviderId("PrivateLayer"), Ownership.Rented),
- Provider(ProviderId("ptisp"), Ownership.Rented),
- Provider(ProviderId("Qnax"), Ownership.Rented),
- Provider(ProviderId("Quadranet"), Ownership.Rented),
- Provider(ProviderId("techfutures"), Ownership.Rented),
- Provider(ProviderId("Tzulo"), Ownership.Rented),
- Provider(ProviderId("xtom"), Ownership.Rented),
- )
- private val mockSelectedProviders: List<Provider> =
- listOf(
- Provider(ProviderId("31173"), Ownership.MullvadOwned),
- Provider(ProviderId("Blix"), Ownership.MullvadOwned),
- Provider(ProviderId("Creanova"), Ownership.MullvadOwned),
+ mapOf(
+ ProviderId("31173") to setOf(Ownership.MullvadOwned),
+ ProviderId("100TB") to setOf(Ownership.Rented),
+ ProviderId("Blix") to setOf(Ownership.MullvadOwned),
+ ProviderId("Creanova") to setOf(Ownership.MullvadOwned),
+ ProviderId("DataPacket") to setOf(Ownership.Rented, Ownership.MullvadOwned),
+ ProviderId("HostRoyale") to setOf(Ownership.Rented),
+ ProviderId("hostuniversal") to setOf(Ownership.Rented),
+ ProviderId("iRegister") to setOf(Ownership.Rented),
+ ProviderId("M247") to setOf(Ownership.Rented),
+ ProviderId("Makonix") to setOf(Ownership.Rented),
+ ProviderId("PrivateLayer") to setOf(Ownership.Rented),
+ ProviderId("ptisp") to setOf(Ownership.Rented),
+ ProviderId("Qnax") to setOf(Ownership.Rented),
+ ProviderId("Quadranet") to setOf(Ownership.Rented),
+ ProviderId("techfutures") to setOf(Ownership.Rented),
+ ProviderId("Tzulo") to setOf(Ownership.Rented),
+ ProviderId("xtom") to setOf(Ownership.Rented),
)
+ private val mockSelectedProviders: List<ProviderId> =
+ listOf(ProviderId("31173"), ProviderId("Blix"), ProviderId("Creanova"))
@BeforeEach
fun setup() {
every { mockRelayListFilterRepository.selectedOwnership } returns selectedOwnership
- every { mockAvailableProvidersUseCase() } returns flowOf(dummyListOfAllProviders)
+ every { mockProvidersOwnershipUseCase() } returns flowOf(dummyListOfAllProviders)
every { mockRelayListFilterRepository.selectedProviders } returns
- MutableStateFlow(
- Constraint.Only(Providers(mockSelectedProviders.map { it.providerId }.toSet()))
- )
+ MutableStateFlow(Constraint.Only(Providers(mockSelectedProviders.toHashSet())))
viewModel =
FilterViewModel(
- availableProvidersUseCase = mockAvailableProvidersUseCase,
+ providerToOwnershipsUseCase = mockProvidersOwnershipUseCase,
relayListFilterRepository = mockRelayListFilterRepository,
)
}
@@ -101,7 +94,7 @@ class FilterViewModelTest {
fun `setSelectionProvider should emit uiState where selectedProviders include the selected provider`() =
runTest {
// Arrange
- val mockSelectedProvidersList = Provider(ProviderId("ptisp"), Ownership.Rented)
+ val mockSelectedProvidersList = ProviderId("ptisp")
// Assert
viewModel.uiState.test {
assertLists(awaitItem().selectedProviders, mockSelectedProviders)
@@ -117,7 +110,7 @@ class FilterViewModelTest {
fun `setAllProvider with true should emit uiState with selectedProviders includes all providers`() =
runTest {
// Arrange
- val mockProvidersList = dummyListOfAllProviders
+ val mockProvidersList = dummyListOfAllProviders.keys.toList()
// Act
viewModel.setAllProviders(true)
// Assert
@@ -133,7 +126,7 @@ class FilterViewModelTest {
// Arrange
val mockOwnership = Ownership.MullvadOwned.toOwnershipConstraint()
val mockSelectedProviders =
- mockSelectedProviders.toConstraintProviders(dummyListOfAllProviders)
+ mockSelectedProviders.toConstraintProviders(dummyListOfAllProviders.keys.toList())
coEvery {
mockRelayListFilterRepository.updateSelectedOwnershipAndProviderFilter(
mockOwnership,
@@ -152,4 +145,26 @@ class FilterViewModelTest {
)
}
}
+
+ @Test
+ fun `ensure that providers with multiple ownership are only returned once`() = runTest {
+ // Arrange
+ val expectedProviderList = dummyListOfAllProviders.keys.toList()
+
+ // Assert
+ viewModel.uiState.test {
+ val state = awaitItem()
+ assertLists(expectedProviderList, state.allProviders)
+ }
+ }
+
+ @Test
+ fun `ensure that providers are sorted by name`() = runTest {
+ // Assert
+ viewModel.uiState.test {
+ val state = awaitItem()
+ assertEquals(state.allProviders.sorted(), state.allProviders)
+ assertEquals(state.selectableProviders.sorted(), state.selectableProviders)
+ }
+ }
}