Skip to content

Commit 31da27c

Browse files
committed
Fix remarks
1 parent f6bba17 commit 31da27c

File tree

9 files changed

+316
-105
lines changed

9 files changed

+316
-105
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
package net.mullvad.mullvadvpn.compose.dialog
22

33
import androidx.compose.ui.test.ExperimentalTestApi
4-
import androidx.compose.ui.test.onNodeWithText
4+
import androidx.compose.ui.test.onNodeWithTag
55
import androidx.compose.ui.test.performClick
66
import io.mockk.MockKAnnotations
77
import io.mockk.mockk
88
import io.mockk.verify
99
import net.mullvad.mullvadvpn.compose.createEdgeToEdgeComposeExtension
1010
import net.mullvad.mullvadvpn.compose.setContentWithTheme
11+
import net.mullvad.mullvadvpn.compose.test.RESET_SERVER_IP_OVERRIDE_CANCEL_TEST_TAG
12+
import net.mullvad.mullvadvpn.compose.test.RESET_SERVER_IP_OVERRIDE_RESET_TEST_TAG
1113
import org.junit.jupiter.api.BeforeEach
1214
import org.junit.jupiter.api.Test
1315
import org.junit.jupiter.api.extension.RegisterExtension
@@ -24,53 +26,42 @@ class ResetServerIPOverridesConfirmationDialogTest {
2426
}
2527

2628
@Test
27-
fun givenNameShouldShowDeleteNameTitle() =
29+
fun testCancelClick() =
2830
composeExtension.use {
29-
// Arrange
30-
val name = "List should be deleted"
31-
setContentWithTheme { DeleteCustomListConfirmationDialog(name = name) }
31+
val clickHandler: () -> Unit = mockk(relaxed = true)
3232

33-
// Assert
34-
onNodeWithText(DELETE_TITLE.format(name)).assertExists()
35-
}
36-
37-
@Test
38-
fun whenDeleteIsClickedShouldCallOnDelete() =
39-
composeExtension.use {
4033
// Arrange
41-
val name = "List should be deleted"
42-
val mockedOnDelete: () -> Unit = mockk(relaxed = true)
4334
setContentWithTheme {
44-
DeleteCustomListConfirmationDialog(name = name, onDelete = mockedOnDelete)
35+
ResetServerIpOverridesConfirmationDialog(
36+
onNavigateBack = clickHandler,
37+
onClearAllOverrides = {}
38+
)
4539
}
4640

4741
// Act
48-
onNodeWithText(DELETE_BUTTON_TEXT).performClick()
42+
onNodeWithTag(RESET_SERVER_IP_OVERRIDE_CANCEL_TEST_TAG).performClick()
4943

5044
// Assert
51-
verify { mockedOnDelete.invoke() }
45+
verify { clickHandler() }
5246
}
5347

5448
@Test
55-
fun whenCancelIsClickedShouldCallOnBack() =
49+
fun testResetClick() =
5650
composeExtension.use {
51+
val clickHandler: () -> Unit = mockk(relaxed = true)
52+
5753
// Arrange
58-
val name = "List should be deleted"
59-
val mockedOnBack: () -> Unit = mockk(relaxed = true)
6054
setContentWithTheme {
61-
DeleteCustomListConfirmationDialog(name = name, onBack = mockedOnBack)
55+
ResetServerIpOverridesConfirmationDialog(
56+
onNavigateBack = {},
57+
onClearAllOverrides = clickHandler
58+
)
6259
}
6360

6461
// Act
65-
onNodeWithText(CANCEL_BUTTON_TEXT).performClick()
62+
onNodeWithTag(RESET_SERVER_IP_OVERRIDE_RESET_TEST_TAG).performClick()
6663

6764
// Assert
68-
verify { mockedOnBack.invoke() }
65+
verify { clickHandler() }
6966
}
70-
71-
companion object {
72-
private const val DELETE_TITLE = "Delete \"%s\"?"
73-
private const val CANCEL_BUTTON_TEXT = "Cancel"
74-
private const val DELETE_BUTTON_TEXT = "Delete"
75-
}
7667
}

android/app/src/androidTest/kotlin/net/mullvad/mullvadvpn/compose/screen/ServerIpOverridesScreenTest.kt

+13-7
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,9 @@ class ServerIpOverridesScreenTest {
5454
fun testOverridesInactive() =
5555
composeExtension.use {
5656
// Arrange
57-
setContentWithTheme { ScreenWithDefault(state = ServerIpOverridesViewState(false)) }
57+
setContentWithTheme {
58+
ScreenWithDefault(state = ServerIpOverridesViewState.Loaded(false))
59+
}
5860

5961
// Assert
6062
onNodeWithText("Overrides inactive").assertExists()
@@ -64,7 +66,9 @@ class ServerIpOverridesScreenTest {
6466
fun testOverridesActive() =
6567
composeExtension.use {
6668
// Arrange
67-
setContentWithTheme { ScreenWithDefault(state = ServerIpOverridesViewState(true)) }
69+
setContentWithTheme {
70+
ScreenWithDefault(state = ServerIpOverridesViewState.Loaded(true))
71+
}
6872

6973
// Assert
7074
onNodeWithText("Overrides active").assertExists()
@@ -74,7 +78,9 @@ class ServerIpOverridesScreenTest {
7478
fun testOverridesActiveShowsWarningOnImport() =
7579
composeExtension.use {
7680
// Arrange
77-
setContentWithTheme { ScreenWithDefault(state = ServerIpOverridesViewState(true)) }
81+
setContentWithTheme {
82+
ScreenWithDefault(state = ServerIpOverridesViewState.Loaded(true))
83+
}
7884

7985
// Act
8086
onNodeWithTag(testTag = SERVER_IP_OVERRIDE_IMPORT_TEST_TAG).performClick()
@@ -93,7 +99,7 @@ class ServerIpOverridesScreenTest {
9399
val clickHandler: () -> Unit = mockk(relaxed = true)
94100
setContentWithTheme {
95101
ScreenWithDefault(
96-
state = ServerIpOverridesViewState(false),
102+
state = ServerIpOverridesViewState.Loaded(false),
97103
onInfoClick = clickHandler
98104
)
99105
}
@@ -112,7 +118,7 @@ class ServerIpOverridesScreenTest {
112118
val clickHandler: () -> Unit = mockk(relaxed = true)
113119
setContentWithTheme {
114120
ScreenWithDefault(
115-
state = ServerIpOverridesViewState(true),
121+
state = ServerIpOverridesViewState.Loaded(true),
116122
onResetOverridesClick = clickHandler
117123
)
118124
}
@@ -132,7 +138,7 @@ class ServerIpOverridesScreenTest {
132138
val clickHandler: () -> Unit = mockk(relaxed = true)
133139
setContentWithTheme {
134140
ScreenWithDefault(
135-
state = ServerIpOverridesViewState(false),
141+
state = ServerIpOverridesViewState.Loaded(false),
136142
onImportByFile = clickHandler
137143
)
138144
}
@@ -152,7 +158,7 @@ class ServerIpOverridesScreenTest {
152158
val clickHandler: () -> Unit = mockk(relaxed = true)
153159
setContentWithTheme {
154160
ScreenWithDefault(
155-
state = ServerIpOverridesViewState(false),
161+
state = ServerIpOverridesViewState.Loaded(false),
156162
onImportByText = clickHandler
157163
)
158164
}

android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/cell/ServerIpOverridesCell.kt

+39-29
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import androidx.compose.ui.graphics.Color
1414
import androidx.compose.ui.res.stringResource
1515
import androidx.compose.ui.tooling.preview.Preview
1616
import net.mullvad.mullvadvpn.R
17+
import net.mullvad.mullvadvpn.compose.component.MullvadCircularProgressIndicatorSmall
1718
import net.mullvad.mullvadvpn.lib.theme.AppTheme
1819
import net.mullvad.mullvadvpn.lib.theme.Dimens
1920
import net.mullvad.mullvadvpn.lib.theme.color.AlphaInactive
@@ -28,44 +29,53 @@ private fun PreviewServerIpOverridesCell() {
2829

2930
@Composable
3031
fun ServerIpOverridesCell(
31-
active: Boolean,
32+
active: Boolean?,
3233
modifier: Modifier = Modifier,
3334
activeColor: Color = MaterialTheme.colorScheme.selected,
3435
inactiveColor: Color = MaterialTheme.colorScheme.error,
3536
) {
3637
BaseCell(
3738
modifier = modifier,
3839
iconView = {
39-
Box(
40-
modifier =
41-
Modifier.size(Dimens.relayCircleSize)
42-
.background(
43-
color =
44-
when {
45-
active -> activeColor
46-
else -> inactiveColor
47-
},
48-
shape = CircleShape
49-
)
50-
)
40+
if (active == null) {
41+
MullvadCircularProgressIndicatorSmall()
42+
} else {
43+
Box(
44+
modifier =
45+
Modifier.size(Dimens.relayCircleSize)
46+
.background(
47+
color =
48+
when {
49+
active -> activeColor
50+
else -> inactiveColor
51+
},
52+
shape = CircleShape
53+
)
54+
)
55+
}
5156
},
5257
headlineContent = {
53-
Text(
54-
text =
55-
if (active) stringResource(id = R.string.server_ip_overrides_active)
56-
else stringResource(id = R.string.server_ip_overrides_inactive),
57-
color = MaterialTheme.colorScheme.onPrimary,
58-
modifier =
59-
Modifier.weight(1f)
60-
.alpha(
61-
if (active) {
62-
AlphaVisible
63-
} else {
64-
AlphaInactive
65-
}
66-
)
67-
.padding(horizontal = Dimens.smallPadding, vertical = Dimens.mediumPadding)
68-
)
58+
if (active != null) {
59+
Text(
60+
text =
61+
if (active) stringResource(id = R.string.server_ip_overrides_active)
62+
else stringResource(id = R.string.server_ip_overrides_inactive),
63+
color = MaterialTheme.colorScheme.onPrimary,
64+
modifier =
65+
Modifier.weight(1f)
66+
.alpha(
67+
if (active) {
68+
AlphaVisible
69+
} else {
70+
AlphaInactive
71+
}
72+
)
73+
.padding(
74+
horizontal = Dimens.smallPadding,
75+
vertical = Dimens.mediumPadding
76+
)
77+
)
78+
}
6979
},
7080
isRowEnabled = false
7181
)

android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/ResetServerIpOverridesConfirmationDialog.kt

+10-6
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,17 @@ import androidx.compose.material3.MaterialTheme
66
import androidx.compose.material3.Text
77
import androidx.compose.runtime.Composable
88
import androidx.compose.ui.Modifier
9+
import androidx.compose.ui.platform.testTag
910
import androidx.compose.ui.res.stringResource
1011
import androidx.compose.ui.tooling.preview.Preview
1112
import com.ramcosta.composedestinations.annotation.Destination
12-
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
13+
import com.ramcosta.composedestinations.result.ResultBackNavigator
1314
import com.ramcosta.composedestinations.spec.DestinationStyle
1415
import net.mullvad.mullvadvpn.R
1516
import net.mullvad.mullvadvpn.compose.button.NegativeButton
1617
import net.mullvad.mullvadvpn.compose.button.PrimaryButton
18+
import net.mullvad.mullvadvpn.compose.test.RESET_SERVER_IP_OVERRIDE_CANCEL_TEST_TAG
19+
import net.mullvad.mullvadvpn.compose.test.RESET_SERVER_IP_OVERRIDE_RESET_TEST_TAG
1720
import net.mullvad.mullvadvpn.compose.util.CollectSideEffectWithLifecycle
1821
import net.mullvad.mullvadvpn.lib.theme.AppTheme
1922
import net.mullvad.mullvadvpn.viewmodel.ResetServerIpOverridesConfirmationUiSideEffect
@@ -28,17 +31,17 @@ private fun PreviewResetServerIpOverridesConfirmationDialog() {
2831

2932
@Destination(style = DestinationStyle.Dialog::class)
3033
@Composable
31-
fun ResetServerIpOverridesConfirmation(navigator: DestinationsNavigator) {
34+
fun ResetServerIpOverridesConfirmation(resultBackNavigator: ResultBackNavigator<Boolean>) {
3235
val vm: ResetServerIpOverridesConfirmationViewModel = koinViewModel()
3336
CollectSideEffectWithLifecycle(vm.uiSideEffect) {
3437
when (it) {
3538
ResetServerIpOverridesConfirmationUiSideEffect.OverridesCleared ->
36-
navigator.navigateUp()
39+
resultBackNavigator.navigateBack(result = true)
3740
}
3841
}
3942
ResetServerIpOverridesConfirmationDialog(
4043
onClearAllOverrides = vm::clearAllOverrides,
41-
navigator::navigateUp
44+
resultBackNavigator::navigateBack
4245
)
4346
}
4447

@@ -51,14 +54,15 @@ fun ResetServerIpOverridesConfirmationDialog(
5154
containerColor = MaterialTheme.colorScheme.background,
5255
confirmButton = {
5356
NegativeButton(
54-
modifier = Modifier.fillMaxWidth(),
57+
modifier = Modifier.fillMaxWidth().testTag(RESET_SERVER_IP_OVERRIDE_RESET_TEST_TAG),
5558
text = stringResource(id = R.string.server_ip_overrides_reset_reset_button),
5659
onClick = onClearAllOverrides
5760
)
5861
},
5962
dismissButton = {
6063
PrimaryButton(
61-
modifier = Modifier.fillMaxWidth(),
64+
modifier =
65+
Modifier.fillMaxWidth().testTag(RESET_SERVER_IP_OVERRIDE_CANCEL_TEST_TAG),
6266
text = stringResource(R.string.cancel),
6367
onClick = onNavigateBack
6468
)

0 commit comments

Comments
 (0)