diff --git a/tests/skills/README.md b/tests/skills/README.md index 5ee885c3..5dfc358b 100644 --- a/tests/skills/README.md +++ b/tests/skills/README.md @@ -52,7 +52,7 @@ Exit code: 0 = все прошли, 1 = есть падения. | Поле | Описание | |---|---| | `script` | Путь от `.claude/skills/`, без расширения. Раннер добавит `.ps1` (по умолчанию) или `.py` | -| `setup` | Фикстура: `"empty-config"`, `"base-config"`, `"none"`, `"fixture:"` | +| `setup` | Фикстура: `"empty-config"`, `"base-config"`, `"none"`, `"fixture:"` (из `fixtures/` папки навыка) | | `args` | Маппинг параметров навыка (см. ниже) | | `snapshot` | Настройки сравнения: `root` (`"workDir"` или `"outputPath"`) и `normalizeUuids` | @@ -184,13 +184,12 @@ tests/skills/ runner.mjs # тест-раннер README.md # этот файл .cache/ # кэш фикстур (в .gitignore) - fixtures/ # broken-фикстуры для тестов валидаторов - broken/ - <имя>/ # сломанный XML для негативных тестов validate-навыков cases/ <навык>/ _skill.json # конфиг навыка <кейс>.json # тестовый случай snapshots/ <кейс>/ # эталон + fixtures/ # broken-фикстуры (для validate-навыков) + <имя>/ # сломанный XML, ссылка: "setup": "fixture:<имя>" ``` diff --git a/tests/skills/cases/meta-validate/error-bad-root.json b/tests/skills/cases/meta-validate/error-bad-root.json index dd0c797f..e98ea4d3 100644 --- a/tests/skills/cases/meta-validate/error-bad-root.json +++ b/tests/skills/cases/meta-validate/error-bad-root.json @@ -1,6 +1,6 @@ { "name": "Валидатор находит ошибку: неверный корневой элемент", - "setup": "fixture:broken/catalog-bad-root", + "setup": "fixture:catalog-bad-root", "params": { "objectPath": "Catalogs/Bad.xml" }, "expectError": true } diff --git a/tests/skills/fixtures/broken/catalog-bad-root/Catalogs/Bad.xml b/tests/skills/cases/meta-validate/fixtures/catalog-bad-root/Catalogs/Bad.xml similarity index 100% rename from tests/skills/fixtures/broken/catalog-bad-root/Catalogs/Bad.xml rename to tests/skills/cases/meta-validate/fixtures/catalog-bad-root/Catalogs/Bad.xml diff --git a/tests/skills/runner.mjs b/tests/skills/runner.mjs index 03621ff6..b5a5bde4 100644 --- a/tests/skills/runner.mjs +++ b/tests/skills/runner.mjs @@ -15,7 +15,6 @@ const REPO_ROOT = resolve(ROOT, '../..'); const SKILLS = resolve(REPO_ROOT, '.claude/skills'); const CASES = resolve(ROOT, 'cases'); const CACHE = resolve(ROOT, '.cache'); -const FIXTURES = resolve(ROOT, 'fixtures'); // ─── CLI args ─────────────────────────────────────────────────────────────── @@ -80,11 +79,12 @@ function discoverCases(filter) { // ─── Setup / Fixtures ─────────────────────────────────────────────────────── -function ensureSetup(setupName, runtime) { +function ensureSetup(setupName, runtime, skillCasesDir) { if (setupName === 'none' || !setupName) return null; if (setupName.startsWith('fixture:')) { - const fixturePath = join(FIXTURES, setupName.slice('fixture:'.length)); + // Resolve relative to skill's cases directory (e.g. cases/meta-validate/fixtures/...) + const fixturePath = join(skillCasesDir, 'fixtures', setupName.slice('fixture:'.length)); if (!existsSync(fixturePath)) throw new Error(`Fixture not found: ${fixturePath}`); return fixturePath; } @@ -331,7 +331,8 @@ function runCase(testCase, opts) { try { // 1. Setup workspace - const fixturePath = ensureSetup(setupName, opts.runtime); + const skillCasesDir = join(CASES, testCase.skillDir); + const fixturePath = ensureSetup(setupName, opts.runtime, skillCasesDir); workDir = createWorkspace(fixturePath); // 2. Pre-run steps (setup prerequisites like creating objects)