diff --git a/plugin-build/src/main/kotlin/io/sentry/android/gradle/AndroidComponentsConfig.kt b/plugin-build/src/main/kotlin/io/sentry/android/gradle/AndroidComponentsConfig.kt index 53f47656..797a5e24 100644 --- a/plugin-build/src/main/kotlin/io/sentry/android/gradle/AndroidComponentsConfig.kt +++ b/plugin-build/src/main/kotlin/io/sentry/android/gradle/AndroidComponentsConfig.kt @@ -488,7 +488,7 @@ private fun ApplicationVariant.configureSnapshotsTasks( // Wire Paparazzi test generation and upload task when the Paparazzi plugin is applied project.pluginManager.withPlugin("app.cash.paparazzi") { - if (extension.snapshots.generateSnapshotTests.get()) { + if (extension.snapshots.previews.generateTests.get()) { val android = project.extensions.getByType(BaseExtension::class.java) project.dependencies.add( @@ -508,7 +508,7 @@ private fun ApplicationVariant.configureSnapshotsTasks( val generateTask = GenerateSnapshotTestsTask.register( project, - extension.snapshots, + extension.snapshots.previews, android, this@configureSnapshotsTasks, paparazziMajorVersion, diff --git a/plugin-build/src/main/kotlin/io/sentry/android/gradle/extensions/SnapshotPreviewsExtension.kt b/plugin-build/src/main/kotlin/io/sentry/android/gradle/extensions/SnapshotPreviewsExtension.kt new file mode 100644 index 00000000..710e67ce --- /dev/null +++ b/plugin-build/src/main/kotlin/io/sentry/android/gradle/extensions/SnapshotPreviewsExtension.kt @@ -0,0 +1,21 @@ +package io.sentry.android.gradle.extensions + +import javax.inject.Inject +import org.gradle.api.model.ObjectFactory +import org.gradle.api.provider.ListProperty +import org.gradle.api.provider.Property +import org.jetbrains.annotations.ApiStatus + +@ApiStatus.Experimental +open class SnapshotPreviewsExtension @Inject constructor(objects: ObjectFactory) { + + val generateTests: Property = objects.property(Boolean::class.java).convention(true) + + val includePrivatePreviews: Property = + objects.property(Boolean::class.java).convention(true) + + val packageTrees: ListProperty = + objects.listProperty(String::class.java).convention(emptyList()) + + val theme: Property = objects.property(String::class.java) +} diff --git a/plugin-build/src/main/kotlin/io/sentry/android/gradle/extensions/SnapshotsExtension.kt b/plugin-build/src/main/kotlin/io/sentry/android/gradle/extensions/SnapshotsExtension.kt index 702735b7..00617c64 100644 --- a/plugin-build/src/main/kotlin/io/sentry/android/gradle/extensions/SnapshotsExtension.kt +++ b/plugin-build/src/main/kotlin/io/sentry/android/gradle/extensions/SnapshotsExtension.kt @@ -1,8 +1,8 @@ package io.sentry.android.gradle.extensions import javax.inject.Inject +import org.gradle.api.Action import org.gradle.api.model.ObjectFactory -import org.gradle.api.provider.ListProperty import org.gradle.api.provider.Property import org.jetbrains.annotations.ApiStatus @@ -11,14 +11,10 @@ open class SnapshotsExtension @Inject constructor(objects: ObjectFactory) { val enabled: Property = objects.property(Boolean::class.java).convention(false) - val generateSnapshotTests: Property = - objects.property(Boolean::class.java).convention(true) + val previews: SnapshotPreviewsExtension = + objects.newInstance(SnapshotPreviewsExtension::class.java) - val includePrivatePreviews: Property = - objects.property(Boolean::class.java).convention(true) - - val packageTrees: ListProperty = - objects.listProperty(String::class.java).convention(emptyList()) - - val theme: Property = objects.property(String::class.java) + fun previews(action: Action) { + action.execute(previews) + } } diff --git a/plugin-build/src/main/kotlin/io/sentry/android/gradle/snapshot/GenerateSnapshotTestsTask.kt b/plugin-build/src/main/kotlin/io/sentry/android/gradle/snapshot/GenerateSnapshotTestsTask.kt index d0526fcb..1b38a3e2 100644 --- a/plugin-build/src/main/kotlin/io/sentry/android/gradle/snapshot/GenerateSnapshotTestsTask.kt +++ b/plugin-build/src/main/kotlin/io/sentry/android/gradle/snapshot/GenerateSnapshotTestsTask.kt @@ -3,7 +3,7 @@ package io.sentry.android.gradle.snapshot import com.android.build.api.variant.ApplicationVariant import com.android.build.gradle.BaseExtension import io.sentry.android.gradle.SentryTasksProvider.capitalized -import io.sentry.android.gradle.extensions.SnapshotsExtension +import io.sentry.android.gradle.extensions.SnapshotPreviewsExtension import java.io.File import org.gradle.api.DefaultTask import org.gradle.api.Project @@ -63,7 +63,7 @@ abstract class GenerateSnapshotTestsTask : DefaultTask() { fun register( project: Project, - extension: SnapshotsExtension, + extension: SnapshotPreviewsExtension, android: BaseExtension, variant: ApplicationVariant, paparazziMajorVersion: Provider, @@ -76,7 +76,6 @@ abstract class GenerateSnapshotTestsTask : DefaultTask() { task.theme.set(extension.theme) task.paparazziMajorVersion.value(paparazziMajorVersion) // Fall back to the Android namespace when the user doesn't configure packageTrees - // TODO do we actually need this? task.packageTrees.set( extension.packageTrees.map { packages -> packages.ifEmpty { listOf(android.namespace!!) } diff --git a/plugin-build/src/test/kotlin/io/sentry/android/gradle/extensions/SnapshotsExtensionTest.kt b/plugin-build/src/test/kotlin/io/sentry/android/gradle/extensions/SnapshotsExtensionTest.kt index 5517ee10..cd2222dc 100644 --- a/plugin-build/src/test/kotlin/io/sentry/android/gradle/extensions/SnapshotsExtensionTest.kt +++ b/plugin-build/src/test/kotlin/io/sentry/android/gradle/extensions/SnapshotsExtensionTest.kt @@ -1,6 +1,7 @@ package io.sentry.android.gradle.extensions import kotlin.test.assertFalse +import kotlin.test.assertNull import kotlin.test.assertTrue import org.gradle.testfixtures.ProjectBuilder import org.junit.Test @@ -16,36 +17,62 @@ class SnapshotsExtensionTest { } @Test - fun `generateSnapshotTests is true by default`() { + fun `previews generateTests is true by default`() { val project = ProjectBuilder.builder().build() val extension = project.objects.newInstance(SnapshotsExtension::class.java) - assertTrue(extension.generateSnapshotTests.get()) + assertTrue(extension.previews.generateTests.get()) } @Test - fun `generateSnapshotTests can be set to false`() { + fun `previews generateTests can be set to false`() { val project = ProjectBuilder.builder().build() val extension = project.objects.newInstance(SnapshotsExtension::class.java) - extension.generateSnapshotTests.set(false) + extension.previews.generateTests.set(false) - assertFalse(extension.generateSnapshotTests.get()) + assertFalse(extension.previews.generateTests.get()) } @Test - fun `includePrivatePreviews is true by default`() { + fun `previews includePrivatePreviews is true by default`() { val project = ProjectBuilder.builder().build() val extension = project.objects.newInstance(SnapshotsExtension::class.java) - assertTrue(extension.includePrivatePreviews.get()) + assertTrue(extension.previews.includePrivatePreviews.get()) } @Test - fun `packageTrees is empty by default`() { + fun `previews packageTrees is empty by default`() { val project = ProjectBuilder.builder().build() val extension = project.objects.newInstance(SnapshotsExtension::class.java) - assertTrue(extension.packageTrees.get().isEmpty()) + assertTrue(extension.previews.packageTrees.get().isEmpty()) + } + + @Test + fun `previews theme has no default`() { + val project = ProjectBuilder.builder().build() + val extension = project.objects.newInstance(SnapshotsExtension::class.java) + + assertNull(extension.previews.theme.orNull) + } + + @Test + fun `previews block configures sub-extension`() { + val project = ProjectBuilder.builder().build() + val extension = project.objects.newInstance(SnapshotsExtension::class.java) + + extension.previews { previews -> + previews.generateTests.set(false) + previews.includePrivatePreviews.set(false) + previews.packageTrees.set(listOf("com.example")) + previews.theme.set("AppTheme") + } + + assertFalse(extension.previews.generateTests.get()) + assertFalse(extension.previews.includePrivatePreviews.get()) + assertTrue(extension.previews.packageTrees.get() == listOf("com.example")) + assertTrue(extension.previews.theme.get() == "AppTheme") } }