fluent-assertlisted
Install: claude install-skill Ahoo-Wang/skills
# FluentAssert
Use FluentAssert for Kotlin assertions in this repository and in downstream Kotlin test examples. Prefer the Kotlin extension style over direct AssertJ calls.
## Core Rule
```kotlin
import me.ahoo.test.asserts.assert
actual.assert().isEqualTo(expected)
```
Avoid `assertThat(actual)` in ordinary test code. FluentAssert keeps nullable receivers natural:
```kotlin
val name: String? = null
name.assert().isNull()
```
## Common Patterns
| Need | Pattern |
|---|---|
| Primitive/string/object | `value.assert().isEqualTo(expected)` |
| Collection/list | `items.assert().hasSize(2).contains("a")` |
| Map | `map.assert().hasSize(2).containsEntry("a", 1)` |
| Nullable value | `value.assert().isNull()` or `value.assert().isNotNull()` |
| Exception lambda | `assertThrownBy<IllegalArgumentException> { call() }.hasMessage("bad")` |
| Existing exception | `throwable.assert().hasMessageContaining("bad")` |
| LocalDate/YearMonth month | `date.assert().hasMonth(Month.APRIL)` |
| CompletableFuture success/failure | `completableFuture.assert().isCompletedWithValue(value)` / `.isCompletedExceptionally()` |
| Recursive comparison | `actual.assert().usingRecursiveComparison().isEqualTo(expected)` |
For exception lambdas, also import:
```kotlin
import me.ahoo.test.asserts.assertThrownBy
```
For `LocalDate` and `YearMonth` month assertions, import `java.time.Month`; those assertions expect `Month`, not an integer.
## Wow/Saga Tests
Use FluentAssert inside expectation blocks t