diff --git a/build.gradle.kts b/build.gradle.kts index 6b54e47..7e1b236 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -3,6 +3,7 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { id("org.springframework.boot") version "3.3.4" id("io.spring.dependency-management") version "1.1.6" + id("org.jlleitschuh.gradle.ktlint") version "12.1.1" kotlin("jvm") version "1.9.25" kotlin("plugin.spring") version "1.9.25" } @@ -26,6 +27,22 @@ dependencies { implementation("info.picocli:picocli-spring-boot-starter:4.7.6") testImplementation("org.springframework.boot:spring-boot-starter-test") + + // Kotest + testImplementation("io.kotest:kotest-runner-junit5:5.9.1") + testImplementation("io.kotest:kotest-assertions-core:5.9.1") + testImplementation("io.kotest.extensions:kotest-extensions-spring:1.3.0") + + // MockK + testImplementation("io.mockk:mockk:1.13.11") + testImplementation("com.ninja-squad:springmockk:4.0.2") + + // WireMock + testImplementation("org.wiremock.integrations:wiremock-spring-boot:3.1.0") + + // Testcontainers (versions managed by Spring Boot BOM) + testImplementation("org.springframework.boot:spring-boot-testcontainers") + testImplementation("org.testcontainers:testcontainers") } tasks.withType { diff --git a/src/main/kotlin/de/hoennig/gittally/GitTallyApplication.kt b/src/main/kotlin/de/hoennig/gittally/GitTallyApplication.kt index f2c122e..0b5fe66 100644 --- a/src/main/kotlin/de/hoennig/gittally/GitTallyApplication.kt +++ b/src/main/kotlin/de/hoennig/gittally/GitTallyApplication.kt @@ -1,22 +1,32 @@ package de.hoennig.gittally import org.springframework.boot.CommandLineRunner +import org.springframework.boot.ExitCodeGenerator +import org.springframework.boot.SpringApplication import org.springframework.boot.autoconfigure.SpringBootApplication import org.springframework.boot.runApplication +import org.springframework.stereotype.Component import picocli.CommandLine import picocli.CommandLine.IFactory import kotlin.system.exitProcess @SpringBootApplication -class GitTallyApplication( +class GitTallyApplication + +@Component +class CliRunner( private val factory: IFactory, private val rootCommand: GitTallyCommand, -) : CommandLineRunner { +) : CommandLineRunner, ExitCodeGenerator { + private var exitCode = 0 + override fun run(vararg args: String) { - exitProcess(CommandLine(rootCommand, factory).execute(*args)) + exitCode = CommandLine(rootCommand, factory).execute(*args) } + + override fun getExitCode() = exitCode } fun main(args: Array) { - runApplication(*args) + exitProcess(SpringApplication.exit(runApplication(*args))) } diff --git a/src/main/kotlin/de/hoennig/gittally/commands/ConfigPrintCommand.kt b/src/main/kotlin/de/hoennig/gittally/commands/ConfigPrintCommand.kt index f5e724e..b7f372c 100644 --- a/src/main/kotlin/de/hoennig/gittally/commands/ConfigPrintCommand.kt +++ b/src/main/kotlin/de/hoennig/gittally/commands/ConfigPrintCommand.kt @@ -11,7 +11,6 @@ import picocli.CommandLine.Option mixinStandardHelpOptions = true, ) class ConfigPrintCommand : Runnable { - @Option(names = ["--full"], description = ["Include all defaults"]) var full: Boolean = false diff --git a/src/test/kotlin/de/hoennig/gittally/ApplicationContextTest.kt b/src/test/kotlin/de/hoennig/gittally/ApplicationContextTest.kt new file mode 100644 index 0000000..1111b60 --- /dev/null +++ b/src/test/kotlin/de/hoennig/gittally/ApplicationContextTest.kt @@ -0,0 +1,36 @@ +package de.hoennig.gittally + +import de.hoennig.gittally.commands.ConfigPrintCommand +import de.hoennig.gittally.commands.InitCommand +import de.hoennig.gittally.commands.ServerCommand +import io.kotest.core.spec.style.FunSpec +import io.kotest.matchers.shouldNotBe +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.boot.test.context.SpringBootTest + +@SpringBootTest +class ApplicationContextTest : FunSpec() { + @Autowired + lateinit var rootCommand: GitTallyCommand + + @Autowired + lateinit var initCommand: InitCommand + + @Autowired + lateinit var serverCommand: ServerCommand + + @Autowired + lateinit var configPrintCommand: ConfigPrintCommand + + init { + test("application context loads") { + rootCommand shouldNotBe null + } + + test("all subcommands are wired") { + initCommand shouldNotBe null + serverCommand shouldNotBe null + configPrintCommand shouldNotBe null + } + } +} diff --git a/src/test/kotlin/de/hoennig/gittally/KotestProjectConfig.kt b/src/test/kotlin/de/hoennig/gittally/KotestProjectConfig.kt new file mode 100644 index 0000000..13f7379 --- /dev/null +++ b/src/test/kotlin/de/hoennig/gittally/KotestProjectConfig.kt @@ -0,0 +1,8 @@ +package de.hoennig.gittally + +import io.kotest.core.config.AbstractProjectConfig +import io.kotest.extensions.spring.SpringExtension + +object KotestProjectConfig : AbstractProjectConfig() { + override fun extensions() = listOf(SpringExtension) +}