summaryrefslogtreecommitdiffhomepage
path: root/android/app/src/test
diff options
context:
space:
mode:
authorJonatan Rhodin <jonatan.rhodin@mullvad.net>2025-09-09 12:53:08 +0200
committerJonatan Rhodin <jonatan.rhodin@mullvad.net>2025-09-09 12:53:08 +0200
commit708498ffa4ac7fd211af506e9d8237536b3ed335 (patch)
tree807c8db111427dbeead95ea36ceb13e1a20197c3 /android/app/src/test
parentb79b4c95ada5e4a38cbb05e7533e8a06daeca069 (diff)
parentb80d26872f8346aa7f470b658569e94b007b0dbe (diff)
downloadmullvadvpn-708498ffa4ac7fd211af506e9d8237536b3ed335.tar.xz
mullvadvpn-708498ffa4ac7fd211af506e9d8237536b3ed335.zip
Merge branch 'entry-relay-is-blocked-in-the-exit-list-even-though-droid-2160'
Diffstat (limited to 'android/app/src/test')
-rw-r--r--android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/location/SearchLocationViewModelTest.kt6
-rw-r--r--android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/location/SelectLocationListViewModelTest.kt52
2 files changed, 58 insertions, 0 deletions
diff --git a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/location/SearchLocationViewModelTest.kt b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/location/SearchLocationViewModelTest.kt
index 8aa1e9b038..a71c95863f 100644
--- a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/location/SearchLocationViewModelTest.kt
+++ b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/location/SearchLocationViewModelTest.kt
@@ -16,10 +16,12 @@ import net.mullvad.mullvadvpn.lib.model.Constraint
import net.mullvad.mullvadvpn.lib.model.GeoLocationId
import net.mullvad.mullvadvpn.lib.model.RelayItem
import net.mullvad.mullvadvpn.lib.model.RelayItemSelection
+import net.mullvad.mullvadvpn.lib.model.Settings
import net.mullvad.mullvadvpn.lib.model.WireguardConstraints
import net.mullvad.mullvadvpn.lib.ui.component.relaylist.RelayListItem
import net.mullvad.mullvadvpn.repository.CustomListsRepository
import net.mullvad.mullvadvpn.repository.RelayListFilterRepository
+import net.mullvad.mullvadvpn.repository.SettingsRepository
import net.mullvad.mullvadvpn.repository.WireguardConstraintsRepository
import net.mullvad.mullvadvpn.usecase.FilterChip
import net.mullvad.mullvadvpn.usecase.FilterChipUseCase
@@ -50,6 +52,7 @@ class SearchLocationViewModelTest {
private val mockCustomListsRelayItemUseCase: CustomListsRelayItemUseCase = mockk()
private val mockSelectHopUseCase: SelectHopUseCase = mockk()
private val mockModifyMultihopUseCase: ModifyMultihopUseCase = mockk()
+ private val mockSettingsRepository: SettingsRepository = mockk()
private val filteredRelayList = MutableStateFlow<List<RelayItem.Location.Country>>(emptyList())
private val selectedLocation =
@@ -59,6 +62,7 @@ class SearchLocationViewModelTest {
private val customListRelayItems = MutableStateFlow<List<RelayItem.CustomList>>(emptyList())
private val filterChips = MutableStateFlow<List<FilterChip>>(emptyList())
private val wireguardConstraints = MutableStateFlow<WireguardConstraints>(mockk(relaxed = true))
+ private val settingsFlow = MutableStateFlow(mockk<Settings>(relaxed = true))
private lateinit var viewModel: SearchLocationViewModel
@@ -72,6 +76,7 @@ class SearchLocationViewModelTest {
every { mockFilterChipUseCase(any()) } returns filterChips
every { mockWireguardConstraintsRepository.wireguardConstraints } returns
wireguardConstraints
+ every { mockSettingsRepository.settingsUpdates } returns settingsFlow
viewModel =
SearchLocationViewModel(
@@ -86,6 +91,7 @@ class SearchLocationViewModelTest {
customListsRelayItemUseCase = mockCustomListsRelayItemUseCase,
selectHopUseCase = mockSelectHopUseCase,
modifyMultihopUseCase = mockModifyMultihopUseCase,
+ settingsRepository = mockSettingsRepository,
savedStateHandle =
SearchLocationNavArgs(relayListType = RelayListType.Single).toSavedStateHandle(),
)
diff --git a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/location/SelectLocationListViewModelTest.kt b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/location/SelectLocationListViewModelTest.kt
index 8c01d592e5..436e061d1d 100644
--- a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/location/SelectLocationListViewModelTest.kt
+++ b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/location/SelectLocationListViewModelTest.kt
@@ -3,9 +3,13 @@ package net.mullvad.mullvadvpn.viewmodel.location
import app.cash.turbine.test
import io.mockk.every
import io.mockk.mockk
+import io.mockk.mockkStatic
+import io.mockk.unmockkAll
+import io.mockk.verify
import kotlin.test.assertIs
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.test.runTest
+import net.mullvad.mullvadvpn.compose.state.MultihopRelayListType
import net.mullvad.mullvadvpn.compose.state.RelayListType
import net.mullvad.mullvadvpn.compose.state.SelectLocationListUiState
import net.mullvad.mullvadvpn.lib.common.test.TestCoroutineRule
@@ -26,6 +30,7 @@ import net.mullvad.mullvadvpn.usecase.SelectedLocationUseCase
import net.mullvad.mullvadvpn.usecase.customlists.CustomListsRelayItemUseCase
import net.mullvad.mullvadvpn.usecase.customlists.FilterCustomListsRelayItemUseCase
import net.mullvad.mullvadvpn.util.Lce
+import org.junit.jupiter.api.AfterEach
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertTrue
import org.junit.jupiter.api.BeforeEach
@@ -68,6 +73,14 @@ class SelectLocationListViewModelTest {
every { mockCustomListRelayItemsUseCase() } returns customListRelayItems
every { mockSettingsRepository.settingsUpdates } returns settings
every { recentsUseCase(any()) } returns recentsRelayItems
+
+ mockkStatic(RELAY_ITEM_LIST_CREATOR_CLASS)
+ mockkStatic(LOCATION_UTIL_CLASS)
+ }
+
+ @AfterEach
+ fun tearDown() {
+ unmockkAll()
}
@Test
@@ -127,6 +140,40 @@ class SelectLocationListViewModelTest {
}
}
+ @Test
+ fun `given relay list type exit and entry blocked isEntryBlocked should be true`() = runTest {
+ // Arrange
+ viewModel =
+ createSelectLocationListViewModel(RelayListType.Multihop(MultihopRelayListType.EXIT))
+ filteredRelayList.value = testCountries
+ val exitLocation = Constraint.Only(GeoLocationId.Country("us"))
+ selectedLocationFlow.value =
+ RelayItemSelection.Multiple(
+ entryLocation = Constraint.Only(GeoLocationId.Country("se")),
+ exitLocation = exitLocation,
+ )
+ every { settings.value.entryBlocked() } returns true
+
+ // Act, Assert
+ viewModel.uiState.test {
+ awaitItem()
+
+ verify {
+ relayListItems(
+ relayListType = RelayListType.Multihop(MultihopRelayListType.EXIT),
+ relayCountries = testCountries,
+ customLists = any(),
+ recents = any(),
+ selectedItem = any(),
+ selectedByThisEntryExitList = exitLocation.getOrNull(),
+ selectedByOtherEntryExitList = null,
+ expandedItems = emptySet(),
+ isEntryBlocked = true,
+ )
+ }
+ }
+ }
+
private fun createSelectLocationListViewModel(relayListType: RelayListType) =
SelectLocationListViewModel(
relayListType = relayListType,
@@ -157,6 +204,11 @@ class SelectLocationListViewModelTest {
}
companion object {
+ private const val RELAY_ITEM_LIST_CREATOR_CLASS =
+ "net.mullvad.mullvadvpn.viewmodel.location.RelayItemListCreatorKt"
+ private const val LOCATION_UTIL_CLASS =
+ "net.mullvad.mullvadvpn.viewmodel.location.LocationUtilKt"
+
private val testCountries =
listOf(
RelayItem.Location.Country(