# Testing

## Run the Test Suite

```powershell
mvn test
```

## Test Strategy

The project uses a mix of unit and integration tests:

- **Unit tests** for isolated business logic and service behavior
- **Integration tests** for filesystem/SQLite behavior and output artifacts
- **Mock-based tests** for MQTT and process-launch behavior

Frameworks:

- JUnit Jupiter
- Mockito JUnit Jupiter

## Test Inventory

| Test Class | Type | Main Focus |
|---|---|---|
| `AppStateTest` | Unit | state defaults and listener notifications |
| `BinaryEventServiceTest` | Unit | payload validation and duplicate handling |
| `EvaluationServiceTest` | Unit | ratio-threshold mapping and animation side effect |
| `StatisticsServiceTest` | Unit + Integration | rolling averages and ratio calculation |
| `DataPersistenceServiceTest` | Integration | SQLite persistence and retrieval ordering |
| `MqttClientServiceTest` | Unit (mocked client) | MQTT connect/subscribe/publish callbacks |
| `ProcessManagerServiceTest` | Unit (injected launcher) | process startup/shutdown and healthcheck reporting |
| `AnimationFileServiceTest` | Integration | JSON output mapping and overwrite behavior |

## What Is Covered Well

- Core event pipeline behavior
- Threshold logic and level transitions
- Persistence query correctness
- Managed process command generation and reporting
- Animation output mapping to domain levels

## Known Testing Gaps

- No full end-to-end GUI automation (Swing/JCEF interaction)
- No performance/load tests for high MQTT throughput
- No integration tests for real external Unreal processes in CI
- No property-based or fuzz testing for malformed payload variants

## Manual Verification Checklist

After a successful run, verify:

1. MQTT status in the UI changes to connected.
2. New payloads affect chart and level bar.
3. `animation.output.path` file is updated when level changes.
4. Shutdown stops optional processes and closes the application cleanly.
