diff --git a/tests/skills/README.md b/tests/skills/README.md index 18738abd..cf5f7be4 100644 --- a/tests/skills/README.md +++ b/tests/skills/README.md @@ -227,10 +227,45 @@ ibcmd-проход автоматически `○ skipped`, если рядом | `setup` | нет | Переопределение setup из `_skill.json` | | `outputPath` | нет | Относительный путь для навыков с `-OutputPath` | | `args_extra` | нет | Массив дополнительных CLI-аргументов | -| `preRun` | нет | Массив шагов подготовки (создание объектов и т.п.) | -| `expect` | нет | Дополнительные проверки: `files`, `stdoutContains` (строка/массив), `stdoutNotContains` (строка/массив) | +| `preRun` | нет | Массив шагов подготовки (см. ниже) | +| `expect` | нет | Дополнительные проверки (см. ниже) | | `expectError` | нет | `true` или строка — ожидается ошибка | | `noSnapshot` | нет | Непустая строка с причиной — кейс объявляет, что эталон не нужен (см. «Эталоны») | +| `idempotent` | нет | `true` — повторный прогон с теми же аргументами должен дать байт-в-байт тот же `workDir` | +| `runtimeOnly` | нет | `"powershell"` / `"python"` — кейс имеет смысл только на одном порте, на другом `○ skipped` | +| `skipValidation` | нет | `true` — не запускать `postValidate` из `_skill.json` (только при `--with-validation`) | + +### Ключи `expect` + +| Ключ | Описание | +|---|---| +| `files` | Массив путей относительно `workDir` — каждый должен существовать после прогона | +| `stdoutContains` | Строка или массив строк — все должны присутствовать в stdout | +| `stdoutNotContains` | Строка или массив строк — ни одной не должно быть в stdout | +| `preserves` | Объект (или массив объектов) — байтовые свойства файла, которые навык обязан сохранить | + +`preserves` проверяет то, что снэпшот-сравнение нормализует и потому увидеть не может: + +| Ключ | Описание | +|---|---| +| `file` | Путь к файлу относительно `workDir` (обязателен) | +| `bom` | `true`/`false` — наличие UTF-8 BOM | +| `eol` | `"crlf"` / `"lf"` | +| `encoding` | Ожидаемое значение в XML-декларации, напр. `"UTF-8"` | +| `finalNewline` | `true`/`false` — перевод строки в конце файла | +| `noCR13` | `true` — в выходе не должно быть литерала ` ` | + +`preserves` и эталон **дополняют** друг друга: первый следит за байтовым стилем файла, второй — за +структурой содержимого. Наличие одного не отменяет необходимости другого. + +### Шаги `preRun` + +Массив шагов, выполняемых до запуска проверяемого навыка: + +| Форма шага | Описание | +|---|---| +| `{ "script": "<навык>/scripts/<файл>", "input": {...}, "args": { "-Flag": "{inputFile}" } }` | Прогон другого навыка для подготовки фикстуры. Плейсхолдеры: `{inputFile}`, `{workDir}` | +| `{ "writeFile": { "path": "<путь>", "content": "<строка или объект>" } }` | Записать произвольный файл в `workDir` (объект сериализуется в JSON) | ## Эталоны (snapshots)