4.3 KiB
| description | argument-hint | agent |
|---|---|---|
| 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. | config file path (e.g. config/config-ubs-account.json) | 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
regexand 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(): arraythat auto-discoverstests/fixtures/*/directories, maps each to['configName' => ..., 'fixtureDir' => ...] - Have a
@dataProvider fixtureProvidertest methodtestConfigProducesExpectedOutput(string $configName, string $fixtureDir)that:- Resolves
config/<configName>.json - Instantiates
ConfigurationLoaderwith that path - Instantiates
TransformerEnginewith the loader - Calls
transform()with$fixtureDir/input.csvinto a temp file - Reads the temp file and
$fixtureDir/expected.csvand asserts they are identical line-by-line withassertSame - Cleans up the temp file in tearDown
- Resolves
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.