summaryrefslogtreecommitdiffhomepage
path: root/android/app/src/test
diff options
context:
space:
mode:
authorJonatan Rhodin <jonatan.rhodin@mullvad.net>2023-12-04 12:00:49 +0100
committerJonatan Rhodin <jonatan.rhodin@mullvad.net>2023-12-04 12:00:49 +0100
commite119d9bf6fb5445c993db3aac009e08e72c51611 (patch)
treeab768099b0fe8c7288b0d73624152aa1832a3f1c /android/app/src/test
parentf929009e91e44c0c174abde053f4f2ea721c5a06 (diff)
parent62fa2db4f196adfda37b2cb0dc01492c07849e9a (diff)
downloadmullvadvpn-e119d9bf6fb5445c993db3aac009e08e72c51611.tar.xz
mullvadvpn-e119d9bf6fb5445c993db3aac009e08e72c51611.zip
Merge branch 'filter-providers'
Diffstat (limited to 'android/app/src/test')
-rw-r--r--android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/FilterViewModelTest.kt129
-rw-r--r--android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/SelectLocationViewModelTest.kt61
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"