diff options
| author | Kalle Lindström <karl.lindstrom@mullvad.net> | 2025-04-23 11:26:52 +0200 |
|---|---|---|
| committer | Albin <albin@mullvad.net> | 2025-04-28 11:20:54 +0200 |
| commit | 3b9add3fca368d32f9a3dce4112853873251e53a (patch) | |
| tree | 4e03c9ce91f3d1da685e4fcdf40a41c4767bd764 /android | |
| parent | 30f142dd2ab096eeb80354690b754a452ba471cd (diff) | |
| download | mullvadvpn-3b9add3fca368d32f9a3dce4112853873251e53a.tar.xz mullvadvpn-3b9add3fca368d32f9a3dce4112853873251e53a.zip | |
Add mock api test for manage devices screen
Diffstat (limited to 'android')
5 files changed, 66 insertions, 2 deletions
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/AccountScreen.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/AccountScreen.kt index c077f72823..94f72b1b72 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/AccountScreen.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/AccountScreen.kt @@ -18,6 +18,7 @@ import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalUriHandler +import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextDecoration import androidx.compose.ui.tooling.preview.Preview @@ -51,6 +52,7 @@ import net.mullvad.mullvadvpn.compose.component.ScaffoldWithMediumTopBar import net.mullvad.mullvadvpn.compose.extensions.createOpenAccountPageHook import net.mullvad.mullvadvpn.compose.extensions.dropUnlessResumed import net.mullvad.mullvadvpn.compose.preview.AccountUiStatePreviewParameterProvider +import net.mullvad.mullvadvpn.compose.test.MANAGE_DEVICES_BUTTON_TEST_TAG import net.mullvad.mullvadvpn.compose.transitions.AccountTransition import net.mullvad.mullvadvpn.compose.util.CollectSideEffectWithLifecycle import net.mullvad.mullvadvpn.compose.util.SecureScreenWhileInView @@ -232,6 +234,7 @@ private fun DeviceNameRow(deviceName: String, onManageDevicesClick: () -> Unit) InformationView(content = deviceName, whenMissing = MissingPolicy.SHOW_SPINNER) Spacer(modifier = Modifier.weight(1f)) PrimaryTextButton( + modifier = Modifier.testTag(MANAGE_DEVICES_BUTTON_TEST_TAG), onClick = onManageDevicesClick, text = stringResource(R.string.manage_devices), textDecoration = TextDecoration.Underline, diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/test/ComposeTestTagConstants.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/test/ComposeTestTagConstants.kt index 4b6a339f61..8c00afd227 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/test/ComposeTestTagConstants.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/test/ComposeTestTagConstants.kt @@ -33,6 +33,9 @@ const val WIREGUARD_OBFUSCATION_UDP_OVER_TCP_CELL = "wireguard_obfuscation_udp_over_tcp_cell_test_tag" const val QUANTUM_RESISTANCE_OFF_CELL = "quantum_resistance_off_cell_test_tag" +// Account screen +const val MANAGE_DEVICES_BUTTON_TEST_TAG = "manage_devices_button_test_tag" + // SelectLocationScreen, ConnectScreen, CustomListLocationsScreen const val SELECT_LOCATION_SCREEN_TEST_TAG = "select_location_screen_test_tag" const val CIRCULAR_PROGRESS_INDICATOR = "circular_progress_indicator" diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/ManageDevicesViewModel.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/ManageDevicesViewModel.kt index 9e8dfde0a8..53533264f1 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/ManageDevicesViewModel.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/ManageDevicesViewModel.kt @@ -62,7 +62,7 @@ class ManageDevicesViewModel( // Put the current device first in the list, but otherwise keep the sort order. val devices = toMutableList() devices - .indexOfFirst { it.device == currentDevice } + .indexOfFirst { it.device.id == currentDevice.id } .let { index -> if (index > 0) { devices.add(0, devices.removeAt(index)) @@ -73,7 +73,7 @@ class ManageDevicesViewModel( ManageDevicesItemUiState( device = it.device, isLoading = it.isLoading, - isCurrentDevice = it.device == currentDevice, + isCurrentDevice = it.device.id == currentDevice.id, ) } } diff --git a/android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/ManageDevicesMockApiTest.kt b/android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/ManageDevicesMockApiTest.kt new file mode 100644 index 0000000000..5852bb9bb3 --- /dev/null +++ b/android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/ManageDevicesMockApiTest.kt @@ -0,0 +1,51 @@ +package net.mullvad.mullvadvpn.test.mockapi + +import androidx.test.uiautomator.By +import java.time.ZonedDateTime +import net.mullvad.mullvadvpn.test.common.extension.clickAgreeOnPrivacyDisclaimer +import net.mullvad.mullvadvpn.test.common.extension.clickAllowOnNotificationPermissionPromptIfApiLevel33AndAbove +import net.mullvad.mullvadvpn.test.common.extension.dismissChangelogDialogIfShown +import net.mullvad.mullvadvpn.test.common.extension.findObjectWithTimeout +import net.mullvad.mullvadvpn.test.mockapi.constant.ALMOST_FULL_DEVICE_LIST +import net.mullvad.mullvadvpn.test.mockapi.constant.DUMMY_DEVICE_NAME_1 +import net.mullvad.mullvadvpn.test.mockapi.constant.DUMMY_ID_1 +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.assertNull + +class ManageDevicesMockApiTest : MockApiTest() { + @Test + fun testManageDevicesRemoveDevice() { + // Arrange + val validAccountNumber = "1234123412341234" + apiDispatcher.apply { + expectedAccountNumber = validAccountNumber + accountExpiry = ZonedDateTime.now().plusMonths(1) + devices = ALMOST_FULL_DEVICE_LIST.toMutableMap() + devicePendingToGetCreated = DUMMY_ID_1 to DUMMY_DEVICE_NAME_1 + } + + // Act - go to devices screen + app.launch(endpoint) + device.clickAgreeOnPrivacyDisclaimer() + device.clickAllowOnNotificationPermissionPromptIfApiLevel33AndAbove() + app.waitForLoginPrompt() + app.attemptLogin(validAccountNumber) + device.waitForIdle() + device.dismissChangelogDialogIfShown() + app.ensureLoggedIn() + app.clickAccountCog() + device.findObject(By.res("manage_devices_button_test_tag")).click() + + // Assert - current device is shown but not clickable + val current = device.findObjectWithTimeout(By.text("Current device")).parent + assertNull(current.findObject(By.clickable(true))) + + // Act - remove another device in the list + val secondDevice = device.findObjectWithTimeout(By.text("Yellow Hat")).parent + secondDevice.findObject(By.clickable(true)).click() + app.clickActionButtonByText("Remove") + + // Assert - the other device is no longer shown + assertNull(device.findObject(By.text("Yellow Hat"))) + } +} diff --git a/android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/constant/Constants.kt b/android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/constant/Constants.kt index e11e14879e..083fcc1160 100644 --- a/android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/constant/Constants.kt +++ b/android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/constant/Constants.kt @@ -33,3 +33,10 @@ val FULL_DEVICE_LIST = DUMMY_ID_4 to DUMMY_DEVICE_NAME_4, DUMMY_ID_5 to DUMMY_DEVICE_NAME_5, ) +val ALMOST_FULL_DEVICE_LIST = + mapOf( + DUMMY_ID_1 to DUMMY_DEVICE_NAME_1, + DUMMY_ID_2 to DUMMY_DEVICE_NAME_2, + DUMMY_ID_3 to DUMMY_DEVICE_NAME_3, + DUMMY_ID_4 to DUMMY_DEVICE_NAME_4, + ) |
