app

Local-first trade for farms and co-ops
git clone https://radroots.dev/git/app.git
Log | Files | Refs | README | LICENSE

commit 66bd08023f3cef50fecc779d1e131f33e438369e
parent 3cb60476cbc6e4c3db8973b6d43f964d7b0964f6
Author: triesap <tyson@radroots.org>
Date:   Sat,  1 Aug 2026 18:51:07 +0000

test: fail closed on an empty test inventory

- verify Kotlin test sources before every Gradle test task
- reject a completely absent suite before NO-SOURCE success
- retain Gradle configuration-cache compatibility
- prove both populated and empty inventory behavior

Diffstat:
Mapp/desktop/build.gradle.kts | 36++++++++++++++++++++++++++++++++++++
1 file changed, 36 insertions(+), 0 deletions(-)

diff --git a/app/desktop/build.gradle.kts b/app/desktop/build.gradle.kts @@ -1,4 +1,13 @@ import org.jetbrains.compose.desktop.application.dsl.TargetFormat +import org.gradle.api.DefaultTask +import org.gradle.api.GradleException +import org.gradle.api.file.ConfigurableFileCollection +import org.gradle.api.provider.Property +import org.gradle.api.tasks.Input +import org.gradle.api.tasks.InputFiles +import org.gradle.api.tasks.PathSensitive +import org.gradle.api.tasks.PathSensitivity +import org.gradle.api.tasks.TaskAction import org.gradle.api.tasks.testing.Test import org.jetbrains.kotlin.gradle.dsl.JvmTarget @@ -18,7 +27,34 @@ dependencies { testImplementation(libs.compose.ui.test.junit4) } +val testInventoryRoot = providers + .gradleProperty("testInventoryRoot") + .orElse("src/test/kotlin") +val expectedTests = fileTree(testInventoryRoot.get()) { + include("**/*Test.kt") +} +abstract class VerifyTestInventory : DefaultTask() { + @get:InputFiles + @get:PathSensitive(PathSensitivity.RELATIVE) + abstract val testFiles: ConfigurableFileCollection + + @get:Input + abstract val sourceRoot: Property<String> + + @TaskAction + fun verify() { + if (testFiles.isEmpty) { + throw GradleException("No Kotlin tests found under ${sourceRoot.get()}") + } + } +} +val verifyTestInventory by tasks.registering(VerifyTestInventory::class) { + testFiles.from(expectedTests) + sourceRoot.set(testInventoryRoot) +} + tasks.withType<Test>().configureEach { + dependsOn(verifyTestInventory) failOnNoDiscoveredTests.set(true) }