diff options
12 files changed, 67 insertions, 75 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 c9cfb0e75c..91749b468e 100644 --- a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/InAppNotificationControllerTest.kt +++ b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/InAppNotificationControllerTest.kt @@ -44,11 +44,10 @@ class InAppNotificationControllerTest { val newDeviceNotificationUseCase: NewDeviceNotificationUseCase = mockk() val versionNotificationUseCase: VersionNotificationUseCase = mockk() val tunnelStateNotificationUseCase: TunnelStateNotificationUseCase = mockk() - every { accountExpiryNotificationUseCase.notifications() } returns - accountExpiryNotifications - every { newDeviceNotificationUseCase.notifications() } returns newDeviceNotifications - every { versionNotificationUseCase.notifications() } returns versionNotifications - every { tunnelStateNotificationUseCase.notifications() } returns tunnelStateNotifications + every { accountExpiryNotificationUseCase.invoke() } returns accountExpiryNotifications + every { newDeviceNotificationUseCase.invoke() } returns newDeviceNotifications + every { versionNotificationUseCase.invoke() } returns versionNotifications + every { tunnelStateNotificationUseCase.invoke() } returns tunnelStateNotifications job = Job() inAppNotificationController = diff --git a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/usecase/NewDeviceUseNotificationCaseTest.kt b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/usecase/NewDeviceNotificationUseCaseTest.kt index ec487815e1..0ed49aae7f 100644 --- a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/usecase/NewDeviceUseNotificationCaseTest.kt +++ b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/usecase/NewDeviceNotificationUseCaseTest.kt @@ -3,7 +3,7 @@ package net.mullvad.mullvadvpn.usecase import app.cash.turbine.test import io.mockk.MockKAnnotations import io.mockk.every -import io.mockk.mockk +import io.mockk.impl.annotations.MockK import io.mockk.unmockkAll import kotlin.test.assertEquals import kotlin.test.assertTrue @@ -17,6 +17,7 @@ import net.mullvad.mullvadvpn.lib.model.DeviceId import net.mullvad.mullvadvpn.lib.model.DeviceState import net.mullvad.mullvadvpn.lib.shared.DeviceRepository import net.mullvad.mullvadvpn.repository.InAppNotification +import net.mullvad.mullvadvpn.repository.NewDeviceRepository import org.joda.time.DateTime import org.junit.jupiter.api.AfterEach import org.junit.jupiter.api.BeforeEach @@ -24,7 +25,7 @@ import org.junit.jupiter.api.Test import org.junit.jupiter.api.extension.ExtendWith @ExtendWith(TestCoroutineRule::class) -class NewDeviceUseNotificationCaseTest { +class NewDeviceNotificationUseCaseTest { private val deviceName = "Frank Zebra" private val deviceState = @@ -38,16 +39,26 @@ class NewDeviceUseNotificationCaseTest { ) ) ) + private val isNewDeviceState = MutableStateFlow(false) + private lateinit var newDeviceNotificationUseCase: NewDeviceNotificationUseCase + @MockK lateinit var mockDeviceRepository: DeviceRepository + + @MockK lateinit var mockNewDeviceRepository: NewDeviceRepository + @BeforeEach fun setup() { MockKAnnotations.init(this) - val mockDeviceRepository: DeviceRepository = mockk() + every { mockNewDeviceRepository.isNewDevice } returns isNewDeviceState every { mockDeviceRepository.deviceState } returns deviceState + newDeviceNotificationUseCase = - NewDeviceNotificationUseCase(deviceRepository = mockDeviceRepository) + NewDeviceNotificationUseCase( + newDeviceRepository = mockNewDeviceRepository, + deviceRepository = mockDeviceRepository + ) } @AfterEach @@ -62,26 +73,27 @@ class NewDeviceUseNotificationCaseTest { } @Test - fun `when newDeviceCreated is called notifications should emit NewDevice notification containing device name`() = - runTest { - newDeviceNotificationUseCase().test { - // Arrange, Act - awaitItem() - newDeviceNotificationUseCase.newDeviceCreated() + fun `when a new device has been created a device notification should be emitted`() = runTest { + newDeviceNotificationUseCase().test { + // Arrange, Act + awaitItem() + newDeviceNotificationUseCase.invoke() + isNewDeviceState.value = true - // Assert - assertEquals(awaitItem(), listOf(InAppNotification.NewDevice(deviceName))) - } + // Assert + assertEquals(awaitItem(), listOf(InAppNotification.NewDevice(deviceName))) } + } @Test - fun `clearNewDeviceCreatedNotification should clear notifications`() = runTest { + fun `when a device is unmarked as new the device notification should be cleared`() = runTest { + // Arrange + isNewDeviceState.value = true + + // Act newDeviceNotificationUseCase().test { - // Arrange, Act - awaitItem() - newDeviceNotificationUseCase.newDeviceCreated() awaitItem() - newDeviceNotificationUseCase.clearNewDeviceCreatedNotification() + isNewDeviceState.value = false // Assert assertEquals(awaitItem(), emptyList()) 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 a2fd9e38fb..e6803d4e08 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 @@ -115,8 +115,7 @@ class ConnectViewModelTest { every { mockLocation.country } returns "dummy country" // Flows - every { mockSelectedLocationTitleUseCase.selectedLocationTitle() } returns - selectedRelayItemFlow + every { mockSelectedLocationTitleUseCase() } returns selectedRelayItemFlow every { outOfTimeUseCase.isOutOfTime } returns outOfTimeViewFlow viewModel = @@ -124,7 +123,7 @@ class ConnectViewModelTest { accountRepository = mockAccountRepository, deviceRepository = mockDeviceRepository, inAppNotificationController = mockInAppNotificationController, - newDeviceNotificationUseCase = mockk(), + newDeviceRepository = mockk(), outOfTimeUseCase = outOfTimeUseCase, paymentUseCase = mockPaymentUseCase, selectedLocationTitleUseCase = mockSelectedLocationTitleUseCase, diff --git a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/CreateCustomListDialogViewModelTest.kt b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/CreateCustomListDialogViewModelTest.kt index 83675794f5..efdf08447d 100644 --- a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/CreateCustomListDialogViewModelTest.kt +++ b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/CreateCustomListDialogViewModelTest.kt @@ -33,9 +33,8 @@ class CreateCustomListDialogViewModelTest { val expectedResult: Created = mockk() val customListName = "list" val viewModel = createViewModelWithLocationCode(GeoLocationId.Country("AB")) - coEvery { - mockCustomListActionUseCase.performAction(any<CustomListAction.Create>()) - } returns expectedResult.right() + coEvery { mockCustomListActionUseCase(any<CustomListAction.Create>()) } returns + expectedResult.right() every { expectedResult.locationNames } returns listOf("locationName") // Act, Assert @@ -61,9 +60,8 @@ class CreateCustomListDialogViewModelTest { undo = CustomListAction.Delete(createdId) ) val viewModel = createViewModelWithLocationCode(GeoLocationId.Country("AB")) - coEvery { - mockCustomListActionUseCase.performAction(any<CustomListAction.Create>()) - } returns expectedResult.right() + coEvery { mockCustomListActionUseCase(any<CustomListAction.Create>()) } returns + expectedResult.right() // Act, Assert viewModel.uiSideEffect.test { @@ -82,9 +80,8 @@ class CreateCustomListDialogViewModelTest { val expectedError = CreateWithLocationsError.Create(CustomListAlreadyExists) val customListName = "list" val viewModel = createViewModelWithLocationCode(GeoLocationId.Country("AB")) - coEvery { - mockCustomListActionUseCase.performAction(any<CustomListAction.Create>()) - } returns expectedError.left() + coEvery { mockCustomListActionUseCase(any<CustomListAction.Create>()) } returns + expectedError.left() // Act, Assert viewModel.uiState.test { @@ -101,9 +98,8 @@ class CreateCustomListDialogViewModelTest { val expectedError = CreateWithLocationsError.Create(CustomListAlreadyExists) val customListName = "list" val viewModel = createViewModelWithLocationCode(GeoLocationId.Country("AB")) - coEvery { - mockCustomListActionUseCase.performAction(any<CustomListAction.Create>()) - } returns expectedError.left() + coEvery { mockCustomListActionUseCase(any<CustomListAction.Create>()) } returns + expectedError.left() // Act, Assert viewModel.uiState.test { diff --git a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/CustomListLocationsViewModelTest.kt b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/CustomListLocationsViewModelTest.kt index 321e2d53b5..20130018d8 100644 --- a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/CustomListLocationsViewModelTest.kt +++ b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/CustomListLocationsViewModelTest.kt @@ -41,8 +41,7 @@ class CustomListLocationsViewModelTest { @BeforeEach fun setup() { every { mockRelayListRepository.relayList } returns relayListFlow - every { mockCustomListRelayItemsUseCase.getRelayItemLocationsForCustomList(any()) } returns - selectedLocationsFlow + every { mockCustomListRelayItemsUseCase(any()) } returns selectedLocationsFlow } @Test @@ -185,9 +184,8 @@ class CustomListLocationsViewModelTest { val customListId = CustomListId("1") val newList = true val expectedResult: LocationsChanged = mockk() - coEvery { - mockCustomListUseCase.performAction(any<CustomListAction.UpdateLocations>()) - } returns expectedResult.right() + coEvery { mockCustomListUseCase(any<CustomListAction.UpdateLocations>()) } returns + expectedResult.right() val viewModel = createViewModel(customListId, newList) // Act, Assert @@ -205,9 +203,8 @@ class CustomListLocationsViewModelTest { val customListId = CustomListId("1") val newList = false val expectedResult: LocationsChanged = mockk() - coEvery { - mockCustomListUseCase.performAction(any<CustomListAction.UpdateLocations>()) - } returns expectedResult.right() + coEvery { mockCustomListUseCase(any<CustomListAction.UpdateLocations>()) } returns + expectedResult.right() val viewModel = createViewModel(customListId, newList) // Act, Assert diff --git a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/CustomListsViewModelTest.kt b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/CustomListsViewModelTest.kt index ed615fe0af..bddb36e446 100644 --- a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/CustomListsViewModelTest.kt +++ b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/CustomListsViewModelTest.kt @@ -43,7 +43,7 @@ class CustomListsViewModelTest { viewModel.undoDeleteCustomList(action) // Assert - coVerify { mockCustomListsActionUseCase.performAction(action) } + coVerify { mockCustomListsActionUseCase(action) } } private fun createViewModel() = diff --git a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/DeleteCustomListConfirmationViewModelTest.kt b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/DeleteCustomListConfirmationViewModelTest.kt index 6356719c42..66307a499d 100644 --- a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/DeleteCustomListConfirmationViewModelTest.kt +++ b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/DeleteCustomListConfirmationViewModelTest.kt @@ -24,9 +24,8 @@ class DeleteCustomListConfirmationViewModelTest { // Arrange val expectedResult: Deleted = mockk() val viewModel = createViewModel() - coEvery { - mockCustomListActionUseCase.performAction(any<CustomListAction.Delete>()) - } returns expectedResult.right() + coEvery { mockCustomListActionUseCase(any<CustomListAction.Delete>()) } returns + expectedResult.right() // Act, Assert viewModel.uiSideEffect.test { diff --git a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/EditCustomListNameDialogViewModelTest.kt b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/EditCustomListNameDialogViewModelTest.kt index 29afc8de0d..130ca21ece 100644 --- a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/EditCustomListNameDialogViewModelTest.kt +++ b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/EditCustomListNameDialogViewModelTest.kt @@ -31,9 +31,8 @@ class EditCustomListNameDialogViewModelTest { val customListId = CustomListId("id") val customListName = "list" val viewModel = createViewModel(customListId, customListName) - coEvery { - mockCustomListActionUseCase.performAction(any<CustomListAction.Rename>()) - } returns expectedResult.right() + coEvery { mockCustomListActionUseCase(any<CustomListAction.Rename>()) } returns + expectedResult.right() // Act, Assert viewModel.uiSideEffect.test { @@ -51,9 +50,8 @@ class EditCustomListNameDialogViewModelTest { val customListName = "list2" val expectedError = RenameError(NameAlreadyExists(customListName)) val viewModel = createViewModel(customListId, customListName) - coEvery { - mockCustomListActionUseCase.performAction(any<CustomListAction.Rename>()) - } returns expectedError.left() + coEvery { mockCustomListActionUseCase(any<CustomListAction.Rename>()) } returns + expectedError.left() // Act, Assert viewModel.uiState.test { @@ -71,9 +69,8 @@ class EditCustomListNameDialogViewModelTest { val customListName = "list" val expectedError = RenameError(NameAlreadyExists(customListName)) val viewModel = createViewModel(customListId, customListName) - coEvery { - mockCustomListActionUseCase.performAction(any<CustomListAction.Rename>()) - } returns expectedError.left() + coEvery { mockCustomListActionUseCase(any<CustomListAction.Rename>()) } returns + expectedError.left() // Act, Assert viewModel.uiState.test { 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 index 5333a481be..dc83223394 100644 --- a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/FilterViewModelTest.kt +++ b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/FilterViewModelTest.kt @@ -66,8 +66,7 @@ class FilterViewModelTest { @BeforeEach fun setup() { every { mockRelayListFilterRepository.selectedOwnership } returns selectedOwnership - every { mockAvailableProvidersUseCase.availableProviders() } returns - flowOf(dummyListOfAllProviders) + every { mockAvailableProvidersUseCase() } returns flowOf(dummyListOfAllProviders) every { mockRelayListFilterRepository.selectedProviders } returns MutableStateFlow( Constraint.Only(Providers(mockSelectedProviders.map { it.providerId }.toSet())) diff --git a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/LoginViewModelTest.kt b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/LoginViewModelTest.kt index f95720de14..c0bf5a135d 100644 --- a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/LoginViewModelTest.kt +++ b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/LoginViewModelTest.kt @@ -28,7 +28,6 @@ import net.mullvad.mullvadvpn.lib.model.AccountNumber import net.mullvad.mullvadvpn.lib.model.LoginAccountError import net.mullvad.mullvadvpn.lib.shared.AccountRepository import net.mullvad.mullvadvpn.usecase.InternetAvailableUseCase -import net.mullvad.mullvadvpn.usecase.NewDeviceNotificationUseCase import org.joda.time.DateTime import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.BeforeEach @@ -40,7 +39,6 @@ class LoginViewModelTest { @MockK private lateinit var connectivityUseCase: InternetAvailableUseCase @MockK private lateinit var mockedAccountRepository: AccountRepository - @MockK private lateinit var mockedNewDeviceNotificationUseCase: NewDeviceNotificationUseCase private lateinit var loginViewModel: LoginViewModel @@ -49,13 +47,12 @@ class LoginViewModelTest { Dispatchers.setMain(UnconfinedTestDispatcher()) MockKAnnotations.init(this, relaxUnitFun = true) every { connectivityUseCase() } returns true - every { mockedNewDeviceNotificationUseCase.newDeviceCreated() } returns Unit coEvery { mockedAccountRepository.fetchAccountHistory() } returns null loginViewModel = LoginViewModel( accountRepository = mockedAccountRepository, - newDeviceNotificationUseCase = mockedNewDeviceNotificationUseCase, + newDeviceRepository = mockk(relaxUnitFun = true), internetAvailableUseCase = connectivityUseCase, UnconfinedTestDispatcher() ) 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 80f62dba4a..28f52ba261 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 @@ -65,11 +65,10 @@ class SelectLocationViewModelTest { every { mockRelayListFilterRepository.selectedOwnership } returns selectedOwnership every { mockRelayListFilterRepository.selectedProviders } returns selectedProviders - every { mockAvailableProvidersUseCase.availableProviders() } returns allProviders + every { mockAvailableProvidersUseCase() } returns allProviders every { mockRelayListRepository.selectedLocation } returns selectedRelayItemFlow - every { mockFilteredRelayListUseCase.filteredRelayList() } returns filteredRelayList - every { mockCustomListsRelayItemUseCase.relayItemCustomLists() } returns - customRelayListItems + every { mockFilteredRelayListUseCase() } returns filteredRelayList + every { mockCustomListsRelayItemUseCase() } returns customRelayListItems mockkStatic(RELAY_LIST_EXTENSIONS) mockkStatic(RELAY_ITEM_EXTENSIONS) @@ -247,7 +246,7 @@ class SelectLocationViewModelTest { viewModel.performAction(action) // Assert - coVerify { mockCustomListActionUseCase.performAction(action) } + coVerify { mockCustomListActionUseCase(action) } } @Test @@ -265,9 +264,8 @@ class SelectLocationViewModelTest { locations = emptyList(), expanded = false ) - coEvery { - mockCustomListActionUseCase.performAction(any<CustomListAction.UpdateLocations>()) - } returns expectedResult.right() + coEvery { mockCustomListActionUseCase(any<CustomListAction.UpdateLocations>()) } returns + expectedResult.right() // Act, Assert viewModel.uiSideEffect.test { diff --git a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/VpnSettingsViewModelTest.kt b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/VpnSettingsViewModelTest.kt index ac84d86ea8..add2ee8580 100644 --- a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/VpnSettingsViewModelTest.kt +++ b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/VpnSettingsViewModelTest.kt @@ -182,8 +182,7 @@ class VpnSettingsViewModelTest { runTest { val systemVpnSettingsAvailable = true - every { mockSystemVpnSettingsUseCase.systemVpnSettingsAvailable() } returns - systemVpnSettingsAvailable + every { mockSystemVpnSettingsUseCase() } returns systemVpnSettingsAvailable viewModel.uiState.test { assertEquals(systemVpnSettingsAvailable, awaitItem().systemVpnSettingsAvailable) |
