summaryrefslogtreecommitdiffhomepage
path: root/android/app/src/test
diff options
context:
space:
mode:
authorJonatan Rhodin <jonatan.rhodin@mullvad.net>2023-06-01 10:11:10 +0200
committerJonatan Rhodin <jonatan.rhodin@mullvad.net>2023-07-12 14:32:30 +0200
commit4fc7e95a2a26a1f8d221959a417a5b3832b46ede (patch)
tree2ed1a6ab96bd607329ede46c5bfe96fc7ba9bf08 /android/app/src/test
parent7ffe7307ca2a969193d0eec4853248d5cdaa4fa7 (diff)
downloadmullvadvpn-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')
-rw-r--r--android/app/src/test/kotlin/net/mullvad/mullvadvpn/relaylist/RelayNameComparatorTest.kt85
-rw-r--r--android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/ConnectViewModelTest.kt5
-rw-r--r--android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/SelectLocationViewModelTest.kt84
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"
}
}