diff --git a/tests/skills/cases/form-info/rich-form.json b/tests/skills/cases/form-info/rich-form.json index 19ded97f..9b9a1d62 100644 --- a/tests/skills/cases/form-info/rich-form.json +++ b/tests/skills/cases/form-info/rich-form.json @@ -27,7 +27,7 @@ { "button": "Выполнить", "command": "Выполнить" } ], "attributes": [ - { "name": "Объект", "type": "ExternalDataProcessorObject.Инфо", "main": true }, + { "name": "Объект", "type": "DataProcessorObject.Инфо", "main": true }, { "name": "Организация", "type": "string" }, { "name": "Период", "type": "date" }, { "name": "Данные", "type": "ValueTable", "columns": [ diff --git a/tests/skills/cases/form-info/simple-form.json b/tests/skills/cases/form-info/simple-form.json index c6453a67..d96b5f02 100644 --- a/tests/skills/cases/form-info/simple-form.json +++ b/tests/skills/cases/form-info/simple-form.json @@ -14,7 +14,7 @@ "script": "form-compile/scripts/form-compile", "input": { "title": "Простая форма", - "attributes": [{ "name": "Объект", "type": "ExternalDataProcessorObject.Простая", "main": true }] + "attributes": [{ "name": "Объект", "type": "DataProcessorObject.Простая", "main": true }] }, "args": { "-JsonPath": "{inputFile}", "-OutputPath": "{workDir}/DataProcessors/Простая/Forms/Форма/Ext/Form.xml" } } diff --git a/tests/skills/cases/form-info/snapshots/rich-form/DataProcessors/Инфо/Forms/Форма/Ext/Form.xml b/tests/skills/cases/form-info/snapshots/rich-form/DataProcessors/Инфо/Forms/Форма/Ext/Form.xml index a251ef8b..0a2325a8 100644 --- a/tests/skills/cases/form-info/snapshots/rich-form/DataProcessors/Инфо/Forms/Форма/Ext/Form.xml +++ b/tests/skills/cases/form-info/snapshots/rich-form/DataProcessors/Инфо/Forms/Форма/Ext/Form.xml @@ -64,7 +64,7 @@ - cfg:ExternalDataProcessorObject.Инфо + cfg:DataProcessorObject.Инфо true diff --git a/tests/skills/cases/form-info/snapshots/simple-form/DataProcessors/Простая/Forms/Форма/Ext/Form.xml b/tests/skills/cases/form-info/snapshots/simple-form/DataProcessors/Простая/Forms/Форма/Ext/Form.xml index fa1c497d..d154416a 100644 --- a/tests/skills/cases/form-info/snapshots/simple-form/DataProcessors/Простая/Forms/Форма/Ext/Form.xml +++ b/tests/skills/cases/form-info/snapshots/simple-form/DataProcessors/Простая/Forms/Форма/Ext/Form.xml @@ -10,7 +10,7 @@ - cfg:ExternalDataProcessorObject.Простая + cfg:DataProcessorObject.Простая true diff --git a/tests/skills/verify-snapshots.mjs b/tests/skills/verify-snapshots.mjs index faf58ba6..89b420a7 100644 --- a/tests/skills/verify-snapshots.mjs +++ b/tests/skills/verify-snapshots.mjs @@ -406,10 +406,10 @@ async function verifyCase(skillName, caseName, skillConfig, caseData, opts) { let configDir = (setupType === 'empty-config' || isCfInit) ? workDir : null; try { - // ── Step 0: Case-level fixture copy (runner.mjs compatibility) ── - // A case may declare `"setup": "fixture:"` pointing to - // tests/skills/cases//fixtures/ — copy its contents into workDir - // so the skill script finds them at the expected relative path. + // ── Step 0: Case-level fixture/external setup (runner.mjs compatibility) ── + // A case may declare: + // "setup": "fixture:" — copy tests/skills/cases//fixtures/ + // "setup": "external:" — copy contents of an external dump (e.g. ERP/БП) if (typeof caseData.setup === 'string' && caseData.setup.startsWith('fixture:')) { const fixtureName = caseData.setup.slice('fixture:'.length); const fixturePath = join(CASES, skillName, 'fixtures', fixtureName); @@ -419,11 +419,23 @@ async function verifyCase(skillName, caseName, skillConfig, caseData, opts) { } cpSync(fixturePath, workDir, { recursive: true }); log(`fixture: ${fixtureName}`, true); + } else if (typeof caseData.setup === 'string' && caseData.setup.startsWith('external:')) { + const extPath = resolve(REPO_ROOT, caseData.setup.slice('external:'.length)); + if (!existsSync(extPath)) { + result.errors.push(`External setup path not found: ${extPath}`); + return result; + } + cpSync(extPath, workDir, { recursive: true }); + log(`external: ${extPath}`, true); + configDir = workDir; } // ── Step 1: Setup (cf-init for empty-config, nothing for 'none') ── + // Skip cf-init if external/fixture setup already provided a complete config + const caseProvidedConfig = typeof caseData.setup === 'string' && + (caseData.setup.startsWith('external:') || caseData.setup.startsWith('fixture:')); // Skip setup for cf-init skill — the test itself creates the config - if (configDir && setupType === 'empty-config' && !CONFIG_INIT_SKILLS.has(skillName)) { + if (configDir && setupType === 'empty-config' && !CONFIG_INIT_SKILLS.has(skillName) && !caseProvidedConfig) { try { execSkill(opts.runtime, 'cf-init/scripts/cf-init', ['-Name', 'VerifyTest', '-OutputDir', workDir]); log('cf-init', true); @@ -834,7 +846,8 @@ async function verifyCase(skillName, caseName, skillConfig, caseData, opts) { } // ── Step 6: Auto-detect and register objects in ChildObjects ── - const allObjects = scanConfigObjects(configDir); + // Skip when config came from external/fixture setup — it's already complete. + const allObjects = caseProvidedConfig ? [] : scanConfigObjects(configDir); const cfEditOps = []; for (const obj of allObjects) { const prefix = TYPE_TO_PREFIX[obj.type]; @@ -855,6 +868,16 @@ async function verifyCase(skillName, caseName, skillConfig, caseData, opts) { } // ── Step 7: Platform load ── + // Skip platform load for external dumps (e.g. real ERP/БП configs): + // they're huge, version-sensitive, and the point of these test cases is + // to exercise the skill script against real-world XML, not to validate + // that an entire vendor config loads into a fresh DB. + if (caseProvidedConfig && caseData.setup.startsWith('external:')) { + result.passed = true; + log('platform-load', true, 'skipped (external setup)'); + return result; + } + const dbDir = join(workDir, 'testdb'); try {