Skip to content

Commit 04d9f49

Browse files
authored
Support using TestParameterInjector instead of ThemeVariantInjector for parameterized tests. (#284)
1 parent dc73bfc commit 04d9f49

File tree

41 files changed

+238
-61
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+238
-61
lines changed

android/app/build.gradle.kts

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -227,46 +227,30 @@ dependencies {
227227
demoImplementation(project(":kmp:remote:edge"))
228228
devImplementation(project(":kmp:remote:cloud"))
229229
prodImplementation(project(":kmp:remote:cloud"))
230-
231230
implementation(project(":feature:common"))
232231
implementation(project(":feature:content-viewer"))
233232
implementation(project(":feature:home"))
234233
implementation(project(":feature:kotlin-weekly-issue"))
235234
implementation(project(":feature:saved-for-later"))
236235
implementation(project(":feature:talking-kotlin-episode"))
237-
238236
implementation(project(":foundation:scheduled-work"))
239-
240237
baselineProfile(project(":benchmark"))
241238

242-
// Firebase
243239
releaseImplementation(libs.firebase.perf)
244240
implementation(libs.firebase.crashlytics)
245-
246-
// AndroidX
247241
implementation(libs.androidx.activity.compose)
248242
implementation(libs.androidx.navigation.compose)
249243
implementation(libs.androidx.coreSplashscreen)
250244
implementation(libs.androidx.profileinstaller)
251245
implementation(libs.androidx.compose.runtime.tracing)
252246
implementation(libs.androidx.hilt.work)
253247
implementation(libs.androidx.tracing)
254-
255-
// Hilt
256248
implementation(libs.hilt.android)
257249
ksp(libs.hilt.compiler)
258-
259-
// OkHttp
260250
implementation(libs.okhttp)
261-
262-
// Image loading
263251
implementation(libs.coil.svg)
264252
implementation(libs.coil.network)
265-
266-
// SQLDelight
267253
implementation(libs.sqldelight.androidDriver)
268-
269-
// LeakCanary
270254
debugImplementation(libs.leakcanary.android)
271255
implementation(libs.leakcanary.plumber)
272256
}

android/feature/common/build.gradle.kts

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,21 +12,14 @@ android {
1212
dependencies {
1313
api(project(":foundation:designsystem"))
1414

15-
// AndroidX
1615
api(libs.androidx.core)
1716
api(libs.androidx.compose.foundation)
1817
api(libs.androidx.compose.ui.tooling)
1918
api(libs.androidx.lifecycle.runtimeCompose)
2019
api(libs.androidx.lifecycle.viewmodelCompose)
2120
api(libs.androidx.hilt.navigationCompose)
2221
implementation(libs.androidx.browser)
23-
24-
// Image loading
2522
api(libs.coil.compose)
26-
27-
// Logging
2823
api(libs.kermit)
29-
30-
// Coroutines
3124
api(libs.kotlinx.coroutines.core)
3225
}

android/feature/content-viewer/build.gradle.kts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,8 @@ dependencies {
1616
implementation(project(":kmp:feed-datasource"))
1717
implementation(project(":kmp:presentation:content-viewer"))
1818

19-
// AndroidX
2019
implementation(libs.androidx.activity.compose)
2120
implementation(libs.androidx.tracing)
22-
23-
// Hilt
2421
implementation(libs.hilt.android)
2522
ksp(libs.hilt.compiler)
2623
}

android/feature/home/build.gradle.kts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,8 @@ dependencies {
1818
implementation(project(":kmp:feed-sync:common"))
1919
implementation(project(":kmp:presentation:home"))
2020

21-
// AndroidX
2221
implementation(libs.androidx.activity.compose)
2322
implementation(libs.androidx.tracing)
24-
25-
// Hilt
2623
implementation(libs.hilt.android)
2724
ksp(libs.hilt.compiler)
2825
}

android/feature/kotlin-weekly-issue/build.gradle.kts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
plugins {
22
id("kstreamlined.android.library")
3+
id("kstreamlined.android.screenshot-test")
34
id("kstreamlined.compose")
45
id("kstreamlined.ksp")
56
}
@@ -16,10 +17,9 @@ dependencies {
1617
implementation(project(":kmp:feed-datasource"))
1718
implementation(project(":kmp:presentation:kotlin-weekly-issue"))
1819

19-
// AndroidX
2020
implementation(libs.androidx.tracing)
21-
22-
// Hilt
2321
implementation(libs.hilt.android)
2422
ksp(libs.hilt.compiler)
23+
24+
testImplementation(libs.testParameterInjector)
2525
}

android/feature/kotlin-weekly-issue/src/main/kotlin/io/github/reactivecircus/kstreamlined/android/feature/kotlinweeklyissue/KotlinWeeklyIssueScreen.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,6 @@ public fun SharedTransitionScope.KotlinWeeklyIssueScreen(
108108

109109
@Composable
110110
internal fun SharedTransitionScope.KotlinWeeklyIssueScreen(
111-
animatedVisibilityScope: AnimatedVisibilityScope,
112111
topBarBoundsKey: String,
113112
titleElementKey: String,
114113
id: String,
@@ -119,6 +118,7 @@ internal fun SharedTransitionScope.KotlinWeeklyIssueScreen(
119118
uiState: KotlinWeeklyIssueUiState,
120119
eventSink: (KotlinWeeklyIssueUiEvent) -> Unit,
121120
modifier: Modifier = Modifier,
121+
animatedVisibilityScope: AnimatedVisibilityScope? = null,
122122
) {
123123
Column(
124124
modifier = modifier
@@ -144,7 +144,7 @@ internal fun SharedTransitionScope.KotlinWeeklyIssueScreen(
144144
AnimatedVisibility(uiState is KotlinWeeklyIssueUiState.Content) {
145145
Row {
146146
val contentUrl = (uiState as? KotlinWeeklyIssueUiState.Content)?.contentUrl.orEmpty()
147-
val saved = (uiState as? KotlinWeeklyIssueUiState.Content)?.savedForLater ?: false
147+
val saved = (uiState as? KotlinWeeklyIssueUiState.Content)?.savedForLater == true
148148
FilledIconButton(
149149
KSIcons.Share,
150150
contentDescription = null,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package io.github.reactivecircus.kstreamlined.android.feature.kotlinweeklyissue.component
2+
3+
import com.google.testing.junit.testparameterinjector.TestParameter
4+
import com.google.testing.junit.testparameterinjector.TestParameterInjector
5+
import io.github.reactivecircus.kstreamlined.android.foundation.screenshottesting.tester.SnapshotTester
6+
import io.github.reactivecircus.kstreamlined.android.foundation.screenshottesting.tester.ThemeVariant
7+
import io.github.reactivecircus.kstreamlined.kmp.model.feed.KotlinWeeklyIssueItem
8+
import org.junit.Rule
9+
import org.junit.Test
10+
import org.junit.runner.RunWith
11+
12+
@RunWith(TestParameterInjector::class)
13+
class IssueGroupUiTest {
14+
15+
@get:Rule
16+
val snapshotTester = SnapshotTester()
17+
18+
@Test
19+
fun snapshot_IssueGroupUi(
20+
@TestParameter group: KotlinWeeklyIssueItem.Group,
21+
@TestParameter themeVariant: ThemeVariant,
22+
) {
23+
snapshotTester.snapshot(themeVariant = themeVariant) {
24+
IssueGroupUi(group = group)
25+
}
26+
}
27+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package io.github.reactivecircus.kstreamlined.android.feature.kotlinweeklyissue.component
2+
3+
import io.github.reactivecircus.kstreamlined.android.foundation.screenshottesting.tester.SnapshotTester
4+
import io.github.reactivecircus.kstreamlined.android.foundation.screenshottesting.tester.ThemeVariantInjector
5+
import io.github.reactivecircus.kstreamlined.kmp.model.feed.KotlinWeeklyIssueItem
6+
import org.junit.Rule
7+
import org.junit.Test
8+
import org.junit.runner.RunWith
9+
10+
@RunWith(ThemeVariantInjector::class)
11+
class IssueItemUiTest {
12+
13+
@get:Rule
14+
val snapshotTester = SnapshotTester()
15+
16+
@Test
17+
fun snapshot_IssueItemUi() {
18+
snapshotTester.snapshot {
19+
IssueItemUi(
20+
item = KotlinWeeklyIssueItem(
21+
title = "Amper Update – December 2023",
22+
summary = "Last month JetBrains introduced Amper, a tool to improve the" +
23+
" project configuration user experience. Marton Braun gives us an update" +
24+
" about its state in December 2023.",
25+
url = "https://blog.jetbrains.com/amper/2023/12/amper-update-december-2023/",
26+
source = "blog.jetbrains.com",
27+
group = KotlinWeeklyIssueItem.Group.Announcements,
28+
),
29+
onItemClick = {},
30+
)
31+
}
32+
}
33+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
package io.github.reactivecircus.kstreamlined.android.feature.kotlinweeklyissue.component
2+
3+
import androidx.compose.animation.ExperimentalSharedTransitionApi
4+
import androidx.compose.animation.SharedTransitionLayout
5+
import androidx.compose.runtime.Composable
6+
import io.github.reactivecircus.kstreamlined.android.feature.kotlinweeklyissue.KotlinWeeklyIssueScreen
7+
import io.github.reactivecircus.kstreamlined.android.foundation.screenshottesting.tester.SnapshotTester
8+
import io.github.reactivecircus.kstreamlined.android.foundation.screenshottesting.tester.ThemeVariantInjector
9+
import io.github.reactivecircus.kstreamlined.kmp.model.feed.KotlinWeeklyIssueItem
10+
import io.github.reactivecircus.kstreamlined.kmp.presentation.kotlinweeklyissue.KotlinWeeklyIssueUiState
11+
import org.junit.Rule
12+
import org.junit.Test
13+
import org.junit.runner.RunWith
14+
15+
@RunWith(ThemeVariantInjector::class)
16+
class KotlinWeeklyIssueScreenTest {
17+
18+
@get:Rule
19+
val snapshotTester = SnapshotTester()
20+
21+
@Test
22+
fun snapshot_KotlinWeeklyIssueScreen_InFlight() {
23+
snapshotTester.snapshot {
24+
KotlinWeeklyIssueScreenSnapshot(
25+
uiState = KotlinWeeklyIssueUiState.InFlight,
26+
)
27+
}
28+
}
29+
30+
@Test
31+
fun snapshot_KotlinWeeklyIssueScreen_Content() {
32+
snapshotTester.snapshot {
33+
KotlinWeeklyIssueScreenSnapshot(
34+
uiState = KotlinWeeklyIssueUiState.Content(
35+
id = "1",
36+
contentUrl = "content-url",
37+
issueItems = mapOf(
38+
KotlinWeeklyIssueItem.Group.Announcements to listOf(
39+
KotlinWeeklyIssueItem(
40+
title = "Apply for Google Summer of Code 2025 and Contribute to the Kotlin Ecosystem",
41+
summary = "The Kotlin Foundation is once again participating in Google Summer of Code. If you are thinking of participating, check out this announcement.",
42+
url = "url",
43+
source = "blog.jetbrains.com",
44+
group = KotlinWeeklyIssueItem.Group.Announcements
45+
)
46+
),
47+
KotlinWeeklyIssueItem.Group.Articles to listOf(
48+
KotlinWeeklyIssueItem(
49+
title = "Strong skipping does not fix Kotlin collections in Jetpack Compose",
50+
summary = "Watch out when you are using List, Map, Set, etc in Compose. Jorge Castillo explains what strong skipping in Compose does not fix.",
51+
url = "url",
52+
source = "newsletter.jorgecastillo.dev",
53+
group = KotlinWeeklyIssueItem.Group.Articles
54+
)
55+
),
56+
KotlinWeeklyIssueItem.Group.Videos to listOf(
57+
KotlinWeeklyIssueItem(
58+
title = "A full guide to MongoDB with Kotlin coroutines in Ktor",
59+
summary = "Piotr from Codersee explains in this video how to integrate a Ktor application with the MongoDB database and Kotlin coroutines.",
60+
url = "url",
61+
source = "www.youtube.com",
62+
group = KotlinWeeklyIssueItem.Group.Videos
63+
)
64+
),
65+
),
66+
savedForLater = true
67+
),
68+
)
69+
}
70+
}
71+
72+
@Test
73+
fun snapshot_KotlinWeeklyIssueScreen_Error() {
74+
snapshotTester.snapshot {
75+
KotlinWeeklyIssueScreenSnapshot(
76+
uiState = KotlinWeeklyIssueUiState.Error,
77+
)
78+
}
79+
}
80+
81+
@OptIn(ExperimentalSharedTransitionApi::class)
82+
@Composable
83+
fun KotlinWeeklyIssueScreenSnapshot(
84+
uiState: KotlinWeeklyIssueUiState,
85+
) {
86+
SharedTransitionLayout {
87+
KotlinWeeklyIssueScreen(
88+
topBarBoundsKey = "",
89+
titleElementKey = "",
90+
id = "1",
91+
title = "Issue #448",
92+
onNavigateUp = {},
93+
onShareButtonClick = {},
94+
onOpenLink = {},
95+
uiState = uiState,
96+
eventSink = {},
97+
)
98+
}
99+
}
100+
}
Loading

0 commit comments

Comments
 (0)