diff options
| author | Jonatan Rhodin <jonatan.rhodin@mullvad.net> | 2023-06-01 10:11:10 +0200 |
|---|---|---|
| committer | Jonatan Rhodin <jonatan.rhodin@mullvad.net> | 2023-07-12 14:32:30 +0200 |
| commit | 4fc7e95a2a26a1f8d221959a417a5b3832b46ede (patch) | |
| tree | 2ed1a6ab96bd607329ede46c5bfe96fc7ba9bf08 /android/app/src/test | |
| parent | 7ffe7307ca2a969193d0eec4853248d5cdaa4fa7 (diff) | |
| download | mullvadvpn-4fc7e95a2a26a1f8d221959a417a5b3832b46ede.tar.xz mullvadvpn-4fc7e95a2a26a1f8d221959a417a5b3832b46ede.zip | |
Add search bar to select location screen
- Filter countries, cities and relays based on search string
- Remove collapsable toolbar and replace with search bar
- Improve expand behavior for relay location cells
- Remove cirular dependency for relays
Diffstat (limited to 'android/app/src/test')
3 files changed, 139 insertions, 35 deletions
diff --git a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/relaylist/RelayNameComparatorTest.kt b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/relaylist/RelayNameComparatorTest.kt index a3c96349d9..2ef1d1f02c 100644 --- a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/relaylist/RelayNameComparatorTest.kt +++ b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/relaylist/RelayNameComparatorTest.kt @@ -8,8 +8,6 @@ import org.junit.Test class RelayNameComparatorTest { - private val mockedCity = mockk<RelayCity>(relaxed = true) - @After fun tearDown() { unmockkAll() @@ -17,16 +15,25 @@ class RelayNameComparatorTest { @Test fun test_compare_respect_numbers_in_name() { - val relay9 = Relay(mockedCity, "se9-wireguard", false) - val relay10 = Relay(mockedCity, "se10-wireguard", false) + val relay9 = + Relay(name = "se9-wireguard", location = mockk(), locationName = "mock", active = false) + val relay10 = + Relay( + name = "se10-wireguard", + location = mockk(), + locationName = "mock", + active = false + ) relay9 assertOrderBothDirection relay10 } @Test fun test_compare_same_name() { - val relay9a = Relay(mockedCity, "se9-wireguard", false) - val relay9b = Relay(mockedCity, "se9-wireguard", false) + val relay9a = + Relay(name = "se9-wireguard", location = mockk(), locationName = "mock", active = false) + val relay9b = + Relay(name = "se9-wireguard", location = mockk(), locationName = "mock", active = false) assertTrue(RelayNameComparator.compare(relay9a, relay9b) == 0) assertTrue(RelayNameComparator.compare(relay9b, relay9a) == 0) @@ -34,10 +41,12 @@ class RelayNameComparatorTest { @Test fun test_compare_only_numbers_in_name() { - val relay001 = Relay(mockedCity, "001", false) - val relay1 = Relay(mockedCity, "1", false) - val relay3 = Relay(mockedCity, "3", false) - val relay100 = Relay(mockedCity, "100", false) + val relay001 = + Relay(name = "001", location = mockk(), locationName = "mock", active = false) + val relay1 = Relay(name = "1", location = mockk(), locationName = "mock", active = false) + val relay3 = Relay(name = "3", location = mockk(), locationName = "mock", active = false) + val relay100 = + Relay(name = "100", location = mockk(), locationName = "mock", active = false) relay001 assertOrderBothDirection relay1 relay001 assertOrderBothDirection relay3 @@ -47,8 +56,10 @@ class RelayNameComparatorTest { @Test fun test_compare_without_numbers_in_name() { - val relay9a = Relay(mockedCity, "se-wireguard", false) - val relay9b = Relay(mockedCity, "se-wireguard", false) + val relay9a = + Relay(name = "se-wireguard", location = mockk(), locationName = "mock", active = false) + val relay9b = + Relay(name = "se-wireguard", location = mockk(), locationName = "mock", active = false) assertTrue(RelayNameComparator.compare(relay9a, relay9b) == 0) assertTrue(RelayNameComparator.compare(relay9b, relay9a) == 0) @@ -56,18 +67,39 @@ class RelayNameComparatorTest { @Test fun test_compare_with_trailing_zeros_in_name() { - val relay001 = Relay(mockedCity, "se001-wireguard", false) - val relay005 = Relay(mockedCity, "se005-wireguard", false) + val relay001 = + Relay( + name = "se001-wireguard", + location = mockk(), + locationName = "mock", + active = false + ) + val relay005 = + Relay( + name = "se005-wireguard", + location = mockk(), + locationName = "mock", + active = false + ) relay001 assertOrderBothDirection relay005 } @Test fun test_compare_prefix_and_numbers() { - val relayAr2 = Relay(mockedCity, "ar2-wireguard", false) - val relayAr8 = Relay(mockedCity, "ar8-wireguard", false) - val relaySe5 = Relay(mockedCity, "se5-wireguard", false) - val relaySe10 = Relay(mockedCity, "se10-wireguard", false) + val relayAr2 = + Relay(name = "ar2-wireguard", location = mockk(), locationName = "mock", active = false) + val relayAr8 = + Relay(name = "ar8-wireguard", location = mockk(), locationName = "mock", active = false) + val relaySe5 = + Relay(name = "se5-wireguard", location = mockk(), locationName = "mock", active = false) + val relaySe10 = + Relay( + name = "se10-wireguard", + location = mockk(), + locationName = "mock", + active = false + ) relayAr2 assertOrderBothDirection relayAr8 relayAr8 assertOrderBothDirection relaySe5 @@ -76,16 +108,25 @@ class RelayNameComparatorTest { @Test fun test_compare_suffix_and_numbers() { - val relay2c = Relay(mockedCity, "se2-cloud", false) - val relay2w = Relay(mockedCity, "se2-wireguard", false) + val relay2c = + Relay(name = "se2-cloud", location = mockk(), locationName = "mock", active = false) + val relay2w = + Relay(name = "se2-wireguard", location = mockk(), locationName = "mock", active = false) relay2c assertOrderBothDirection relay2w } @Test fun test_compare_different_length() { - val relay22a = Relay(mockedCity, "se22", false) - val relay22b = Relay(mockedCity, "se22-wireguard", false) + val relay22a = + Relay(name = "se22", location = mockk(), locationName = "mock", active = false) + val relay22b = + Relay( + name = "se22-wireguard", + location = mockk(), + locationName = "mock", + active = false + ) relay22a assertOrderBothDirection relay22b } diff --git a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/ConnectViewModelTest.kt b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/ConnectViewModelTest.kt index 8c101e97a8..8e2bd28c52 100644 --- a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/ConnectViewModelTest.kt +++ b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/ConnectViewModelTest.kt @@ -17,7 +17,6 @@ import net.mullvad.mullvadvpn.model.GeoIpLocation import net.mullvad.mullvadvpn.model.TunnelState import net.mullvad.mullvadvpn.relaylist.RelayCountry import net.mullvad.mullvadvpn.relaylist.RelayItem -import net.mullvad.mullvadvpn.relaylist.RelayList import net.mullvad.mullvadvpn.ui.VersionInfo import net.mullvad.mullvadvpn.ui.serviceconnection.AppVersionInfoCache import net.mullvad.mullvadvpn.ui.serviceconnection.ConnectionProxy @@ -60,7 +59,7 @@ class ConnectViewModelTest { // Captures private val locationSlot = slot<((GeoIpLocation?) -> Unit)>() - private val relaySlot = slot<(RelayList, RelayItem?) -> Unit>() + private val relaySlot = slot<(List<RelayCountry>, RelayItem?) -> Unit>() // Event notifiers private val eventNotifierTunnelUiState = EventNotifier<TunnelState>(TunnelState.Disconnected) @@ -85,7 +84,7 @@ class ConnectViewModelTest { every { mockConnectionProxy.onStateChange } returns eventNotifierTunnelRealState // Listeners every { mockLocationInfoCache.onNewLocation = capture(locationSlot) } answers {} - every { mockRelayListListener.onRelayListChange = capture(relaySlot) } answers {} + every { mockRelayListListener.onRelayCountriesChange = capture(relaySlot) } answers {} every { mockAppVersionInfoCache.onUpdate = any() } answers {} viewModel = ConnectViewModel(mockServiceConnectionManager) 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 ba7ea30c41..4c14c2519d 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 @@ -19,7 +19,7 @@ import net.mullvad.mullvadvpn.compose.state.SelectLocationUiState import net.mullvad.mullvadvpn.model.GeographicLocationConstraint import net.mullvad.mullvadvpn.relaylist.RelayCountry import net.mullvad.mullvadvpn.relaylist.RelayItem -import net.mullvad.mullvadvpn.relaylist.RelayList +import net.mullvad.mullvadvpn.relaylist.filterOnSearchTerm import net.mullvad.mullvadvpn.ui.serviceconnection.ConnectionProxy import net.mullvad.mullvadvpn.ui.serviceconnection.RelayListListener import net.mullvad.mullvadvpn.ui.serviceconnection.ServiceConnectionContainer @@ -43,7 +43,7 @@ class SelectLocationViewModelTest { private val mockRelayListListener: RelayListListener = mockk(relaxUnitFun = true) // Captures - private val relaySlot = slot<(RelayList, RelayItem?) -> Unit>() + private val relaySlot = slot<(List<RelayCountry>, RelayItem?) -> Unit>() private val serviceConnectionState = MutableStateFlow<ServiceConnectionState>(ServiceConnectionState.Disconnected) @@ -53,10 +53,11 @@ class SelectLocationViewModelTest { every { mockServiceConnectionManager.connectionState } returns serviceConnectionState every { mockServiceConnectionContainer.relayListListener } returns mockRelayListListener - every { mockRelayListListener.onRelayListChange = capture(relaySlot) } answers {} - every { mockRelayListListener.onRelayListChange = null } answers {} + every { mockRelayListListener.onRelayCountriesChange = capture(relaySlot) } answers {} + every { mockRelayListListener.onRelayCountriesChange = null } answers {} mockkStatic(SERVICE_CONNECTION_MANAGER_EXTENSIONS) + mockkStatic(RELAY_LIST_EXTENSIONS) viewModel = SelectLocationViewModel(mockServiceConnectionManager) } @@ -77,14 +78,13 @@ class SelectLocationViewModelTest { // Arrange val mockCountries = listOf<RelayCountry>(mockk(), mockk()) val selectedRelay: RelayItem = mockk() - val mockRelayList: RelayList = mockk() - every { mockRelayList.countries } returns mockCountries + every { mockCountries.filterOnSearchTerm(any(), selectedRelay) } returns mockCountries // Act, Assert viewModel.uiState.test { serviceConnectionState.value = ServiceConnectionState.ConnectedReady(mockServiceConnectionContainer) - relaySlot.captured.invoke(mockRelayList, selectedRelay) + relaySlot.captured.invoke(mockCountries, selectedRelay) assertEquals(SelectLocationUiState.Loading, awaitItem()) val actualState = awaitItem() @@ -99,14 +99,13 @@ class SelectLocationViewModelTest { // Arrange val mockCountries = listOf<RelayCountry>(mockk(), mockk()) val selectedRelay: RelayItem? = null - val mockRelayList: RelayList = mockk() - every { mockRelayList.countries } returns mockCountries + every { mockCountries.filterOnSearchTerm(any(), selectedRelay) } returns mockCountries // Act, Assert viewModel.uiState.test { serviceConnectionState.value = ServiceConnectionState.ConnectedReady(mockServiceConnectionContainer) - relaySlot.captured.invoke(mockRelayList, selectedRelay) + relaySlot.captured.invoke(mockCountries, selectedRelay) assertEquals(SelectLocationUiState.Loading, awaitItem()) val actualState = awaitItem() @@ -138,8 +137,73 @@ class SelectLocationViewModelTest { } } + @Test + fun testFilterRelay() = runTest { + // Arrange + val mockCountries = listOf<RelayCountry>(mockk(), mockk()) + val selectedRelay: RelayItem? = null + val mockRelayList: List<RelayCountry> = mockk(relaxed = true) + val mockSearchString = "SEARCH" + every { mockRelayList.filterOnSearchTerm(mockSearchString, selectedRelay) } returns + mockCountries + + // Act, Assert + viewModel.uiState.test { + serviceConnectionState.value = + ServiceConnectionState.ConnectedReady(mockServiceConnectionContainer) + relaySlot.captured.invoke(mockRelayList, selectedRelay) + + // Wait for loading + assertEquals(SelectLocationUiState.Loading, awaitItem()) + // Wait for first data + assertIs<SelectLocationUiState.ShowData>(awaitItem()) + + // Update search string + viewModel.onSearchTermInput(mockSearchString) + + // Assert + val actualState = awaitItem() + assertIs<SelectLocationUiState.ShowData>(actualState) + assertLists(mockCountries, actualState.countries) + assertEquals(selectedRelay, actualState.selectedRelay) + } + } + + @Test + fun testFilterNotFound() = runTest { + // Arrange + val mockCountries = emptyList<RelayCountry>() + val selectedRelay: RelayItem? = null + val mockRelayList: List<RelayCountry> = mockk(relaxed = true) + val mockSearchString = "SEARCH" + every { mockRelayList.filterOnSearchTerm(mockSearchString, selectedRelay) } returns + mockCountries + + // Act, Assert + viewModel.uiState.test { + serviceConnectionState.value = + ServiceConnectionState.ConnectedReady(mockServiceConnectionContainer) + relaySlot.captured.invoke(mockRelayList, selectedRelay) + + // Wait for loading + assertEquals(SelectLocationUiState.Loading, awaitItem()) + // Wait for first data + assertIs<SelectLocationUiState.ShowData>(awaitItem()) + + // Update search string + viewModel.onSearchTermInput(mockSearchString) + + // Assert + val actualState = awaitItem() + assertIs<SelectLocationUiState.NoSearchResultFound>(actualState) + assertEquals(mockSearchString, actualState.searchTerm) + } + } + companion object { private const val SERVICE_CONNECTION_MANAGER_EXTENSIONS = "net.mullvad.mullvadvpn.ui.serviceconnection.ServiceConnectionManagerExtensionsKt" + private const val RELAY_LIST_EXTENSIONS = + "net.mullvad.mullvadvpn.relaylist.RelayListExtensionsKt" } } |
