diff --git a/kaspresso/build.gradle.kts b/kaspresso/build.gradle.kts index 023d1cd88..8e191fefb 100644 --- a/kaspresso/build.gradle.kts +++ b/kaspresso/build.gradle.kts @@ -15,6 +15,7 @@ dependencies { api(libs.kakaoExtClicks) api(libs.bundles.espresso) api(libs.uiAutomator) + api(libs.kakaoCompose) api(libs.androidXCore) api(libs.androidXTestRules) diff --git a/kaspresso/src/main/kotlin/com/kaspersky/kaspresso/compose/pack/ActionsOnElementsPack.kt b/kaspresso/src/main/kotlin/com/kaspersky/kaspresso/compose/pack/ActionsOnElementsPack.kt index d464a4eee..3708c28d3 100644 --- a/kaspresso/src/main/kotlin/com/kaspersky/kaspresso/compose/pack/ActionsOnElementsPack.kt +++ b/kaspresso/src/main/kotlin/com/kaspersky/kaspresso/compose/pack/ActionsOnElementsPack.kt @@ -14,6 +14,9 @@ import com.kaspersky.components.kautomator.intercept.operation.UiObjectAction import com.kaspersky.components.kautomator.intercept.operation.UiObjectAssertion import com.kaspersky.kaspresso.compose.pack.branch.ComplexComposeBranch import com.kaspersky.kaspresso.compose.pack.branch.ComplexComposeBranchBuilder +import io.github.kakaocup.compose.intercept.delegate.ComposeInterceptable +import io.github.kakaocup.compose.node.action.NodeActions +import io.github.kakaocup.compose.node.assertion.NodeAssertions /** * The builder class for parameters of [com.kaspersky.kaspresso.compose.ComposeProvider.compose] method. @@ -32,7 +35,21 @@ class ActionsOnElementsPack { fun or(element: Type, action: Type.() -> Unit): ComplexComposeBranchBuilder where Type : BaseActions, Type : BaseAssertions, Type : Interceptable { - return ComplexComposeBranchBuilder(element, { action.invoke(element) }) + return ComplexComposeBranchBuilder(element) { action.invoke(element) } + .also { complexComposeBranchBuilders += it } + } + + /** + * Adds the [element] of type [Type] and the [action] to [complexComposeBranchBuilders] and [action] for future composing + * where [Type] is bounding by KNode (Kakao Compose) + * + * @param element the interacted node. + * @param action actions or assertions on the interacted node. + */ + fun or(element: Type, action: Type.() -> Unit): ComplexComposeBranchBuilder + where Type : NodeActions, Type : NodeAssertions, + Type : ComposeInterceptable { + return ComplexComposeBranchBuilder(element) { action.invoke(element) } .also { complexComposeBranchBuilders += it } } @@ -46,7 +63,7 @@ class ActionsOnElementsPack { fun or(element: Type, action: Type.() -> Unit): ComplexComposeBranchBuilder where Type : UiBaseActions, Type : UiBaseAssertions, Type : UiInterceptable { - return ComplexComposeBranchBuilder(element, { action.invoke(element) }) + return ComplexComposeBranchBuilder(element) { action.invoke(element) } .also { complexComposeBranchBuilders += it } } diff --git a/samples/kaspresso-compose-support-sample/src/androidTest/kotlin/com/kaspersky/kaspresso/composesupport/sample/test/ComposeComplexTest.kt b/samples/kaspresso-compose-support-sample/src/androidTest/kotlin/com/kaspersky/kaspresso/composesupport/sample/test/ComposeComplexTest.kt new file mode 100644 index 000000000..c97de2c7d --- /dev/null +++ b/samples/kaspresso-compose-support-sample/src/androidTest/kotlin/com/kaspersky/kaspresso/composesupport/sample/test/ComposeComplexTest.kt @@ -0,0 +1,74 @@ +package com.kaspersky.kaspresso.composesupport.sample.test + +import androidx.compose.ui.test.junit4.createAndroidComposeRule +import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.kaspersky.components.composesupport.config.withComposeSupport +import com.kaspersky.kaspresso.composesupport.sample.MainActivity +import com.kaspersky.kaspresso.composesupport.sample.screen.ComposeMainScreen +import com.kaspersky.kaspresso.composesupport.sample.screen.ComposeSimpleFlakyScreen +import com.kaspersky.kaspresso.kaspresso.Kaspresso +import com.kaspersky.kaspresso.testcases.api.testcase.TestCase +import io.github.kakaocup.compose.node.element.ComposeScreen +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith + +@RunWith(AndroidJUnit4::class) +class ComposeComplexTest : TestCase( + kaspressoBuilder = Kaspresso.Builder.withComposeSupport() +) { + + @get:Rule + val composeTestRule = createAndroidComposeRule() + + @Test + fun test() = run { + step("Open Flaky screen") { + ComposeScreen.onComposeScreen(composeTestRule) { + simpleFlakyButton { + performClick() + } + } + } + + step("Flow is over the product") { + ComposeScreen.onComposeScreen(composeTestRule) { + compose { + // the first potential branch when firstButton is visible + or(firstButton) { + assertIsDisplayed() + } thenContinue { + performClick() + } + // the second potential branch when secondButton is visible + or(secondButton) { + assertIsDisplayed() + } thenContinue { + performClick() + } + } + } + } + + step("Click on the Second button") { + ComposeScreen.onComposeScreen(composeTestRule) { + secondButton { + assertIsDisplayed() + performClick() + } + } + } + + step("Interaction with EditText") { + ComposeScreen.onComposeScreen(composeTestRule) { + editText { + assertIsDisplayed() + assertTextContains("Some text") + performTextClearance() + performTextInput("New text") + assertTextContains("New text") + } + } + } + } +}