diff --git a/common/src/main/java/com/progressive/kherkin/common/screen/Trait.kt b/common/src/main/java/com/progressive/kherkin/common/screen/Trait.kt index 496eb4f..bd2d11b 100644 --- a/common/src/main/java/com/progressive/kherkin/common/screen/Trait.kt +++ b/common/src/main/java/com/progressive/kherkin/common/screen/Trait.kt @@ -12,20 +12,30 @@ class Trait { @IdRes val viewId: Int val text: String? + val tag: String? constructor(@IdRes viewId: Int) { this.viewId = viewId text = null + tag = null } constructor(text: String) { viewId = -1 this.text = text + tag = null } constructor(@IdRes viewId: Int, text: String) { this.viewId = viewId this.text = text + tag = null + } + + constructor(text: String, tag: String) { + this.text = text + this.tag = tag + this.viewId = -1 } companion object { diff --git a/compose/src/main/java/com/progressive/kherkin/compose/steps/setup/TraitVerifier.kt b/compose/src/main/java/com/progressive/kherkin/compose/steps/setup/TraitVerifier.kt index e94287e..3429d25 100644 --- a/compose/src/main/java/com/progressive/kherkin/compose/steps/setup/TraitVerifier.kt +++ b/compose/src/main/java/com/progressive/kherkin/compose/steps/setup/TraitVerifier.kt @@ -1,8 +1,12 @@ package com.progressive.kherkin.compose.steps.setup import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.hasTestTag +import androidx.compose.ui.test.hasText import androidx.compose.ui.test.junit4.ComposeTestRule +import androidx.compose.ui.test.onAllNodesWithTag import androidx.compose.ui.test.onAllNodesWithText +import androidx.compose.ui.test.onNodeWithTag import androidx.compose.ui.test.onNodeWithText import com.progressive.kherkin.common.screen.IScreen import com.progressive.kherkin.common.screen.Screen @@ -18,24 +22,51 @@ import com.progressive.kherkin.common.testcore.IntegrationTestLogger object TraitVerifier { @JvmStatic - fun verifyTrait(screen: IScreen, composeTestRule: ComposeTestRule, timeoutInMillis: Long = 2000) { + fun verifyTrait( + screen: IScreen, + composeTestRule: ComposeTestRule, + timeoutInMillis: Long = 2000 + ) { val trait = screen.trait - if (trait.text == null) { - val logger = IntegrationTestLogger() - logger.info("ScreenActivityName: $screen") - throw RuntimeException("Timed out waiting for activity: $screen, no trait text found.") - } - trait.text.let { - if (it == null) { - return + val tag = screen.trait.tag + val text = screen.trait.text + when { + tag != null && text != null -> { + val tag = trait.tag ?: return + val text = trait.text ?: return + composeTestRule.waitUntil(timeoutInMillis) { + composeTestRule + .onAllNodes(hasTestTag(tag).and(hasText(text))) + .fetchSemanticsNodes().size == 1 + } + ComposeTestLogger().info("${::verifyTrait.name}: onNode(hasTestTag($tag).and(hasText($text))).assertIsDisplayed()") + composeTestRule.onNode(hasTestTag(tag).and(hasText(text))).assertIsDisplayed() + } + + text != null -> { + composeTestRule.waitUntil(timeoutInMillis) { + composeTestRule + .onAllNodesWithText(text) + .fetchSemanticsNodes().size == 1 + } + ComposeTestLogger().info("${::verifyTrait.name}: onNodeWithText($text).assertIsDisplayed()") + composeTestRule.onNodeWithText(text).assertIsDisplayed() } - composeTestRule.waitUntil(timeoutInMillis) { - composeTestRule - .onAllNodesWithText(it) - .fetchSemanticsNodes().size == 1 + + tag != null -> { + composeTestRule.waitUntil(timeoutInMillis) { + composeTestRule + .onAllNodesWithTag(tag) + .fetchSemanticsNodes().size == 1 + } + ComposeTestLogger().info("${::verifyTrait.name}: onNodeWithTag($tag).assertIsDisplayed()") + composeTestRule.onNodeWithTag(tag).assertIsDisplayed() + } + + else -> { + IntegrationTestLogger().info("ScreenActivityName: $screen") + throw RuntimeException("Timed out waiting for activity: $screen, no traits found.") } - ComposeTestLogger().info("${::verifyTrait.name}: onNodeWithText($it).assertIsDisplayed()") - composeTestRule.onNodeWithText(it).assertIsDisplayed() } } } \ No newline at end of file diff --git a/sampleapp/src/androidTest/java/com/progressive/sampleapp/screens/compose/FinalComposeScreen.kt b/sampleapp/src/androidTest/java/com/progressive/sampleapp/screens/compose/FinalComposeScreen.kt index e2519ca..3e73625 100644 --- a/sampleapp/src/androidTest/java/com/progressive/sampleapp/screens/compose/FinalComposeScreen.kt +++ b/sampleapp/src/androidTest/java/com/progressive/sampleapp/screens/compose/FinalComposeScreen.kt @@ -14,7 +14,7 @@ import com.progressive.sampleapp.activities.compose.FinalComposeActivity class FinalComposeScreen : Screen(), ComposeNavigable { override lateinit var activityScenario: ActivityScenario - override val trait: Trait = Trait("Final Compose Activity") + override val trait: Trait = Trait("Final Compose Activity", "Final Compose Title Tag") override fun screenActivityClass(): Class = FinalComposeActivity::class.java override fun startMyActivity() { diff --git a/sampleapp/src/main/java/com/progressive/sampleapp/activities/compose/FinalComposeActivity.kt b/sampleapp/src/main/java/com/progressive/sampleapp/activities/compose/FinalComposeActivity.kt index 9cef707..01b8cd8 100644 --- a/sampleapp/src/main/java/com/progressive/sampleapp/activities/compose/FinalComposeActivity.kt +++ b/sampleapp/src/main/java/com/progressive/sampleapp/activities/compose/FinalComposeActivity.kt @@ -49,7 +49,8 @@ private fun SetupFinalComposeActivityContent() { @Composable private fun Greeting() { Text(text = stringResource(id = R.string.final_title), - modifier = Modifier.padding(24.dp)) + modifier = Modifier.padding(24.dp) + .testTag("Final Compose Title Tag")) } @Composable