Skip to content

Commit d46c02a

Browse files
committed
refactor(test): Replace retry helpers with waitUntilDoesNotExist
- Remove the custom `retryUntil` and `retryUntilNotDisplayed` helper functions from `ext.kt`. - Introduce a new `waitUntilNotExist` extension function for `ComposeUiTest` that uses the standard `waitUntilDoesNotExist` with a timeout. - Update `SettingPasswordTestCase` to use `waitUntilNotExist` instead of a custom wait assertion (`waitAssert` with `assertIsNotDisplayed`) to check for a dialog's disappearance.
1 parent ac0222c commit d46c02a

File tree

2 files changed

+11
-39
lines changed

2 files changed

+11
-39
lines changed

ui/test/src/commonMain/kotlin/com/softartdev/notedelight/ext.kt

Lines changed: 7 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -6,31 +6,15 @@ import androidx.compose.ui.test.ComposeUiTest
66
import androidx.compose.ui.test.ExperimentalTestApi
77
import androidx.compose.ui.test.SemanticsNodeInteraction
88
import androidx.compose.ui.test.assertIsDisplayed
9-
import androidx.compose.ui.test.assertIsNotDisplayed
109
import androidx.compose.ui.test.assertIsSelectable
1110
import androidx.compose.ui.test.assertIsSelected
12-
import androidx.compose.ui.test.isNotDisplayed
11+
import androidx.compose.ui.test.hasTestTag
12+
import androidx.compose.ui.test.waitUntilDoesNotExist
1313
import co.touchlab.kermit.Logger
1414

1515
const val ASSERT_WAIT_TIMEOUT_MILLIS: Long = 5_000
1616
const val MAX_RETRY_ATTEMPTS = 100
1717

18-
inline fun retryUntil(
19-
description: String,
20-
action: () -> Unit,
21-
assertion: () -> SemanticsNodeInteraction,
22-
): SemanticsNodeInteraction {
23-
var asserted: Boolean = runCatching(assertion).isSuccess
24-
var retries = 0
25-
while (!asserted && retries < MAX_RETRY_ATTEMPTS) {
26-
retries++
27-
runCatching(action)
28-
asserted = runCatching(assertion).isSuccess
29-
}
30-
Logger.withTag("ℹ️retryUntil").i { "After $retries retries is $asserted for $description" }
31-
return assertion.invoke()
32-
}
33-
3418
inline fun retryUntilDisplayed(
3519
description: String,
3620
action: () -> Unit,
@@ -47,22 +31,6 @@ inline fun retryUntilDisplayed(
4731
return sni.assertIsDisplayed()
4832
}
4933

50-
inline fun retryUntilNotDisplayed(
51-
description: String,
52-
action: () -> Unit,
53-
sni: SemanticsNodeInteraction,
54-
): SemanticsNodeInteraction {
55-
var notDisplayed: Boolean = sni.isNotDisplayed()
56-
var retries = 0
57-
while (!notDisplayed && retries < MAX_RETRY_ATTEMPTS) {
58-
runCatching(action)
59-
retries++
60-
notDisplayed = sni.isNotDisplayed()
61-
}
62-
Logger.withTag("retryUntilNotDisplayed").i { "After $retries retries is $notDisplayed for $description" }
63-
return sni.assertIsNotDisplayed()
64-
}
65-
6634
inline fun ComposeUiTest.waitUntilDisplayed(
6735
description: String,
6836
crossinline blockSNI: () -> SemanticsNodeInteraction,
@@ -76,6 +44,11 @@ inline fun ComposeUiTest.waitUntilDisplayed(
7644
return@waitUntil true
7745
}
7846

47+
fun ComposeUiTest.waitUntilNotExist(tag: String) = waitUntilDoesNotExist(
48+
matcher = hasTestTag(tag),
49+
timeoutMillis = ASSERT_WAIT_TIMEOUT_MILLIS,
50+
)
51+
7952
inline fun ComposeUiTest.waitAssert(
8053
description: String,
8154
crossinline assert: () -> Unit

ui/test/src/commonMain/kotlin/com/softartdev/notedelight/ui/cases/SettingPasswordTestCase.kt

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ package com.softartdev.notedelight.ui.cases
55
import androidx.compose.ui.test.ComposeUiTest
66
import androidx.compose.ui.test.ExperimentalTestApi
77
import androidx.compose.ui.test.assertIsDisplayed
8-
import androidx.compose.ui.test.assertIsNotDisplayed
98
import androidx.compose.ui.test.assertIsOff
109
import androidx.compose.ui.test.assertIsOn
1110
import androidx.compose.ui.test.assertTextEquals
@@ -14,8 +13,10 @@ import androidx.compose.ui.test.performTextReplacement
1413
import co.touchlab.kermit.Logger
1514
import com.softartdev.notedelight.retryUntilDisplayed
1615
import com.softartdev.notedelight.ui.BaseTestCase
16+
import com.softartdev.notedelight.ui.dialog.security.CHANGE_PASSWORD_DIALOG_TAG
1717
import com.softartdev.notedelight.waitAssert
1818
import com.softartdev.notedelight.waitUntilDisplayed
19+
import com.softartdev.notedelight.waitUntilNotExist
1920
import kotlinx.coroutines.test.TestResult
2021
import kotlinx.coroutines.test.runTest
2122
import notedelight.ui.shared.generated.resources.Res
@@ -132,10 +133,8 @@ class SettingPasswordTestCase(
132133
closeSoftKeyboard()
133134
dialogSNI.assertIsDisplayed()
134135
confirmDialogButtonSNI.performClick()
135-
composeUiTest.waitAssert(
136-
description = "ChangePasswordDialog is not displayed",
137-
assert = dialogSNI::assertIsNotDisplayed
138-
)
136+
composeUiTest.awaitIdle()
137+
composeUiTest.waitUntilNotExist(tag = CHANGE_PASSWORD_DIALOG_TAG)
139138
}
140139
logger.i { "SettingsTestScreen: Changing password completed, proceeding to disable encryption" }
141140
encryptionSwitchSNI

0 commit comments

Comments
 (0)