diff options
| author | David Göransson <david.goransson@mullvad.net> | 2024-12-20 07:04:56 +0100 |
|---|---|---|
| committer | Jonatan Rhodin <jonatan.rhodin@mullvad.net> | 2024-12-20 14:23:05 +0100 |
| commit | 99bd27986089de8dd05b839d2b8361cae8aefcda (patch) | |
| tree | 1fa7ab88903fe748d1c218cd0bda5bf23d4265b2 /android/app/src/test | |
| parent | 92465444d8a51b73fe225461e459449d9ab6e600 (diff) | |
| download | mullvadvpn-99bd27986089de8dd05b839d2b8361cae8aefcda.tar.xz mullvadvpn-99bd27986089de8dd05b839d2b8361cae8aefcda.zip | |
Remove one-to-one relationship between provider and ownership
Diffstat (limited to 'android/app/src/test')
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) + } + } } |
