diff options
| author | Jonatan Rhodin <jonatan.rhodin@mullvad.net> | 2023-12-04 12:00:49 +0100 |
|---|---|---|
| committer | Jonatan Rhodin <jonatan.rhodin@mullvad.net> | 2023-12-04 12:00:49 +0100 |
| commit | e119d9bf6fb5445c993db3aac009e08e72c51611 (patch) | |
| tree | ab768099b0fe8c7288b0d73624152aa1832a3f1c /android/app/src/test | |
| parent | f929009e91e44c0c174abde053f4f2ea721c5a06 (diff) | |
| parent | 62fa2db4f196adfda37b2cb0dc01492c07849e9a (diff) | |
| download | mullvadvpn-e119d9bf6fb5445c993db3aac009e08e72c51611.tar.xz mullvadvpn-e119d9bf6fb5445c993db3aac009e08e72c51611.zip | |
Merge branch 'filter-providers'
Diffstat (limited to 'android/app/src/test')
2 files changed, 185 insertions, 5 deletions
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 new file mode 100644 index 0000000000..9f61ea4a91 --- /dev/null +++ b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/FilterViewModelTest.kt @@ -0,0 +1,129 @@ +package net.mullvad.mullvadvpn.viewmodel + +import androidx.lifecycle.viewModelScope +import app.cash.turbine.test +import io.mockk.coVerify +import io.mockk.every +import io.mockk.mockk +import io.mockk.unmockkAll +import kotlin.test.assertEquals +import kotlinx.coroutines.cancel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.flowOf +import kotlinx.coroutines.test.runTest +import net.mullvad.mullvadvpn.compose.state.toConstraintProviders +import net.mullvad.mullvadvpn.compose.state.toOwnershipConstraint +import net.mullvad.mullvadvpn.lib.common.test.TestCoroutineRule +import net.mullvad.mullvadvpn.lib.common.test.assertLists +import net.mullvad.mullvadvpn.model.Constraint +import net.mullvad.mullvadvpn.model.Ownership +import net.mullvad.mullvadvpn.model.Providers +import net.mullvad.mullvadvpn.relaylist.Provider +import net.mullvad.mullvadvpn.usecase.RelayListFilterUseCase +import org.junit.After +import org.junit.Before +import org.junit.Rule +import org.junit.Test + +class FilterViewModelTest { + @get:Rule val testCoroutineRule = TestCoroutineRule() + private val mockRelayListFilterUseCase: RelayListFilterUseCase = mockk(relaxed = true) + private lateinit var viewModel: FilterViewModel + private val selectedOwnership = + MutableStateFlow<Constraint<Ownership>>(Constraint.Only(Ownership.MullvadOwned)) + private val dummyListOfAllProviders = + listOf( + Provider("31173", true), + Provider("100TB", false), + Provider("Blix", true), + Provider("Creanova", true), + Provider("DataPacket", false), + Provider("HostRoyale", false), + Provider("hostuniversal", false), + Provider("iRegister", false), + Provider("M247", false), + Provider("Makonix", false), + Provider("PrivateLayer", false), + Provider("ptisp", false), + Provider("Qnax", false), + Provider("Quadranet", false), + Provider("techfutures", false), + Provider("Tzulo", false), + Provider("xtom", false) + ) + private val mockSelectedProviders: List<Provider> = + listOf(Provider("31173", true), Provider("Blix", true), Provider("Creanova", true)) + + @Before + fun setup() { + every { mockRelayListFilterUseCase.selectedOwnership() } returns selectedOwnership + every { mockRelayListFilterUseCase.availableProviders() } returns + flowOf(dummyListOfAllProviders) + every { mockRelayListFilterUseCase.selectedProviders() } returns + flowOf(Constraint.Only(Providers(mockSelectedProviders.map { it.name }.toHashSet()))) + viewModel = FilterViewModel(mockRelayListFilterUseCase) + } + + @After + fun teardown() { + viewModel.viewModelScope.coroutineContext.cancel() + unmockkAll() + } + + @Test + fun testSetSelectedOwnership() = runTest { + // Arrange + val mockOwnership = Ownership.Rented + // Assert + viewModel.uiState.test { + assertEquals(awaitItem().selectedOwnership, Ownership.MullvadOwned) + viewModel.setSelectedOwnership(mockOwnership) + assertEquals(mockOwnership, awaitItem().selectedOwnership) + } + } + + @Test + fun testSetSelectedProvider() = runTest { + // Arrange + val mockSelectedProvidersList = Provider("ptisp", false) + // Assert + viewModel.uiState.test { + assertLists(awaitItem().selectedProviders, mockSelectedProviders) + viewModel.setSelectedProvider(true, mockSelectedProvidersList) + assertLists( + listOf(mockSelectedProvidersList) + mockSelectedProviders, + awaitItem().selectedProviders + ) + } + } + + @Test + fun testSetAllProviders() = runTest { + // Arrange + val mockProvidersList = dummyListOfAllProviders + // Act + viewModel.setAllProviders(true) + // Assert + viewModel.uiState.test { + val state = awaitItem() + assertEquals(mockProvidersList, state.selectedProviders) + } + } + + @Test + fun testOnApplyButtonClicked() = runTest { + // Arrange + val mockOwnership = Ownership.MullvadOwned.toOwnershipConstraint() + val mockSelectedProviders = + mockSelectedProviders.toConstraintProviders(dummyListOfAllProviders) + // Act + viewModel.onApplyButtonClicked() + // Assert + coVerify { + mockRelayListFilterUseCase.updateOwnershipAndProviderFilter( + mockOwnership, + mockSelectedProviders + ) + } + } +} diff --git a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/SelectLocationViewModelTest.kt b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/SelectLocationViewModelTest.kt index 44be67fa64..74d7d80c19 100644 --- a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/SelectLocationViewModelTest.kt +++ b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/SelectLocationViewModelTest.kt @@ -15,7 +15,11 @@ import kotlinx.coroutines.test.runTest import net.mullvad.mullvadvpn.compose.state.SelectLocationUiState import net.mullvad.mullvadvpn.lib.common.test.TestCoroutineRule import net.mullvad.mullvadvpn.lib.common.test.assertLists +import net.mullvad.mullvadvpn.model.Constraint import net.mullvad.mullvadvpn.model.GeographicLocationConstraint +import net.mullvad.mullvadvpn.model.Ownership +import net.mullvad.mullvadvpn.model.Providers +import net.mullvad.mullvadvpn.relaylist.Provider import net.mullvad.mullvadvpn.relaylist.RelayCountry import net.mullvad.mullvadvpn.relaylist.RelayItem import net.mullvad.mullvadvpn.relaylist.RelayList @@ -23,6 +27,7 @@ import net.mullvad.mullvadvpn.relaylist.filterOnSearchTerm import net.mullvad.mullvadvpn.ui.serviceconnection.ConnectionProxy import net.mullvad.mullvadvpn.ui.serviceconnection.ServiceConnectionManager import net.mullvad.mullvadvpn.ui.serviceconnection.connectionProxy +import net.mullvad.mullvadvpn.usecase.RelayListFilterUseCase import net.mullvad.mullvadvpn.usecase.RelayListUseCase import org.junit.After import org.junit.Before @@ -32,21 +37,31 @@ import org.junit.Test class SelectLocationViewModelTest { @get:Rule val testCoroutineRule = TestCoroutineRule() + private val mockRelayListFilterUseCase: RelayListFilterUseCase = mockk(relaxed = true) private val mockServiceConnectionManager: ServiceConnectionManager = mockk() private lateinit var viewModel: SelectLocationViewModel - private val relayListWithSelectionFlow = MutableStateFlow(RelayList(emptyList(), null)) - private val mockRelayListUseCase: RelayListUseCase = mockk() + private val selectedOwnership = MutableStateFlow<Constraint<Ownership>>(Constraint.Any()) + private val selectedProvider = MutableStateFlow<Constraint<Providers>>(Constraint.Any()) + private val allProvider = MutableStateFlow<List<Provider>>(emptyList()) @Before fun setup() { + + every { mockRelayListFilterUseCase.selectedOwnership() } returns selectedOwnership + every { mockRelayListFilterUseCase.selectedProviders() } returns selectedProvider + every { mockRelayListFilterUseCase.availableProviders() } returns allProvider every { mockRelayListUseCase.relayListWithSelection() } returns relayListWithSelectionFlow mockkStatic(SERVICE_CONNECTION_MANAGER_EXTENSIONS) mockkStatic(RELAY_LIST_EXTENSIONS) - - viewModel = SelectLocationViewModel(mockServiceConnectionManager, mockRelayListUseCase) + viewModel = + SelectLocationViewModel( + mockServiceConnectionManager, + mockRelayListUseCase, + mockRelayListFilterUseCase + ) } @After @@ -164,11 +179,47 @@ class SelectLocationViewModelTest { // Assert val actualState = awaitItem() - assertIs<SelectLocationUiState.NoSearchResultFound>(actualState) + assertIs<SelectLocationUiState.ShowData>(actualState) assertEquals(mockSearchString, actualState.searchTerm) } } + @Test + fun testRemoveOwnerFilter() = runTest { + // Arrange + val mockSelectedProviders: Constraint<Providers> = mockk() + every { mockRelayListFilterUseCase.selectedProviders() } returns + MutableStateFlow(mockSelectedProviders) + + // Act + viewModel.removeOwnerFilter() + // Assert + verify { + mockRelayListFilterUseCase.updateOwnershipAndProviderFilter( + any<Constraint.Any<Ownership>>(), + mockSelectedProviders + ) + } + } + + @Test + fun testRemoveProviderFilter() = runTest { + // Arrange + val mockSelectedOwnership: Constraint<Ownership> = mockk() + every { mockRelayListFilterUseCase.selectedOwnership() } returns + MutableStateFlow(mockSelectedOwnership) + + // Act + viewModel.removeProviderFilter() + // Assert + verify { + mockRelayListFilterUseCase.updateOwnershipAndProviderFilter( + mockSelectedOwnership, + any<Constraint.Any<Providers>>() + ) + } + } + companion object { private const val SERVICE_CONNECTION_MANAGER_EXTENSIONS = "net.mullvad.mullvadvpn.ui.serviceconnection.ServiceConnectionManagerExtensionsKt" |
