Skip to content

Commit

Permalink
ISSUE-602: Update Kakao lib version to 0.4.5 - with a tests that woul…
Browse files Browse the repository at this point in the history
…dn't work previously.
  • Loading branch information
Nikitae57 authored and johngray1965 committed Feb 24, 2025
1 parent f1028e4 commit 779763f
Show file tree
Hide file tree
Showing 9 changed files with 231 additions and 7 deletions.
8 changes: 4 additions & 4 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
[versions]
kotlin = "1.8.22"
kotlin = "1.9.25"
detekt = "1.21.0"
espresso = "3.6.1"
kakao = "3.6.2"
kakaoCompose = "0.2.3"
kakaoCompose = "0.4.5"
kakaoExtClicks = "1.0.0"
allure = "2.4.0"
compose = "1.5.4"
composeCompiler = "1.4.8"
compose = "1.7.8"
composeCompiler = "1.5.15"
activityCompose = "1.4.0"
androidXTest = "1.6.1"
testOrchestrator = "1.4.2"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package com.kaspersky.kaspresso.composesupport.sample.screen

import androidx.compose.ui.semantics.SemanticsNode
import androidx.compose.ui.test.SemanticsMatcher
import androidx.compose.ui.test.SemanticsNodeInteractionsProvider
import com.kaspersky.kaspresso.composesupport.sample.features.lazylist.ListItemPositionSemantics
import com.kaspersky.kaspresso.composesupport.sample.features.lazylist.ListLengthSemantics
import com.kaspersky.kaspresso.composesupport.sample.resources.C
import io.github.kakaocup.compose.node.element.ComposeScreen
import io.github.kakaocup.compose.node.element.KNode
import io.github.kakaocup.compose.node.element.lazylist.KLazyListItemNode
import io.github.kakaocup.compose.node.element.lazylist.KLazyListNode

class ComposeLazyListScreen(semanticsProvider: SemanticsNodeInteractionsProvider) :
ComposeScreen<ComposeLazyListScreen>(
semanticsProvider = semanticsProvider,
) {
val list: KLazyListNode =
KLazyListNode(
semanticsProvider = semanticsProvider,
viewBuilderAction = { hasTestTag(C.Tag.scroll_screen_multi_text_list) },
itemTypeBuilder = {
itemType(::LazyListScreenItemNode)
},
positionMatcher = { position -> SemanticsMatcher.expectValue(ListItemPositionSemantics, position) },
lengthSemanticsPropertyKey = ListLengthSemantics
)
}
class LazyListScreenItemNode(
semanticsNode: SemanticsNode,
semanticsProvider: SemanticsNodeInteractionsProvider
) : KLazyListItemNode<LazyListScreenItemNode>(
semanticsNode,
semanticsProvider
) {
val text1: KNode =
child {
useUnmergedTree = true
hasTestTag(C.Tag.multi_text_text1)
}
val text2: KNode =
child {
useUnmergedTree = true
hasTestTag(C.Tag.multi_text_text2)
}
val text3: KNode =
child {
useUnmergedTree = true
hasTestTag(C.Tag.multi_text_text3)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,8 @@ class ComposeMainScreen(semanticsProvider: SemanticsNodeInteractionsProvider) :
val scrollButton: KNode = child {
hasTestTag(C.Tag.main_screen_scroll_button)
}

val lazyListButton: KNode = child {
hasTestTag(C.Tag.main_screen_lazy_list_button)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package com.kaspersky.kaspresso.composesupport.sample.test

import androidx.compose.ui.test.ExperimentalTestApi
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.resources.C
import com.kaspersky.kaspresso.composesupport.sample.screen.ComposeLazyListScreen
import com.kaspersky.kaspresso.composesupport.sample.screen.ComposeMainScreen
import com.kaspersky.kaspresso.composesupport.sample.screen.LazyListScreenItemNode
import com.kaspersky.kaspresso.kaspresso.Kaspresso
import com.kaspersky.kaspresso.testcases.api.testcase.TestCase
import io.github.kakaocup.compose.node.element.ComposeScreen.Companion.onComposeScreen
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith

@RunWith(AndroidJUnit4::class)
class ComposeLazyListTest : TestCase(
kaspressoBuilder = Kaspresso.Builder.withComposeSupport()
) {

@get:Rule
val composeTestRule = createAndroidComposeRule<MainActivity>()

@OptIn(ExperimentalTestApi::class)
@Test
fun test() = run {
step("Open LazyList screen") {
onComposeScreen<ComposeMainScreen>(composeTestRule) {
lazyListButton {
performClick()
}
}
}
step("Verify Lazy List") {
onComposeScreen<ComposeLazyListScreen>(composeTestRule) {
list {
assertIsDisplayed()
assertLengthEquals(C.Tag.scroll_screen_multi_text_items.size)

repeat(C.Tag.scroll_screen_multi_text_items.size) { i ->
childAt<LazyListScreenItemNode>(i) {
text1 {
assertIsDisplayed()
assertTextContains("text1_$i")
}
text2 {
assertIsDisplayed()
assertTextContains("text2_$i")
}
text3 {
assertIsDisplayed()
assertTextContains("text3_$i")
}
}
}
}
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import com.kaspersky.kaspresso.composesupport.sample.features.flaky.SimpleFlakyScreen
import com.kaspersky.kaspresso.composesupport.sample.features.flaky.SimpleFlakyViewModel
import com.kaspersky.kaspresso.composesupport.sample.features.lazylist.LazyListScreen
import com.kaspersky.kaspresso.composesupport.sample.features.main.MainScreen
import com.kaspersky.kaspresso.composesupport.sample.features.sanityflaky.SanityFlakyScreen
import com.kaspersky.kaspresso.composesupport.sample.features.sanityflaky.SanityFlakyViewModel
Expand All @@ -36,7 +37,8 @@ class MainActivity : AppCompatActivity() {
MainScreen(
simpleFlakyClick = { navController.navigate(C.Screen.simple_flaky_screen) },
sanityFlakyClick = { navController.navigate(C.Screen.sanity_flaky_screen) },
scrollClick = { navController.navigate(C.Screen.scroll_screen) }
scrollClick = { navController.navigate(C.Screen.scroll_screen) },
lazyListClick = { navController.navigate(C.Screen.lazy_list) }
)
}

Expand All @@ -57,6 +59,9 @@ class MainActivity : AppCompatActivity() {
SanityFlakyScreen(sanityFlakyStateLiveData =
sanityFlakyViewModel.sanityFlakyStateLiveData, firstButtonClick = { sanityFlakyViewModel.firstButtonClick() })
}
composable(C.Screen.lazy_list) {
LazyListScreen()
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package com.kaspersky.kaspresso.composesupport.sample.features.lazylist

import androidx.compose.foundation.BorderStroke
import androidx.compose.foundation.border
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.wrapContentSize
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.itemsIndexed
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.semantics.SemanticsPropertyKey
import androidx.compose.ui.semantics.SemanticsPropertyReceiver
import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.semantics.testTag
import androidx.compose.ui.unit.dp
import com.kaspersky.kaspresso.composesupport.sample.resources.C

@Composable
fun LazyListScreen() {
LazyColumn(
modifier = Modifier
.fillMaxSize()
.padding(8.dp)
.testTag(C.Tag.scroll_screen_multi_text_list)
.lazyListLength(C.Tag.scroll_screen_multi_text_items.size)
.semantics { testTag = C.Tag.scroll_screen_multi_text }

) {
itemsIndexed(
C.Tag.scroll_screen_multi_text_items
) { index, item ->
Row(modifier = Modifier.lazyListItemPosition(index).padding(8.dp).border(BorderStroke(1.dp, Color.Green))) {
Column(
modifier = Modifier.fillMaxWidth().wrapContentSize().padding(8.dp)
) {
Text(
text = item.text1,
modifier = Modifier.testTag(C.Tag.multi_text_text1)
)
Text(
text = item.text2,
modifier = Modifier.testTag(C.Tag.multi_text_text2)
)
Text(
text = item.text3,
modifier = Modifier.testTag(C.Tag.multi_text_text3)
)
}
}
}
}
}

val ListItemPositionSemantics: SemanticsPropertyKey<Int> = SemanticsPropertyKey("ListItemPosition")
var SemanticsPropertyReceiver.lazyListItemPosition: Int by ListItemPositionSemantics

fun Modifier.lazyListItemPosition(position: Int): Modifier = semantics { lazyListItemPosition = position }

val ListLengthSemantics: SemanticsPropertyKey<Int> = SemanticsPropertyKey("ListLength")
var SemanticsPropertyReceiver.lazyListLength: Int by ListLengthSemantics

fun Modifier.lazyListLength(length: Int): Modifier = semantics { lazyListLength = length }
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,8 @@ import com.kaspersky.kaspresso.composesupport.sample.resources.C
fun MainScreen(
simpleFlakyClick: () -> Unit,
sanityFlakyClick: () -> Unit,
scrollClick: () -> Unit
scrollClick: () -> Unit,
lazyListClick: () -> Unit
) {
Column(
modifier = Modifier
Expand Down Expand Up @@ -62,6 +63,16 @@ fun MainScreen(
},
onClick = scrollClick,
)

Button(
modifier = Modifier
.fillMaxWidth()
.semantics { testTag = C.Tag.main_screen_lazy_list_button },
content = {
Text(text = stringResource(id = R.string.main_screen_lazy_list_button))
},
onClick = lazyListClick,
)
}
}

Expand All @@ -72,7 +83,8 @@ private fun MainScreenPreview() {
MainScreen(
simpleFlakyClick = { },
sanityFlakyClick = { },
scrollClick = { }
scrollClick = { },
lazyListClick = { }
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ object C {
const val main_screen_simple_flaky_button = "main_screen_simple_flaky_button"
const val main_screen_scroll_button = "main_screen_scroll_button"
const val main_screen_sanity_flaky_button = "main_screen_sanity_flaky_button"
const val main_screen_lazy_list_button = "main_screen_lazy_list_button"

const val simple_flaky_screen_container = "simple_flaky_screen_container"
const val simple_flaky_screen_simple_first_button = "simple_flaky_screen_simple_first_button"
Expand All @@ -18,15 +19,33 @@ object C {
const val sanity_flaky_screen_simple_second_button = "sanity_flaky_screen_simple_second_button"

const val scroll_screen_container = "scroll_screen_container"
const val scroll_screen_multi_text = "scroll_screen_multi_text"
const val scroll_screen_multi_text_list = "scroll_screen_multi_text_list"

const val multi_text_text1 = "multi_text_text1"
const val multi_text_text2 = "multi_text_text2"
const val multi_text_text3 = "multi_text_text3"

val scroll_screen_buttons = MutableList(30) {
"button_${it}"
}

val scroll_screen_multi_text_items = MutableList(30) {
MultiTextTestData( "text1_${it}", "text2_${it}", "text3_${it}")
}
}

data class MultiTextTestData(
val text1: String,
val text2: String,
val text3: String
)

object Screen {
const val main_screen = "main_screen"
const val simple_flaky_screen = "simple_flaky_screen"
const val sanity_flaky_screen = "sanity_flaky_screen"
const val scroll_screen = "scroll_screen"
const val lazy_list = "lazy_list"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
<string name="main_screen_simple_flaky_button" translatable="false">Simple flaky sample</string>
<string name="main_screen_sanity_flaky_button" translatable="false">Sanity flaky sample</string>
<string name="main_screen_scroll_button" translatable="false">Scroll button</string>
<string name="main_screen_lazy_list_button" translatable="false">LazyList button</string>
<!-- SimpleFlakyScreen -->
<string name="simple_flaky_screen_first_button" translatable="false">First button</string>
<string name="simple_flaky_screen_second_button" translatable="false">Second button</string>
Expand Down

0 comments on commit 779763f

Please sign in to comment.