added .claude/skills: introduced on-demand skill guides for architecture, PR documentation, and testing conventions; updated AGENTS.md to reference new skills

This commit is contained in:
Michael Hoennig
2026-07-08 15:20:37 +02:00
parent 39fb4e3492
commit 83e70e73c3
5 changed files with 207 additions and 108 deletions
+69
View File
@@ -0,0 +1,69 @@
---
name: writing-tests
description: GitTally testing conventions — Kotest FunSpec spec structure, MockK matchers, and the two patterns for mocking beans in Spring slice tests (springmockk @MockkBean or @TestConfiguration). Use when writing, extending, or refactoring tests.
---
# Writing Tests for GitTally
Tests use **Kotest `FunSpec`** style. `SpringExtension` is registered globally in `io.kotest.provided.ProjectConfig` — do not add it per-spec.
```kotlin
class MyTest : FunSpec() {
init {
test("description") { ... }
beforeEach { ... }
}
}
```
Use `shouldBe`, `shouldNotBe`, `shouldThrow` etc. from `io.kotest.matchers`.
Tests mirror the production package structure under `src/test/kotlin`.
Run a single test class instead of the full suite while iterating:
```bash
./gradlew test --tests "de.hoennig.gittally.ApplicationContextTest"
```
## Mocking in Spring Slice Tests
Use `@MockkBean` from `springmockk` to inject MockK mocks into the Spring context:
```kotlin
@WebMvcTest(SomeController::class)
class SomeControllerTest : FunSpec() {
@MockkBean
lateinit var someService: SomeService
init {
beforeEach { clearMocks(someService) }
// full MockK syntax: every { } / verify { }
}
}
```
Alternatively, register mocks via `@TestConfiguration` without the springmockk dependency:
```kotlin
@WebMvcTest(SomeController::class)
@Import(SomeControllerTest.Mocks::class)
class SomeControllerTest : FunSpec() {
@TestConfiguration
class Mocks {
@Bean fun someService(): SomeService = mockk()
}
@Autowired lateinit var someService: SomeService
init {
beforeEach { clearMocks(someService) }
}
}
```
Pure unit tests (no Spring context) use MockK directly without any Spring wiring.
## Test Infrastructure by Layer
- Git-facing code: integration tests against local fixture repositories (bare origin + clones), see `GitServiceTest` — no network access, hermetic git environment variables.
- HTTP clients (Gitea): WireMock.
- Docker-dependent code: Testcontainers.
- The `Watcher` and other schedulers never start their loops in tests; call `poll()`/lifecycle methods directly.