From d82aa9eddb1ed401e0ed7c9e8bc342f9bb7069f9 Mon Sep 17 00:00:00 2001 From: Daniel Frett Date: Thu, 7 Mar 2024 14:37:52 -0700 Subject: [PATCH 1/3] enable Paparazzi for the app module --- .gitattributes | 2 ++ .github/workflows/build.yml | 3 ++- .github/workflows/git-lfs-validation.yml | 15 ++++++++++++ README.md | 4 ++++ app/build.gradle.kts | 1 + .../main/kotlin/AndroidTestConfiguration.kt | 3 +++ .../src/main/kotlin/PaparazziConfiguration.kt | 24 +++++++++++++++++++ gradle/libs.versions.toml | 1 + 8 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/git-lfs-validation.yml create mode 100644 build-logic/src/main/kotlin/PaparazziConfiguration.kt diff --git a/.gitattributes b/.gitattributes index 6fee576c89..61d9cc4993 100644 --- a/.gitattributes +++ b/.gitattributes @@ -9,3 +9,5 @@ *.properties text *.xml text *.yml text + +**/snapshots/**/*.png filter=lfs diff=lfs merge=lfs -text diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a93e4a559e..eae6fe6c55 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -86,6 +86,7 @@ jobs: uses: actions/checkout@v4 with: fetch-depth: 0 + lfs: 'true' - name: Cache Maven uses: actions/cache@v4 with: @@ -101,7 +102,7 @@ jobs: - name: Setup Gradle uses: gradle/actions/setup-gradle@v3 - name: Run Unit Tests - run: ./gradlew test koverXmlReportDebug koverXmlReportProductionDebug --max-workers 1 --scan + run: ./gradlew test verifyPaparazzi koverXmlReportDebug koverXmlReportProductionDebug --max-workers 1 --scan - name: Codecov uses: codecov/codecov-action@v4 with: diff --git a/.github/workflows/git-lfs-validation.yml b/.github/workflows/git-lfs-validation.yml new file mode 100644 index 0000000000..dc2c8b498b --- /dev/null +++ b/.github/workflows/git-lfs-validation.yml @@ -0,0 +1,15 @@ +name: "Validate Git LFS" + +on: + push: + branches: [develop, master, feature/*] + pull_request: + branches: [develop, master, feature/*] + +jobs: + validate-lfs-pointers: + name: "Validate Git LFS pointers" + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - run: git lfs fsck --pointers diff --git a/README.md b/README.md index 363948ad8b..c632411a32 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,10 @@ GodTools Android [![codecov](https://codecov.io/gh/CruGlobal/godtools-android/branch/develop/graph/badge.svg)](https://codecov.io/gh/CruGlobal/godtools-android) +# Git LFS + +We use [Git LFS](https://git-lfs.com/) for storing Paparazzi snapshots. You will need to setup [Git LFS](https://git-lfs.com/) on your local machine in order to store new paparazzi snapshots or validate existing paparazzi snapshots. + # OneSky To enable OneSky translation downloads/uploads configure the following [gradle properties](https://docs.gradle.org/current/userguide/build_environment.html#sec:gradle_configuration_properties): diff --git a/app/build.gradle.kts b/app/build.gradle.kts index ccb0ca21b0..e69a5dcacc 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -7,6 +7,7 @@ plugins { alias(libs.plugins.grgit) alias(libs.plugins.hilt) alias(libs.plugins.ksp) + alias(libs.plugins.paparazzi) } android { diff --git a/build-logic/src/main/kotlin/AndroidTestConfiguration.kt b/build-logic/src/main/kotlin/AndroidTestConfiguration.kt index 12c6206a49..13c0680758 100644 --- a/build-logic/src/main/kotlin/AndroidTestConfiguration.kt +++ b/build-logic/src/main/kotlin/AndroidTestConfiguration.kt @@ -59,4 +59,7 @@ internal fun TestedExtension.configureTestOptions(project: Project) { } } } + + // Paparazzi + project.fixGuavaDependencyForPaparazzi() } diff --git a/build-logic/src/main/kotlin/PaparazziConfiguration.kt b/build-logic/src/main/kotlin/PaparazziConfiguration.kt new file mode 100644 index 0000000000..a5dcd1f420 --- /dev/null +++ b/build-logic/src/main/kotlin/PaparazziConfiguration.kt @@ -0,0 +1,24 @@ +import org.gradle.api.Project +import org.gradle.api.attributes.java.TargetJvmEnvironment + +internal fun Project.fixGuavaDependencyForPaparazzi() { + plugins.withId("app.cash.paparazzi") { + // Defer until afterEvaluate so that testImplementation is created by Android plugin. + afterEvaluate { + dependencies.constraints { + add("testImplementation", "com.google.guava:guava") { + attributes { + attribute( + TargetJvmEnvironment.TARGET_JVM_ENVIRONMENT_ATTRIBUTE, + objects.named(TargetJvmEnvironment::class.java, TargetJvmEnvironment.STANDARD_JVM) + ) + } + because( + "LayoutLib and sdk-common depend on Guava's -jre published variant. " + + "See https://github.com/cashapp/paparazzi/issues/906." + ) + } + } + } + } +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 0ded019cd1..0f0dd9da32 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -240,3 +240,4 @@ grgit = { id = "org.ajoberstar.grgit", version = "5.2.2" } hilt = { id = "com.google.dagger.hilt.android", version.ref = "dagger" } ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } ktlint = { id = "org.jlleitschuh.gradle.ktlint", version.ref = "ktlintGradle" } +paparazzi = { id = "app.cash.paparazzi", version = "1.3.3" } From b305ccf382c33b72969da8d94363d9946323232f Mon Sep 17 00:00:00 2001 From: Daniel Frett Date: Thu, 7 Mar 2024 14:50:42 -0700 Subject: [PATCH 2/3] add Paparazzi tests for the LanguageDownloadProgressIndicator --- .../LanguageDownloadProgressIndicator.kt | 34 ++++++++++++------- ...st_LanguageDownloadProgressIndicator().png | 3 ++ ...eDownloadProgressIndicatorPaparazziTest.kt | 30 ++++++++++++++++ .../base/ui/compose/CompositionLocals.kt | 8 +++-- .../godtools/base/ui/theme/GodToolsTheme.kt | 4 +-- 5 files changed, 62 insertions(+), 17 deletions(-) create mode 100644 app/src/test/snapshots/images/org.cru.godtools.ui.languages.downloadable_LanguageDownloadProgressIndicatorPaparazziTest_LanguageDownloadProgressIndicator().png create mode 100644 app/src/testDebug/kotlin/org/cru/godtools/ui/languages/downloadable/LanguageDownloadProgressIndicatorPaparazziTest.kt diff --git a/app/src/main/kotlin/org/cru/godtools/ui/languages/downloadable/LanguageDownloadProgressIndicator.kt b/app/src/main/kotlin/org/cru/godtools/ui/languages/downloadable/LanguageDownloadProgressIndicator.kt index c659fa927f..c028f5bef2 100644 --- a/app/src/main/kotlin/org/cru/godtools/ui/languages/downloadable/LanguageDownloadProgressIndicator.kt +++ b/app/src/main/kotlin/org/cru/godtools/ui/languages/downloadable/LanguageDownloadProgressIndicator.kt @@ -2,6 +2,9 @@ package org.cru.godtools.ui.languages.downloadable import androidx.compose.animation.core.animateFloatAsState import androidx.compose.foundation.border +import androidx.compose.foundation.layout.BoxWithConstraints +import androidx.compose.foundation.layout.aspectRatio +import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.shape.CircleShape @@ -14,20 +17,23 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier -import androidx.compose.ui.unit.Dp +import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.unit.dp +private val DEFAULT_ICON_SIZE = 24.dp + @Composable internal fun LanguageDownloadProgressIndicator( isPinned: Boolean, downloaded: Int, total: Int, modifier: Modifier = Modifier, - iconSize: Dp = 24.dp, ) { val total = total.coerceAtLeast(0) val downloaded = downloaded.coerceIn(0, total) - val contentModifier = modifier.size(iconSize) + val contentModifier = modifier + .size(DEFAULT_ICON_SIZE) + .aspectRatio(1f) when { !isPinned -> Icon( @@ -51,15 +57,19 @@ internal fun LanguageDownloadProgressIndicator( }, ) - val iconPadding = iconSize / 12 - CircularProgressIndicator( - progress = { progress }, - color = MaterialTheme.colorScheme.primary, - strokeWidth = (iconSize / 2) - iconPadding, - modifier = contentModifier - .padding(iconPadding) - .border(iconSize / 12, MaterialTheme.colorScheme.primary, CircleShape) - ) + BoxWithConstraints(contentModifier) { + val size = with(LocalDensity.current) { constraints.maxWidth.toDp() } + val iconPadding = size / 12 + CircularProgressIndicator( + progress = { progress }, + color = MaterialTheme.colorScheme.primary, + strokeWidth = (size / 2) - iconPadding, + modifier = Modifier + .fillMaxSize() + .padding(iconPadding) + .border(size / 12, MaterialTheme.colorScheme.primary, CircleShape) + ) + } } } } diff --git a/app/src/test/snapshots/images/org.cru.godtools.ui.languages.downloadable_LanguageDownloadProgressIndicatorPaparazziTest_LanguageDownloadProgressIndicator().png b/app/src/test/snapshots/images/org.cru.godtools.ui.languages.downloadable_LanguageDownloadProgressIndicatorPaparazziTest_LanguageDownloadProgressIndicator().png new file mode 100644 index 0000000000..6935f93a05 --- /dev/null +++ b/app/src/test/snapshots/images/org.cru.godtools.ui.languages.downloadable_LanguageDownloadProgressIndicatorPaparazziTest_LanguageDownloadProgressIndicator().png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c6f61efafe1de02467b685c34a38021c17af15ca469fcd6650ee6de5160740ed +size 9218 diff --git a/app/src/testDebug/kotlin/org/cru/godtools/ui/languages/downloadable/LanguageDownloadProgressIndicatorPaparazziTest.kt b/app/src/testDebug/kotlin/org/cru/godtools/ui/languages/downloadable/LanguageDownloadProgressIndicatorPaparazziTest.kt new file mode 100644 index 0000000000..015e659f3d --- /dev/null +++ b/app/src/testDebug/kotlin/org/cru/godtools/ui/languages/downloadable/LanguageDownloadProgressIndicatorPaparazziTest.kt @@ -0,0 +1,30 @@ +package org.cru.godtools.ui.languages.downloadable + +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Row +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import app.cash.paparazzi.Paparazzi +import kotlin.test.Test +import org.cru.godtools.base.ui.theme.GodToolsTheme +import org.junit.Rule + +class LanguageDownloadProgressIndicatorPaparazziTest { + @get:Rule + val paparazzi = Paparazzi() + + @Test + fun `LanguageDownloadProgressIndicator()`() { + paparazzi.snapshot { + GodToolsTheme(disableDagger = true) { + Box { + Row(Modifier.align(Alignment.Center)) { + for (it in 0..5) { + LanguageDownloadProgressIndicator(isPinned = true, downloaded = it, total = 5) + } + } + } + } + } + } +} diff --git a/ui/base/src/main/kotlin/org/cru/godtools/base/ui/compose/CompositionLocals.kt b/ui/base/src/main/kotlin/org/cru/godtools/base/ui/compose/CompositionLocals.kt index 353e063323..8798296b25 100644 --- a/ui/base/src/main/kotlin/org/cru/godtools/base/ui/compose/CompositionLocals.kt +++ b/ui/base/src/main/kotlin/org/cru/godtools/base/ui/compose/CompositionLocals.kt @@ -22,11 +22,13 @@ import org.greenrobot.eventbus.EventBus val LocalEventBus = staticCompositionLocalOf { EventBus() } @Composable -internal fun CompositionLocals(content: @Composable () -> Unit) { +internal fun CompositionLocals(disableDagger: Boolean = false, content: @Composable () -> Unit) { val context = LocalContext.current val daggerComponents = when { - LocalInspectionMode.current -> object : ComposeEntryPoint { - override val eventBus = EventBus() + LocalInspectionMode.current || disableDagger -> remember { + object : ComposeEntryPoint { + override val eventBus = EventBus() + } } else -> remember { EntryPointAccessors.fromApplication(context) } } diff --git a/ui/base/src/main/kotlin/org/cru/godtools/base/ui/theme/GodToolsTheme.kt b/ui/base/src/main/kotlin/org/cru/godtools/base/ui/theme/GodToolsTheme.kt index 64f2207b9b..f03d56ead2 100644 --- a/ui/base/src/main/kotlin/org/cru/godtools/base/ui/theme/GodToolsTheme.kt +++ b/ui/base/src/main/kotlin/org/cru/godtools/base/ui/theme/GodToolsTheme.kt @@ -114,7 +114,7 @@ object GodToolsTheme { } @Composable -fun GodToolsTheme(content: @Composable () -> Unit) { +fun GodToolsTheme(disableDagger: Boolean = false, content: @Composable () -> Unit) { val isDarkTheme = isSystemInDarkTheme() && BuildConfig.DEBUG MaterialTheme( colorScheme = when { @@ -123,7 +123,7 @@ fun GodToolsTheme(content: @Composable () -> Unit) { }, typography = GodToolsTheme.typography ) { - CompositionLocals { + CompositionLocals(disableDagger) { CompositionLocalProvider( LocalLightColorSchemeActive provides !isDarkTheme, LocalContentColor provides contentColorFor(MaterialTheme.colorScheme.background), From c4519082717d0f8e837aa3edfe89e0e03c4a23b2 Mon Sep 17 00:00:00 2001 From: Daniel Frett Date: Fri, 8 Mar 2024 10:56:51 -0700 Subject: [PATCH 3/3] add some paparazzi tests for SquareToolCards --- app/build.gradle.kts | 1 + .../org/cru/godtools/ui/tools/banner.jpg | Bin 0 -> 28653 bytes ...parazziTest_SquareToolCard() - Default.png | 3 + ...zziTest_SquareToolCard() - Downloading.png | 3 + ...quareToolCard() - Show Second Language.png | 3 + .../ui/tools/SquareToolCardPaparazziTest.kt | 113 ++++++++++++++++++ gradle/libs.versions.toml | 4 +- 7 files changed, 126 insertions(+), 1 deletion(-) create mode 100644 app/src/test/resources/org/cru/godtools/ui/tools/banner.jpg create mode 100644 app/src/test/snapshots/images/org.cru.godtools.ui.tools_SquareToolCardPaparazziTest_SquareToolCard() - Default.png create mode 100644 app/src/test/snapshots/images/org.cru.godtools.ui.tools_SquareToolCardPaparazziTest_SquareToolCard() - Downloading.png create mode 100644 app/src/test/snapshots/images/org.cru.godtools.ui.tools_SquareToolCardPaparazziTest_SquareToolCard() - Show Second Language.png create mode 100644 app/src/testDebug/kotlin/org/cru/godtools/ui/tools/SquareToolCardPaparazziTest.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index e69a5dcacc..d55f89bcee 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -233,6 +233,7 @@ dependencies { testImplementation(libs.androidx.arch.core.testing) testImplementation(libs.androidx.lifecycle.runtime.testing) testImplementation(libs.androidx.test.espresso.core) + testImplementation(libs.coil.test) testImplementation(libs.gtoSupport.testing.dagger) testImplementation(libs.hilt.testing) testImplementation(libs.kotlin.coroutines.test) diff --git a/app/src/test/resources/org/cru/godtools/ui/tools/banner.jpg b/app/src/test/resources/org/cru/godtools/ui/tools/banner.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3d87fcae0f1ba5b7723f0384d90e7704900c1015 GIT binary patch literal 28653 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 X{aXcaDJ+eB{pIXX{&EKRGynepd^(}C literal 0 HcmV?d00001 diff --git a/app/src/test/snapshots/images/org.cru.godtools.ui.tools_SquareToolCardPaparazziTest_SquareToolCard() - Default.png b/app/src/test/snapshots/images/org.cru.godtools.ui.tools_SquareToolCardPaparazziTest_SquareToolCard() - Default.png new file mode 100644 index 0000000000..4f9ea98b7f --- /dev/null +++ b/app/src/test/snapshots/images/org.cru.godtools.ui.tools_SquareToolCardPaparazziTest_SquareToolCard() - Default.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9dfcb46e7242d767a6175f7f912fc5d2cd6d5ab8b189aedf6c33f4f97e4660eb +size 37294 diff --git a/app/src/test/snapshots/images/org.cru.godtools.ui.tools_SquareToolCardPaparazziTest_SquareToolCard() - Downloading.png b/app/src/test/snapshots/images/org.cru.godtools.ui.tools_SquareToolCardPaparazziTest_SquareToolCard() - Downloading.png new file mode 100644 index 0000000000..e33b72ea1f --- /dev/null +++ b/app/src/test/snapshots/images/org.cru.godtools.ui.tools_SquareToolCardPaparazziTest_SquareToolCard() - Downloading.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:37f9e27c861999582d0413ee81e1778f74a4c70d4444d4289e5400435a56ea93 +size 36695 diff --git a/app/src/test/snapshots/images/org.cru.godtools.ui.tools_SquareToolCardPaparazziTest_SquareToolCard() - Show Second Language.png b/app/src/test/snapshots/images/org.cru.godtools.ui.tools_SquareToolCardPaparazziTest_SquareToolCard() - Show Second Language.png new file mode 100644 index 0000000000..fdbdc1d104 --- /dev/null +++ b/app/src/test/snapshots/images/org.cru.godtools.ui.tools_SquareToolCardPaparazziTest_SquareToolCard() - Show Second Language.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:abacd4fdb55657953e55003f7645529ca04b9ab3302c848094c53b5307657c98 +size 38116 diff --git a/app/src/testDebug/kotlin/org/cru/godtools/ui/tools/SquareToolCardPaparazziTest.kt b/app/src/testDebug/kotlin/org/cru/godtools/ui/tools/SquareToolCardPaparazziTest.kt new file mode 100644 index 0000000000..4fe0c90199 --- /dev/null +++ b/app/src/testDebug/kotlin/org/cru/godtools/ui/tools/SquareToolCardPaparazziTest.kt @@ -0,0 +1,113 @@ +package org.cru.godtools.ui.tools + +import android.graphics.drawable.Drawable +import androidx.compose.foundation.layout.Box +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import app.cash.paparazzi.Paparazzi +import coil.Coil +import coil.ImageLoader +import coil.annotation.ExperimentalCoilApi +import coil.test.FakeImageLoaderEngine +import io.mockk.mockk +import java.util.Locale +import kotlin.test.AfterTest +import kotlin.test.BeforeTest +import kotlin.test.Test +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.UnconfinedTestDispatcher +import kotlinx.coroutines.test.resetMain +import kotlinx.coroutines.test.setMain +import org.cru.godtools.base.ui.theme.GodToolsTheme +import org.cru.godtools.downloadmanager.DownloadProgress +import org.cru.godtools.model.Language +import org.cru.godtools.model.Tool +import org.cru.godtools.model.randomTool +import org.cru.godtools.model.randomTranslation +import org.junit.Rule + +class SquareToolCardPaparazziTest { + @get:Rule + val paparazzi = Paparazzi() + + private val toolState = ToolCard.State( + tool = randomTool( + name = "Tool Title", + category = Tool.CATEGORY_GOSPEL, + ), + banner = mockk(), + secondLanguage = Language(Locale.FRENCH), + secondTranslation = randomTranslation() + ) + + @BeforeTest + @OptIn(ExperimentalCoilApi::class, ExperimentalCoroutinesApi::class) + fun setup() { + Dispatchers.setMain(UnconfinedTestDispatcher()) + val banner = Drawable.createFromStream(javaClass.getResourceAsStream("banner.jpg"), "banner.jpg")!! + Coil.setImageLoader( + ImageLoader.Builder(paparazzi.context) + .components { + add( + FakeImageLoaderEngine.Builder() + .intercept(toolState.banner!!, banner) + .build() + ) + } + .build() + ) + } + + @AfterTest + @OptIn(ExperimentalCoroutinesApi::class) + fun cleanup() { + Coil.reset() + Dispatchers.resetMain() + } + + @Test + fun `SquareToolCard() - Default`() { + paparazzi.snapshot { + GodToolsTheme(disableDagger = true) { + Box { + SquareToolCard( + state = toolState, + modifier = Modifier.align(Alignment.Center), + ) + } + } + } + } + + @Test + fun `SquareToolCard() - Downloading`() { + paparazzi.snapshot { + GodToolsTheme(disableDagger = true) { + Box { + SquareToolCard( + state = toolState.copy( + downloadProgress = DownloadProgress(2, 5) + ), + modifier = Modifier.align(Alignment.Center), + ) + } + } + } + } + + @Test + fun `SquareToolCard() - Show Second Language`() { + paparazzi.snapshot { + GodToolsTheme(disableDagger = true) { + Box { + SquareToolCard( + state = toolState, + showSecondLanguage = true, + modifier = Modifier.align(Alignment.Center), + ) + } + } + } + } +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 0f0dd9da32..c19703309a 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -12,6 +12,7 @@ androidx-room = "2.6.1" androidx-viewpager2 = "1.0.0" androidx-work = "2.9.0" circuit = "0.19.1" +coil = "2.6.0" dagger = "2.51" eventbus = "3.3.1" facebook = "16.3.0" @@ -88,7 +89,8 @@ circuit-foundation = { module = "com.slack.circuit:circuit-foundation", version. circuit-test = { module = "com.slack.circuit:circuit-test", version.ref = "circuit" } circuitx-android = { module = "com.slack.circuit:circuitx-android", version.ref = "circuit" } circuitx-effects = { module = "com.slack.circuit:circuitx-effects", version.ref = "circuit" } -coil-compose = "io.coil-kt:coil-compose:2.6.0" +coil-compose = { module = "io.coil-kt:coil-compose", version.ref = "coil" } +coil-test = { module = "io.coil-kt:coil-test", version.ref = "coil" } compose-reorderable = "org.burnoutcrew.composereorderable:reorderable:0.9.6" dagger = { module = "com.google.dagger:dagger", version.ref = "dagger" } dagger-compiler = { module = "com.google.dagger:dagger-compiler", version.ref = "dagger" }