Skip to content

Commit 92519ad

Browse files
committed
Add test for Glance widget
1 parent 1ffb120 commit 92519ad

File tree

4 files changed

+73
-1
lines changed

4 files changed

+73
-1
lines changed

app/build.gradle.kts

+1
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,7 @@ dependencies {
160160

161161
implementation(libs.accompanist)
162162

163+
implementation(libs.androidx.glance.testing)
163164
implementation(libs.androidx.glance.appwidget)
164165
testImplementation(libs.androidx.glance.appwidget.testing)
165166
implementation(libs.androidx.glance.material3)

app/src/main/java/dev/aungkyawpaing/ccdroidx/feature/widget/DashboardWidget.kt

+6-1
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ import androidx.glance.layout.fillMaxWidth
3636
import androidx.glance.layout.height
3737
import androidx.glance.layout.padding
3838
import androidx.glance.layout.size
39+
import androidx.glance.semantics.semantics
40+
import androidx.glance.semantics.testTag
3941
import androidx.glance.text.FontWeight
4042
import androidx.glance.text.Text
4143
import androidx.glance.text.TextStyle
@@ -65,7 +67,7 @@ class DashboardWidget(
6567
}
6668

6769
@Composable
68-
private fun DashboardWidgetContent(failingProjects: List<Project>) {
70+
fun DashboardWidgetContent(failingProjects: List<Project>) {
6971
val context = LocalContext.current
7072

7173
GlanceTheme {
@@ -121,6 +123,9 @@ private fun DashboardWidgetContent(failingProjects: List<Project>) {
121123
)
122124
)
123125
)
126+
.semantics {
127+
this.testTag = "Project ${project.id} - row"
128+
}
124129
) {
125130
Text(
126131
text = project.name,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package dev.aungkyawpaing.ccdroidx.feature.widget
2+
3+
import androidx.compose.ui.unit.DpSize
4+
import androidx.compose.ui.unit.dp
5+
import androidx.glance.action.ActionParameters
6+
import androidx.glance.action.actionParametersOf
7+
import androidx.glance.appwidget.testing.unit.assertHasRunCallbackClickAction
8+
import androidx.glance.appwidget.testing.unit.runGlanceAppWidgetUnitTest
9+
import androidx.glance.testing.unit.assertHasStartActivityClickAction
10+
import androidx.glance.testing.unit.hasContentDescription
11+
import androidx.glance.testing.unit.hasTestTag
12+
import androidx.glance.testing.unit.hasText
13+
import androidx.test.core.app.ApplicationProvider
14+
import androidx.test.ext.junit.runners.AndroidJUnit4
15+
import dev.aungkyawpaing.ccdroidx._testhelper_.ProjectBuilder
16+
import dev.aungkyawpaing.ccdroidx.feature.MainActivity
17+
import org.junit.Test
18+
import org.junit.runner.RunWith
19+
20+
@RunWith(AndroidJUnit4::class)
21+
class DashboardWidgetTest {
22+
23+
@Test
24+
fun renderWithSomeFailingProjects() = runGlanceAppWidgetUnitTest {
25+
setAppWidgetSize(DpSize(100.dp, 150.dp))
26+
setContext(ApplicationProvider.getApplicationContext())
27+
28+
val failingProjects = listOf(
29+
ProjectBuilder.buildProject(id = 0L, name = "some project 0", webUrl = "some-url-0"),
30+
ProjectBuilder.buildProject(id = 1L, name = "some project 1", webUrl = "some-url-1"),
31+
)
32+
33+
provideComposable {
34+
DashboardWidgetContent(failingProjects = failingProjects)
35+
}
36+
37+
onNode(hasText("2 Red")).assertExists()
38+
onNode(hasText("some project 0")).assertExists()
39+
onNode(hasTestTag("Project 0 - row")).assertHasStartActivityClickAction<MainActivity>(
40+
actionParametersOf(
41+
ActionParameters.Key<String>(MainActivity.INTENT_EXTRA_URL) to "some-url-0"
42+
)
43+
)
44+
onNode(hasText("some project 1")).assertExists()
45+
onNode(hasTestTag("Project 1 - row")).assertHasStartActivityClickAction<MainActivity>(
46+
actionParametersOf(
47+
ActionParameters.Key<String>(MainActivity.INTENT_EXTRA_URL) to "some-url-1"
48+
)
49+
)
50+
onNode(hasContentDescription("Sync Project Status")).assertHasRunCallbackClickAction<WidgetRefreshAction>()
51+
}
52+
53+
@Test
54+
fun renderWithNoFailingProjects() = runGlanceAppWidgetUnitTest {
55+
setAppWidgetSize(DpSize(100.dp, 150.dp))
56+
setContext(ApplicationProvider.getApplicationContext())
57+
58+
provideComposable {
59+
DashboardWidgetContent(failingProjects = emptyList())
60+
}
61+
62+
onNode(hasText("All Green")).assertExists()
63+
onNode(hasContentDescription("Sync Project Status")).assertHasRunCallbackClickAction<WidgetRefreshAction>()
64+
}
65+
}

gradle/libs.versions.toml

+1
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ androidx-fragment = { group = "androidx.fragment", name = "fragment-ktx", versio
4545
androidx-fragment-testing = { group = "androidx.fragment", name = "fragment-testing", version.ref = "androidx-fragment" }
4646
androidx-glance-appwidget = { group = "androidx.glance", name = "glance-appwidget", version.ref = "glance" }
4747
androidx-glance-appwidget-testing = { group = "androidx.glance", name = "glance-appwidget-testing", version.ref = "glance" }
48+
androidx-glance-testing = { group = "androidx.glance", name = "glance-testing", version.ref = "glance" }
4849
androidx-glance-material3 = { group = "androidx.glance", name = "glance-material3", version.ref = "glance" }
4950
androidx-lifecycle-extensions = { group = "androidx.lifecycle", name = "lifecycle-extensions", version = "2.2.0" }
5051
androidx-lifecycle-java8 = { group = "androidx.lifecycle", name = "lifecycle-common-java8", version.ref = "androidx-lifecycle" }

0 commit comments

Comments
 (0)