diff options
| author | David Göransson <david.goransson@mullvad.net> | 2025-10-02 11:27:53 +0200 |
|---|---|---|
| committer | Jonatan Rhodin <jonatan.rhodin@mullvad.net> | 2025-10-06 11:43:15 +0200 |
| commit | d229d24b508f97c24fcc0a4a2db4f845141fd931 (patch) | |
| tree | 19241200a1830c7c5b8703714d2055b8d87619e7 /android/app/src/test | |
| parent | f82099962e5160b4577038b794170fa2f70ed546 (diff) | |
| download | mullvadvpn-d229d24b508f97c24fcc0a4a2db4f845141fd931.tar.xz mullvadvpn-d229d24b508f97c24fcc0a4a2db4f845141fd931.zip | |
Warn users about android 16 upgrade issue
Diffstat (limited to 'android/app/src/test')
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, |
