Skip to content

Commit

Permalink
ISSUE-317: Support compose util for Jetpack Compose
Browse files Browse the repository at this point in the history
  • Loading branch information
Areyana committed Dec 17, 2023
1 parent 69ddba1 commit 8eb1a1e
Show file tree
Hide file tree
Showing 3 changed files with 94 additions and 2 deletions.
1 change: 1 addition & 0 deletions kaspresso/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ dependencies {
api(libs.kakaoExtClicks)
api(libs.bundles.espresso)
api(libs.uiAutomator)
api(libs.kakaoCompose)
api(libs.androidXCore)
api(libs.androidXTestRules)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -32,7 +35,21 @@ class ActionsOnElementsPack {
fun <Type> or(element: Type, action: Type.() -> Unit): ComplexComposeBranchBuilder<Type>
where Type : BaseActions, Type : BaseAssertions,
Type : Interceptable<ViewInteraction, ViewAssertion, ViewAction> {
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 <Type> or(element: Type, action: Type.() -> Unit): ComplexComposeBranchBuilder<Type>
where Type : NodeActions, Type : NodeAssertions,
Type : ComposeInterceptable {
return ComplexComposeBranchBuilder(element) { action.invoke(element) }
.also { complexComposeBranchBuilders += it }
}

Expand All @@ -46,7 +63,7 @@ class ActionsOnElementsPack {
fun <Type> or(element: Type, action: Type.() -> Unit): ComplexComposeBranchBuilder<Type>
where Type : UiBaseActions, Type : UiBaseAssertions,
Type : UiInterceptable<UiObjectInteraction, UiObjectAssertion, UiObjectAction> {
return ComplexComposeBranchBuilder(element, { action.invoke(element) })
return ComplexComposeBranchBuilder(element) { action.invoke(element) }
.also { complexComposeBranchBuilders += it }
}

Expand Down
Original file line number Diff line number Diff line change
@@ -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<MainActivity>()

@Test
fun test() = run {
step("Open Flaky screen") {
ComposeScreen.onComposeScreen<ComposeMainScreen>(composeTestRule) {
simpleFlakyButton {
performClick()
}
}
}

step("Flow is over the product") {
ComposeScreen.onComposeScreen<ComposeSimpleFlakyScreen>(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<ComposeSimpleFlakyScreen>(composeTestRule) {
secondButton {
assertIsDisplayed()
performClick()
}
}
}

step("Interaction with EditText") {
ComposeScreen.onComposeScreen<ComposeSimpleFlakyScreen>(composeTestRule) {
editText {
assertIsDisplayed()
assertTextContains("Some text")
performTextClearance()
performTextInput("New text")
assertTextContains("New text")
}
}
}
}
}

0 comments on commit 8eb1a1e

Please sign in to comment.