Skip to content

Commit 44d08c2

Browse files
committed
Adding base paparazzi test for #232 and workflow for #250.
1 parent e1aec19 commit 44d08c2

File tree

5 files changed

+79
-6
lines changed

5 files changed

+79
-6
lines changed
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
name: Paparazzi Tests
2+
3+
# This will cancel any in progress workflows for the same PR, if
4+
# multiple pushes happen in quick succession.
5+
concurrency:
6+
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
7+
cancel-in-progress: true
8+
9+
on: pull_request
10+
11+
jobs:
12+
paparazzi-tests:
13+
runs-on: macos-14
14+
steps:
15+
- uses: actions/checkout@v4
16+
17+
- name: Setup
18+
uses: ./.github/actions/workflow_setup
19+
20+
- name: Run Tests
21+
run: ./gradlew verifyPaparazziDebug

app/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ dependencies {
7979

8080
annotationProcessor(libs.androidx.room.compiler)
8181

82+
testImplementation(libs.google.testparameterinjector)
8283
testImplementation(libs.junit)
8384

8485
androidTestImplementation(platform(libs.compose.bom))
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package template
2+
3+
import androidx.compose.foundation.layout.Box
4+
import androidx.compose.foundation.layout.fillMaxSize
5+
import androidx.compose.foundation.layout.padding
6+
import androidx.compose.material3.Surface
7+
import androidx.compose.runtime.Composable
8+
import androidx.compose.ui.Modifier
9+
import androidx.compose.ui.unit.dp
10+
import app.cash.paparazzi.Paparazzi
11+
import com.google.testing.junit.testparameterinjector.TestParameter
12+
import com.google.testing.junit.testparameterinjector.TestParameterInjector
13+
import org.junit.Rule
14+
import org.junit.runner.RunWith
15+
import template.theme.TemplateTheme
16+
17+
/**
18+
* This base class allows us to write Paparazzi tests that validate composable content in both light and dark theme
19+
* using a parameterized test. Just extend this base class and call [snapshot] with your composable content.
20+
*/
21+
@RunWith(TestParameterInjector::class)
22+
abstract class BasePaparazziTest {
23+
@get:Rule
24+
@Suppress("ktlint:standard:backing-property-naming", "VariableNaming")
25+
val _paparazzi = Paparazzi()
26+
27+
@TestParameter
28+
val useDarkTheme: Boolean = false
29+
30+
/**
31+
* Validates the supplied [content] in both light and dark theme.
32+
*/
33+
fun snapshot(
34+
screenPaddingDp: Int = 16,
35+
content: @Composable () -> Unit,
36+
) {
37+
_paparazzi.snapshot {
38+
TemplateTheme {
39+
Surface(
40+
modifier = Modifier
41+
.fillMaxSize(),
42+
) {
43+
Box(
44+
modifier = Modifier
45+
.fillMaxSize()
46+
.padding(screenPaddingDp.dp),
47+
) {
48+
content()
49+
}
50+
}
51+
}
52+
}
53+
}
54+
}

buildscripts/setup.gradle

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ task deleteSetupCode() {
3232
delete(setupGradle)
3333

3434
if (renameConfig.useRenovateDependencies != true) {
35-
println("Removing renovate dependencies")
3635
delete(renovateFile)
3736
}
3837
}
@@ -156,29 +155,25 @@ task keepOrRemoveDependencies {
156155

157156
filesWithDependencies.each { fileName ->
158157
if (renameConfig.useHiltDependencies != true) {
159-
println("Removing hilt dependencies")
160158
removeTextFromFile(fileName, "hilt")
161159
removeTextFromFile(fileName, "Hilt")
162160
}
163161

164162
if (renameConfig.useRoomDependencies != true) {
165-
println("Removing room dependencies")
166163
removeTextFromFile(fileName, "room")
167164
}
168165

169166
if (renameConfig.useRetrofitDependencies != true) {
170-
println("Removing retrofit dependencies")
171167
removeTextFromFile(fileName, "retrofit")
172168
removeTextFromFile(fileName, "moshi")
173169
}
174170

175171
if (renameConfig.usePaparazziDependencies != true) {
176-
println("Removing paparazzi dependencies")
177172
removeTextFromFile(fileName, "paparazzi")
173+
delete("${rootDir}/.github/workflows/paparazzi_tests.yml")
178174
}
179175

180176
if (renameConfig.useAndroidXR != true) {
181-
println("Removing xr dependencies")
182177
removeTextFromFile(fileName, "xr")
183178
}
184179
}

gradle/libs.versions.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ paparazzi = "1.3.5"
2424
retrofit = "2.11.0"
2525
room = "2.7.1"
2626
sortDependencies = "0.14"
27+
testParameterInjector = "1.18"
2728
xr = "1.0.0-alpha03"
2829
xr-material = "1.0.0-alpha06"
2930

@@ -50,6 +51,7 @@ compose-ui-test-junit = { group = "androidx.compose.ui", name = "ui-test-junit4"
5051
compose-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" }
5152
compose-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" }
5253
detekt-gradle-plugin = { module = "io.gitlab.arturbosch.detekt:detekt-gradle-plugin", version.ref = "detektGradlePlugin" }
54+
google-testparameterinjector = { module = "com.google.testparameterinjector:test-parameter-injector", version.ref = "testParameterInjector" }
5355
gradle = { module = "com.android.tools.build:gradle", version.ref = "agp" }
5456
gradle-versions-plugin = { module = "com.github.ben-manes:gradle-versions-plugin", version.ref = "gradleVersionsPlugin" }
5557
hilt-android = { module = "com.google.dagger:hilt-android", version.ref = "hilt" }

0 commit comments

Comments
 (0)