88 lines
4.3 KiB
Markdown
88 lines
4.3 KiB
Markdown
---
|
||
description: Generate PHPUnit snapshot tests for a transformation config. Use when you want to add or update integration tests for a config file by providing 1–2 example input/output pairs per transformation rule.
|
||
argument-hint: "config file path (e.g. config/config-ubs-account.json)"
|
||
agent: agent
|
||
---
|
||
|
||
# Generate Config Integration Tests
|
||
|
||
You help the user create PHPUnit snapshot (golden-file) tests for a specific transformation config.
|
||
|
||
## Workflow
|
||
|
||
### Step 1 — Identify the config
|
||
|
||
If the user provided a config path as the argument, use it. Otherwise list all JSON files in `config/` (excluding `config.example.json`) and ask which one to test.
|
||
|
||
### Step 2 — Read and summarise the config
|
||
|
||
Read the config file with the read_file tool. Then present a compact table like:
|
||
|
||
| # | sourceColumn | transformations | outputColumn |
|
||
|---|---|---|---|
|
||
| 1 | Buchungsdatum | dateformat (d.m.Y → Y-m-d) | date |
|
||
| 2 | Buchungstext | trim → replace → lowercase | description |
|
||
| … | … | … | … |
|
||
|
||
Also note: the `metadata.extractionRules` (which pre-header lines are extracted and under what names), and `csvStructure.headerLine` / `csvStructure.delimiter`.
|
||
|
||
### Step 3 — Collect examples from the user
|
||
|
||
For each row in the table, ask the user to provide **1–2 example input cell values** and the **expected output value** after transformation. Present a form like:
|
||
|
||
```
|
||
Rule 1 — Buchungsdatum → date (dateformat d.m.Y → Y-m-d)
|
||
Example 1 input: ___ expected output: ___
|
||
Example 2 input: ___ expected output: ___ (optional)
|
||
|
||
Rule 2 — Buchungstext → description (trim → replace → lowercase)
|
||
Example 1 input: ___ expected output: ___
|
||
…
|
||
```
|
||
|
||
For `_constant_` source columns (metadata injections), ask the user for the expected metadata value that should appear in the output (e.g. the IBAN string).
|
||
|
||
For metadata extraction rules, ask for a representative pre-header line string and the expected extracted value.
|
||
|
||
If the user skips a rule, use a simple passthrough value (copy source → output unchanged).
|
||
|
||
### Step 4 — Synthesise fixture files
|
||
|
||
Derive the config name from the filename (e.g. `config-ubs-account.json` → `config-ubs-account`).
|
||
|
||
**`tests/fixtures/<config-name>/input.csv`**
|
||
|
||
Build a minimal CSV that satisfies `csvStructure`:
|
||
- Pre-header lines (lines 1 … headerLine-1): one synthetic line per metadata extraction rule that matches its `regex` and returns the example value the user gave. Remaining pre-header lines (if any) can be empty placeholders.
|
||
- Header line (line `headerLine`): the delimiter-separated source column names needed by the config.
|
||
- Data rows: one row per example set. Where the user provided two examples for the same rule, use two data rows; align all other columns to the first example's values.
|
||
|
||
**`tests/fixtures/<config-name>/expected.csv`**
|
||
|
||
Header: the output column names in the order they appear after all transformations are applied (new `create` columns appended after existing ones).
|
||
Rows: the expected output values the user specified, aligned to the data rows above.
|
||
|
||
### Step 5 — Generate or update `tests/ConfigIntegrationTest.php`
|
||
|
||
If the file does not exist, create it. If it exists, add or replace only the parts that concern this config's fixture. The class must:
|
||
|
||
- Use namespace `UbsCsvTransformer\Tests`
|
||
- Extend `PHPUnit\Framework\TestCase`
|
||
- Have a `public static function fixtureProvider(): array` that auto-discovers `tests/fixtures/*/` directories, maps each to `['configName' => ..., 'fixtureDir' => ...]`
|
||
- Have a `@dataProvider fixtureProvider` test method `testConfigProducesExpectedOutput(string $configName, string $fixtureDir)` that:
|
||
1. Resolves `config/<configName>.json`
|
||
2. Instantiates `ConfigurationLoader` with that path
|
||
3. Instantiates `TransformerEngine` with the loader
|
||
4. Calls `transform()` with `$fixtureDir/input.csv` into a temp file
|
||
5. Reads the temp file and `$fixtureDir/expected.csv` and asserts they are identical line-by-line with `assertSame`
|
||
6. Cleans up the temp file in tearDown
|
||
|
||
Follow all existing project conventions:
|
||
- German docblocks
|
||
- PSR-12, max line length 150
|
||
- No PHPStan suppressions
|
||
|
||
### Step 6 — Verify
|
||
|
||
Run `composer test` and confirm the new test passes. If it fails, show the diff and ask the user to correct their expected values, then update `expected.csv`.
|