Skip to content

Commit dca22e3

Browse files
committed
[WIP] Add search screen testing
1 parent 53ee85d commit dca22e3

4 files changed

Lines changed: 85 additions & 2 deletions

File tree

feature/sessions/src/main/java/io/github/droidkaigi/confsched2022/feature/sessions/Search.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ import androidx.compose.ui.focus.focusRequester
5656
import androidx.compose.ui.graphics.Color
5757
import androidx.compose.ui.graphics.SolidColor
5858
import androidx.compose.ui.platform.LocalSoftwareKeyboardController
59+
import androidx.compose.ui.platform.testTag
5960
import androidx.compose.ui.res.painterResource
6061
import androidx.compose.ui.res.stringResource
6162
import androidx.compose.ui.semantics.CustomAccessibilityAction
@@ -293,7 +294,8 @@ fun SearchTextFieldTopAppBar(
293294
title = {
294295
SearchTextField(
295296
modifier = Modifier
296-
.background(color = backgroundColor),
297+
.background(color = backgroundColor)
298+
.testTag("search"),
297299
searchWord = searchWord,
298300
onSearchWordChange = onSearchWordChange,
299301
onSearchTextAreaClicked = onSearchTextAreaClicked
@@ -354,6 +356,7 @@ private fun SearchTextField(
354356
placeholder = { Text(stringResource(Strings.search_placeholder)) },
355357
trailingIcon = {
356358
IconButton(
359+
modifier = Modifier.testTag("clearInput"),
357360
onClick = { onSearchWordChange("") }
358361
) {
359362
Icon(

feature/sessions/src/main/java/io/github/droidkaigi/confsched2022/feature/sessions/SessionListItem.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,9 @@ fun SessionListItem(
6565
val secondLang = lang.secondLang()
6666

6767
Row(
68-
modifier = modifier.fillMaxSize(),
68+
modifier = modifier
69+
.fillMaxSize()
70+
.testTag("session"),
6971
horizontalArrangement = Arrangement.SpaceBetween
7072
) {
7173
Column(modifier = Modifier.weight(1F)) {
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package io.github.droidkaigi.confsched2022.feature.sessions
2+
3+
import androidx.compose.foundation.layout.fillMaxSize
4+
import androidx.compose.material.Surface
5+
import androidx.compose.ui.Modifier
6+
import androidx.compose.ui.test.assertAny
7+
import androidx.compose.ui.test.hasTestTag
8+
import androidx.compose.ui.test.hasText
9+
import androidx.compose.ui.test.onNodeWithTag
10+
import androidx.compose.ui.test.performClick
11+
import androidx.compose.ui.test.performTextReplacement
12+
import io.github.droidkaigi.confsched2022.designsystem.theme.KaigiTheme
13+
import io.github.droidkaigi.confsched2022.testing.RobotTestRule
14+
import javax.inject.Inject
15+
16+
class SearchScreenRobot @Inject constructor() {
17+
18+
context(RobotTestRule)
19+
fun typeQuery(query: String) {
20+
composeTestRule.onNodeWithTag("search").performTextReplacement(query)
21+
}
22+
23+
context(RobotTestRule)
24+
fun checkSessionExists(title: String) {
25+
composeTestRule.onAllNodes(
26+
matcher = hasTestTag("session") and hasText(title),
27+
).assertAny(hasText(title))
28+
}
29+
30+
context(RobotTestRule)
31+
fun clearInput() {
32+
composeTestRule.onNodeWithTag("clearInput").performClick()
33+
}
34+
35+
operator fun invoke(
36+
robotTestRule: RobotTestRule,
37+
function: context(RobotTestRule) SearchScreenRobot.() -> Unit
38+
) {
39+
robotTestRule.composeTestRule.setContent {
40+
SearchRoot(onItemClick = {})
41+
}
42+
function(robotTestRule, this@SearchScreenRobot)
43+
}
44+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package io.github.droidkaigi.confsched2022.feature.sessions
2+
3+
import androidx.test.ext.junit.runners.AndroidJUnit4
4+
import dagger.hilt.android.testing.HiltAndroidTest
5+
import io.github.droidkaigi.confsched2022.model.DroidKaigiSchedule
6+
import io.github.droidkaigi.confsched2022.model.TimetableItem.Session
7+
import io.github.droidkaigi.confsched2022.model.fake
8+
import io.github.droidkaigi.confsched2022.testing.RobotTestRule
9+
import org.junit.Rule
10+
import org.junit.Test
11+
import org.junit.runner.RunWith
12+
import javax.inject.Inject
13+
14+
@RunWith(AndroidJUnit4::class)
15+
@HiltAndroidTest
16+
class SearchScreenTest {
17+
18+
@get:Rule val robotTestRule = RobotTestRule(this)
19+
@Inject lateinit var searchScreenRobot: SearchScreenRobot
20+
21+
@Test
22+
fun searchWithResult() {
23+
searchScreenRobot(robotTestRule) {
24+
DroidKaigiSchedule.fake().dayToTimetable.forEach { (_, timeTable) ->
25+
timeTable.contents.forEach inner@{
26+
if (it.timetableItem !is Session) return@inner
27+
val query = it.timetableItem.title.currentLangTitle
28+
typeQuery(query)
29+
checkSessionExists(query)
30+
}
31+
}
32+
}
33+
}
34+
}

0 commit comments

Comments
 (0)