summaryrefslogtreecommitdiffhomepage
path: root/android/app/src/test
diff options
context:
space:
mode:
authorDavid Göransson <david.goransson@mullvad.net>2025-10-02 11:27:53 +0200
committerJonatan Rhodin <jonatan.rhodin@mullvad.net>2025-10-06 11:43:15 +0200
commitd229d24b508f97c24fcc0a4a2db4f845141fd931 (patch)
tree19241200a1830c7c5b8703714d2055b8d87619e7 /android/app/src/test
parentf82099962e5160b4577038b794170fa2f70ed546 (diff)
downloadmullvadvpn-d229d24b508f97c24fcc0a4a2db4f845141fd931.tar.xz
mullvadvpn-d229d24b508f97c24fcc0a4a2db4f845141fd931.zip
Warn users about android 16 upgrade issue
Diffstat (limited to 'android/app/src/test')
-rw-r--r--android/app/src/test/kotlin/net/mullvad/mullvadvpn/InAppNotificationControllerTest.kt45
-rw-r--r--android/app/src/test/kotlin/net/mullvad/mullvadvpn/usecase/AccountExpiryInAppNotificationUseCaseTest.kt28
-rw-r--r--android/app/src/test/kotlin/net/mullvad/mullvadvpn/usecase/NewDeviceNotificationUseCaseTest.kt9
-rw-r--r--android/app/src/test/kotlin/net/mullvad/mullvadvpn/usecase/TunnelStateNotificationUseCaseTest.kt24
-rw-r--r--android/app/src/test/kotlin/net/mullvad/mullvadvpn/usecase/VersionNotificationUseCaseTest.kt10
-rw-r--r--android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/ConnectViewModelTest.kt1
6 files changed, 59 insertions, 58 deletions
diff --git a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/InAppNotificationControllerTest.kt b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/InAppNotificationControllerTest.kt
index f9ee9f3d41..caeba3aa0a 100644
--- a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/InAppNotificationControllerTest.kt
+++ b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/InAppNotificationControllerTest.kt
@@ -17,11 +17,11 @@ import net.mullvad.mullvadvpn.lib.common.test.TestCoroutineRule
import net.mullvad.mullvadvpn.lib.model.ErrorState
import net.mullvad.mullvadvpn.lib.model.InAppNotification
import net.mullvad.mullvadvpn.repository.InAppNotificationController
-import net.mullvad.mullvadvpn.usecase.AccountExpiryInAppNotificationUseCase
-import net.mullvad.mullvadvpn.usecase.NewChangelogNotificationUseCase
-import net.mullvad.mullvadvpn.usecase.NewDeviceNotificationUseCase
-import net.mullvad.mullvadvpn.usecase.TunnelStateNotificationUseCase
-import net.mullvad.mullvadvpn.usecase.VersionNotificationUseCase
+import net.mullvad.mullvadvpn.usecase.inappnotification.AccountExpiryInAppNotificationUseCase
+import net.mullvad.mullvadvpn.usecase.inappnotification.NewChangelogNotificationUseCase
+import net.mullvad.mullvadvpn.usecase.inappnotification.NewDeviceNotificationUseCase
+import net.mullvad.mullvadvpn.usecase.inappnotification.TunnelStateNotificationUseCase
+import net.mullvad.mullvadvpn.usecase.inappnotification.VersionNotificationUseCase
import org.junit.jupiter.api.AfterEach
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
@@ -32,12 +32,13 @@ import org.junit.jupiter.api.extension.ExtendWith
class InAppNotificationControllerTest {
private lateinit var inAppNotificationController: InAppNotificationController
- private val accountExpiryNotifications = MutableStateFlow(emptyList<InAppNotification>())
- private val newDeviceNotifications = MutableStateFlow(emptyList<InAppNotification.NewDevice>())
+ private val accountExpiryNotifications =
+ MutableStateFlow<InAppNotification.AccountExpiry?>(null)
+ private val newDeviceNotifications = MutableStateFlow<InAppNotification.NewDevice?>(null)
private val newVersionChangelogNotifications =
- MutableStateFlow(emptyList<InAppNotification.NewVersionChangelog>())
- private val versionNotifications = MutableStateFlow(emptyList<InAppNotification>())
- private val tunnelStateNotifications = MutableStateFlow(emptyList<InAppNotification>())
+ MutableStateFlow<InAppNotification.NewVersionChangelog?>(null)
+ private val versionNotifications = MutableStateFlow<InAppNotification.UnsupportedVersion?>(null)
+ private val tunnelStateNotifications = MutableStateFlow<InAppNotification?>(null)
private lateinit var job: Job
@@ -60,11 +61,13 @@ class InAppNotificationControllerTest {
inAppNotificationController =
InAppNotificationController(
- accountExpiryInAppNotificationUseCase,
- newDeviceNotificationUseCase,
- newVersionChangelogUseCase,
- versionNotificationUseCase,
- tunnelStateNotificationUseCase,
+ listOf(
+ accountExpiryInAppNotificationUseCase,
+ newDeviceNotificationUseCase,
+ newVersionChangelogUseCase,
+ versionNotificationUseCase,
+ tunnelStateNotificationUseCase,
+ ),
CoroutineScope(job + UnconfinedTestDispatcher()),
)
}
@@ -78,29 +81,27 @@ class InAppNotificationControllerTest {
@Test
fun `ensure all notifications have the right priority`() = runTest {
val newDevice = InAppNotification.NewDevice("")
- newDeviceNotifications.value = listOf(newDevice)
+ newDeviceNotifications.value = newDevice
val newVersionChangelog = InAppNotification.NewVersionChangelog
- newVersionChangelogNotifications.value = listOf(newVersionChangelog)
+ newVersionChangelogNotifications.value = newVersionChangelog
val errorState: ErrorState = mockk()
every { errorState.cause } returns mockk()
val tunnelStateBlocked = InAppNotification.TunnelStateBlocked
- val tunnelStateError = InAppNotification.TunnelStateError(errorState)
- tunnelStateNotifications.value = listOf(tunnelStateBlocked, tunnelStateError)
+ tunnelStateNotifications.value = tunnelStateBlocked
val unsupportedVersion = InAppNotification.UnsupportedVersion(mockk())
- versionNotifications.value = listOf(unsupportedVersion)
+ versionNotifications.value = unsupportedVersion
val accountExpiry = InAppNotification.AccountExpiry(Duration.ZERO)
- accountExpiryNotifications.value = listOf(accountExpiry)
+ accountExpiryNotifications.value = accountExpiry
inAppNotificationController.notifications.test {
val notifications = awaitItem()
assertEquals(
listOf(
- tunnelStateError,
tunnelStateBlocked,
unsupportedVersion,
accountExpiry,
diff --git a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/usecase/AccountExpiryInAppNotificationUseCaseTest.kt b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/usecase/AccountExpiryInAppNotificationUseCaseTest.kt
index 0557cc5786..4de9f38b53 100644
--- a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/usecase/AccountExpiryInAppNotificationUseCaseTest.kt
+++ b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/usecase/AccountExpiryInAppNotificationUseCaseTest.kt
@@ -22,9 +22,11 @@ import net.mullvad.mullvadvpn.lib.model.InAppNotification
import net.mullvad.mullvadvpn.lib.shared.AccountRepository
import net.mullvad.mullvadvpn.service.notifications.accountexpiry.ACCOUNT_EXPIRY_CLOSE_TO_EXPIRY_THRESHOLD
import net.mullvad.mullvadvpn.service.notifications.accountexpiry.ACCOUNT_EXPIRY_NOTIFICATION_UPDATE_INTERVAL
+import net.mullvad.mullvadvpn.usecase.inappnotification.AccountExpiryInAppNotificationUseCase
import org.junit.jupiter.api.AfterEach
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
+import org.junit.jupiter.api.assertNull
import org.junit.jupiter.api.extension.ExtendWith
@ExtendWith(TestCoroutineRule::class)
@@ -55,14 +57,14 @@ class AccountExpiryInAppNotificationUseCaseTest {
}
@Test
- fun `initial state should be empty`() = runTest {
- accountExpiryInAppNotificationUseCase().test { assertTrue { awaitItem().isEmpty() } }
+ fun `initial state should be null`() = runTest {
+ accountExpiryInAppNotificationUseCase().test { assertNull(awaitItem()) }
}
@Test
fun `account that expires within the threshold should emit a notification`() = runTest {
accountExpiryInAppNotificationUseCase().test {
- assertTrue { awaitItem().isEmpty() }
+ assertNull(awaitItem())
val expiry = setExpiry(notificationThreshold.minusHours(1))
assertExpiryNotificationDuration(expiry, expectMostRecentItem())
expectNoEvents()
@@ -72,7 +74,7 @@ class AccountExpiryInAppNotificationUseCaseTest {
@Test
fun `account that expires after the threshold should not emit a notification`() = runTest {
accountExpiryInAppNotificationUseCase().test {
- assertTrue { awaitItem().isEmpty() }
+ assertNull(awaitItem())
setExpiry(notificationThreshold.plusDays(1))
expectNoEvents()
}
@@ -81,7 +83,7 @@ class AccountExpiryInAppNotificationUseCaseTest {
@Test
fun `should emit when the threshold is passed`() = runTest {
accountExpiryInAppNotificationUseCase().test {
- assertTrue { awaitItem().isEmpty() }
+ assertNull(awaitItem())
val expiry = setExpiry(notificationThreshold.plusMinutes(1))
expectNoEvents()
@@ -99,7 +101,7 @@ class AccountExpiryInAppNotificationUseCaseTest {
@Test
fun `should emit zero duration when the time expires`() = runTest {
accountExpiryInAppNotificationUseCase().test {
- assertTrue { awaitItem().isEmpty() }
+ assertNull(awaitItem())
// Set expiry to to be in the final update interval.
val inLastUpdate =
@@ -124,7 +126,7 @@ class AccountExpiryInAppNotificationUseCaseTest {
setExpiry(
ZonedDateTime.now().plus(ACCOUNT_EXPIRY_CLOSE_TO_EXPIRY_THRESHOLD).plusDays(1)
)
- assertEquals(emptyList(), expectMostRecentItem())
+ assertNull(expectMostRecentItem())
}
}
@@ -139,20 +141,18 @@ class AccountExpiryInAppNotificationUseCaseTest {
// ZonedDateTime.now)
private fun assertExpiryNotificationDuration(
expiry: ZonedDateTime,
- notifications: List<InAppNotification>,
+ notification: InAppNotification?,
) {
- val notificationDuration = getExpiryNotificationDuration(notifications)
+ val notificationDuration = getExpiryNotificationDuration(notification)
val expiresFromNow = Duration.between(ZonedDateTime.now(), expiry)
assertTrue(expiresFromNow <= notificationDuration)
assertTrue(expiresFromNow.plus(Duration.ofSeconds(5)) > notificationDuration)
}
- private fun getExpiryNotificationDuration(notifications: List<InAppNotification>): Duration {
- assertTrue(notifications.size == 1, "Expected a single notification")
- val n = notifications[0]
- if (n !is InAppNotification.AccountExpiry) {
+ private fun getExpiryNotificationDuration(notification: InAppNotification?): Duration {
+ if (notification !is InAppNotification.AccountExpiry) {
error("Expected an AccountExpiry notification")
}
- return n.expiry
+ return notification.expiry
}
}
diff --git a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/usecase/NewDeviceNotificationUseCaseTest.kt b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/usecase/NewDeviceNotificationUseCaseTest.kt
index 414c7c1e08..71ee5253fa 100644
--- a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/usecase/NewDeviceNotificationUseCaseTest.kt
+++ b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/usecase/NewDeviceNotificationUseCaseTest.kt
@@ -7,7 +7,6 @@ import io.mockk.impl.annotations.MockK
import io.mockk.unmockkAll
import java.time.ZonedDateTime
import kotlin.test.assertEquals
-import kotlin.test.assertTrue
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.test.runTest
import net.mullvad.mullvadvpn.data.UUID
@@ -19,9 +18,11 @@ import net.mullvad.mullvadvpn.lib.model.DeviceState
import net.mullvad.mullvadvpn.lib.model.InAppNotification
import net.mullvad.mullvadvpn.lib.shared.DeviceRepository
import net.mullvad.mullvadvpn.repository.NewDeviceRepository
+import net.mullvad.mullvadvpn.usecase.inappnotification.NewDeviceNotificationUseCase
import org.junit.jupiter.api.AfterEach
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
+import org.junit.jupiter.api.assertNull
import org.junit.jupiter.api.extension.ExtendWith
@ExtendWith(TestCoroutineRule::class)
@@ -69,7 +70,7 @@ class NewDeviceNotificationUseCaseTest {
@Test
fun `initial state should be empty`() = runTest {
// Arrange, Act, Assert
- newDeviceNotificationUseCase().test { assertTrue { awaitItem().isEmpty() } }
+ newDeviceNotificationUseCase().test { assertNull(awaitItem()) }
}
@Test
@@ -81,7 +82,7 @@ class NewDeviceNotificationUseCaseTest {
isNewDeviceState.value = true
// Assert
- assertEquals(awaitItem(), listOf(InAppNotification.NewDevice(deviceName)))
+ assertEquals(awaitItem(), InAppNotification.NewDevice(deviceName))
}
}
@@ -96,7 +97,7 @@ class NewDeviceNotificationUseCaseTest {
isNewDeviceState.value = false
// Assert
- assertEquals(awaitItem(), emptyList())
+ assertNull(awaitItem())
}
}
}
diff --git a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/usecase/TunnelStateNotificationUseCaseTest.kt b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/usecase/TunnelStateNotificationUseCaseTest.kt
index 6544913748..62d3ed0877 100644
--- a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/usecase/TunnelStateNotificationUseCaseTest.kt
+++ b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/usecase/TunnelStateNotificationUseCaseTest.kt
@@ -8,7 +8,6 @@ import io.mockk.unmockkAll
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.test.runTest
import net.mullvad.mullvadvpn.lib.common.test.TestCoroutineRule
-import net.mullvad.mullvadvpn.lib.common.test.assertLists
import net.mullvad.mullvadvpn.lib.model.ActionAfterDisconnect
import net.mullvad.mullvadvpn.lib.model.Constraint
import net.mullvad.mullvadvpn.lib.model.ErrorState
@@ -23,11 +22,13 @@ import net.mullvad.mullvadvpn.lib.model.TunnelState
import net.mullvad.mullvadvpn.lib.shared.ConnectionProxy
import net.mullvad.mullvadvpn.repository.RelayListRepository
import net.mullvad.mullvadvpn.repository.SettingsRepository
+import net.mullvad.mullvadvpn.usecase.inappnotification.TunnelStateNotificationUseCase
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
import org.junit.jupiter.api.Test
+import org.junit.jupiter.api.assertNull
import org.junit.jupiter.api.extension.ExtendWith
@ExtendWith(TestCoroutineRule::class)
@@ -66,20 +67,20 @@ class TunnelStateNotificationUseCaseTest {
@Test
fun `initial state should be empty`() = runTest {
// Arrange, Act, Assert
- tunnelStateNotificationUseCase().test { assertTrue(awaitItem().isEmpty()) }
+ tunnelStateNotificationUseCase().test { assertNull(awaitItem()) }
}
@Test
fun `when TunnelState is error use case should emit TunnelStateError notification`() = runTest {
tunnelStateNotificationUseCase().test {
// Arrange, Act
- assertLists(emptyList(), awaitItem())
+ assertNull(awaitItem())
val errorState: ErrorState = mockk()
every { errorState.cause } returns mockk()
tunnelState.emit(TunnelState.Error(errorState))
// Assert
- assertEquals(listOf(InAppNotification.TunnelStateError(errorState)), awaitItem())
+ assertEquals(InAppNotification.TunnelStateError(errorState), awaitItem())
}
}
@@ -88,11 +89,11 @@ class TunnelStateNotificationUseCaseTest {
runTest {
tunnelStateNotificationUseCase().test {
// Arrange, Act
- assertLists(emptyList(), awaitItem())
+ assertNull(awaitItem())
tunnelState.emit(TunnelState.Disconnecting(ActionAfterDisconnect.Block))
// Assert
- assertEquals(listOf(InAppNotification.TunnelStateBlocked), awaitItem())
+ assertEquals(InAppNotification.TunnelStateBlocked, awaitItem())
}
}
@@ -101,7 +102,7 @@ class TunnelStateNotificationUseCaseTest {
runTest {
tunnelStateNotificationUseCase().test {
// Arrange, Act
- assertLists(emptyList(), awaitItem())
+ assertNull(awaitItem())
val errorState: ErrorState = mockk()
every { errorState.isBlocking } returns true
every { errorState.cause } returns
@@ -117,7 +118,7 @@ class TunnelStateNotificationUseCaseTest {
// Assert
val item = awaitItem()
assertTrue {
- (item.first() as InAppNotification.TunnelStateError).error.cause is
+ (item as InAppNotification.TunnelStateError).error.cause is
NoRelaysMatchSelectedPort
}
}
@@ -128,7 +129,7 @@ class TunnelStateNotificationUseCaseTest {
runTest {
tunnelStateNotificationUseCase().test {
// Arrange, Act
- assertLists(emptyList(), awaitItem())
+ assertNull(awaitItem())
val errorState: ErrorState = mockk()
every { errorState.isBlocking } returns true
every { errorState.cause } returns
@@ -143,10 +144,9 @@ class TunnelStateNotificationUseCaseTest {
// Assert
val item = awaitItem()
- assertEquals(listOf(InAppNotification.TunnelStateError(errorState)), item)
+ assertEquals(InAppNotification.TunnelStateError(errorState), item)
assertTrue {
- (item.first() as InAppNotification.TunnelStateError).error.cause is
- TunnelParameterError
+ (item as InAppNotification.TunnelStateError).error.cause is TunnelParameterError
}
}
}
diff --git a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/usecase/VersionNotificationUseCaseTest.kt b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/usecase/VersionNotificationUseCaseTest.kt
index 78f2fb72df..9b053e6887 100644
--- a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/usecase/VersionNotificationUseCaseTest.kt
+++ b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/usecase/VersionNotificationUseCaseTest.kt
@@ -6,16 +6,17 @@ import io.mockk.every
import io.mockk.mockk
import io.mockk.unmockkAll
import kotlin.test.assertEquals
-import kotlin.test.assertTrue
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.test.runTest
import net.mullvad.mullvadvpn.lib.common.test.TestCoroutineRule
import net.mullvad.mullvadvpn.lib.model.InAppNotification
import net.mullvad.mullvadvpn.lib.model.VersionInfo
import net.mullvad.mullvadvpn.ui.serviceconnection.AppVersionInfoRepository
+import net.mullvad.mullvadvpn.usecase.inappnotification.VersionNotificationUseCase
import org.junit.jupiter.api.AfterEach
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
+import org.junit.jupiter.api.assertNull
import org.junit.jupiter.api.extension.ExtendWith
@ExtendWith(TestCoroutineRule::class)
@@ -46,7 +47,7 @@ class VersionNotificationUseCaseTest {
@Test
fun `initial state should be empty`() = runTest {
// Arrange, Act, Assert
- versionNotificationUseCase().test { assertTrue { awaitItem().isEmpty() } }
+ versionNotificationUseCase().test { assertNull(awaitItem()) }
}
@Test
@@ -59,10 +60,7 @@ class VersionNotificationUseCaseTest {
versionInfo.value = upgradeVersionInfo
// Assert
- assertEquals(
- awaitItem(),
- listOf(InAppNotification.UnsupportedVersion(upgradeVersionInfo)),
- )
+ assertEquals(awaitItem(), InAppNotification.UnsupportedVersion(upgradeVersionInfo))
}
}
}
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 44f46b2778..519b182caa 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
@@ -124,6 +124,7 @@ class ConnectViewModelTest {
changelogRepository = mockChangelogRepository,
inAppNotificationController = mockInAppNotificationController,
newDeviceRepository = mockk(),
+ userPreferencesRepository = mockk(),
outOfTimeUseCase = outOfTimeUseCase,
paymentUseCase = mockPaymentUseCase,
selectedLocationTitleUseCase = mockSelectedLocationTitleUseCase,