From 95776a4248872e9e08f8826b5868a2f9ab77f9ec Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Sat, 28 Mar 2026 13:05:17 +0300 Subject: [PATCH] feat: add meta-edit tests, support preRun and workPath mapping - meta-edit: 3 cases (add-attribute, add-tabpart, error-no-definition) - runner: preRun steps for creating prerequisite objects before test - runner: workPath arg mapping (workDir + case field) for path-based skills Co-Authored-By: Claude Opus 4.6 (1M context) --- tests/skills/cases/meta-edit/_skill.json | 12 + .../skills/cases/meta-edit/add-attribute.json | 16 + tests/skills/cases/meta-edit/add-tabpart.json | 23 ++ .../cases/meta-edit/error-no-definition.json | 12 + .../add-attribute/Catalogs/Контрагенты.xml | 327 ++++++++++++++++++ .../Catalogs/Контрагенты/Ext/ObjectModule.bsl | 0 .../snapshots/add-attribute/Configuration.xml | 252 ++++++++++++++ .../add-attribute/Languages/Русский.xml | 16 + .../add-tabpart/Catalogs/Контрагенты.xml | 327 ++++++++++++++++++ .../Catalogs/Контрагенты/Ext/ObjectModule.bsl | 0 .../snapshots/add-tabpart/Configuration.xml | 252 ++++++++++++++ .../add-tabpart/Languages/Русский.xml | 16 + tests/skills/runner.mjs | 41 ++- 13 files changed, 1292 insertions(+), 2 deletions(-) create mode 100644 tests/skills/cases/meta-edit/_skill.json create mode 100644 tests/skills/cases/meta-edit/add-attribute.json create mode 100644 tests/skills/cases/meta-edit/add-tabpart.json create mode 100644 tests/skills/cases/meta-edit/error-no-definition.json create mode 100644 tests/skills/cases/meta-edit/snapshots/add-attribute/Catalogs/Контрагенты.xml create mode 100644 tests/skills/cases/meta-edit/snapshots/add-attribute/Catalogs/Контрагенты/Ext/ObjectModule.bsl create mode 100644 tests/skills/cases/meta-edit/snapshots/add-attribute/Configuration.xml create mode 100644 tests/skills/cases/meta-edit/snapshots/add-attribute/Languages/Русский.xml create mode 100644 tests/skills/cases/meta-edit/snapshots/add-tabpart/Catalogs/Контрагенты.xml create mode 100644 tests/skills/cases/meta-edit/snapshots/add-tabpart/Catalogs/Контрагенты/Ext/ObjectModule.bsl create mode 100644 tests/skills/cases/meta-edit/snapshots/add-tabpart/Configuration.xml create mode 100644 tests/skills/cases/meta-edit/snapshots/add-tabpart/Languages/Русский.xml diff --git a/tests/skills/cases/meta-edit/_skill.json b/tests/skills/cases/meta-edit/_skill.json new file mode 100644 index 00000000..ed51f8f7 --- /dev/null +++ b/tests/skills/cases/meta-edit/_skill.json @@ -0,0 +1,12 @@ +{ + "script": "meta-edit/scripts/meta-edit", + "setup": "empty-config", + "args": [ + { "flag": "-DefinitionFile", "from": "inputFile" }, + { "flag": "-ObjectPath", "from": "workPath", "field": "objectPath" } + ], + "snapshot": { + "root": "workDir", + "normalizeUuids": true + } +} diff --git a/tests/skills/cases/meta-edit/add-attribute.json b/tests/skills/cases/meta-edit/add-attribute.json new file mode 100644 index 00000000..fa445507 --- /dev/null +++ b/tests/skills/cases/meta-edit/add-attribute.json @@ -0,0 +1,16 @@ +{ + "name": "Добавление реквизита к справочнику", + "preRun": [ + { + "script": "meta-compile/scripts/meta-compile", + "input": { "type": "Catalog", "name": "Контрагенты" }, + "args": { "-JsonPath": "{inputFile}", "-OutputDir": "{workDir}" } + } + ], + "params": { "objectPath": "Catalogs/Контрагенты" }, + "input": { + "operations": [ + { "op": "add-attribute", "name": "ИНН", "type": "String", "length": 12 } + ] + } +} diff --git a/tests/skills/cases/meta-edit/add-tabpart.json b/tests/skills/cases/meta-edit/add-tabpart.json new file mode 100644 index 00000000..fdb5c21c --- /dev/null +++ b/tests/skills/cases/meta-edit/add-tabpart.json @@ -0,0 +1,23 @@ +{ + "name": "Добавление табличной части к справочнику", + "preRun": [ + { + "script": "meta-compile/scripts/meta-compile", + "input": { "type": "Catalog", "name": "Контрагенты" }, + "args": { "-JsonPath": "{inputFile}", "-OutputDir": "{workDir}" } + } + ], + "params": { "objectPath": "Catalogs/Контрагенты" }, + "input": { + "operations": [ + { + "op": "add-ts", + "name": "КонтактнаяИнформация", + "attributes": [ + { "name": "Тип", "type": "String", "length": 50 }, + { "name": "Значение", "type": "String", "length": 250 } + ] + } + ] + } +} diff --git a/tests/skills/cases/meta-edit/error-no-definition.json b/tests/skills/cases/meta-edit/error-no-definition.json new file mode 100644 index 00000000..6e384db9 --- /dev/null +++ b/tests/skills/cases/meta-edit/error-no-definition.json @@ -0,0 +1,12 @@ +{ + "name": "Ошибка: ни DefinitionFile ни Operation не указаны", + "preRun": [ + { + "script": "meta-compile/scripts/meta-compile", + "input": { "type": "Catalog", "name": "Тест" }, + "args": { "-JsonPath": "{inputFile}", "-OutputDir": "{workDir}" } + } + ], + "params": { "objectPath": "Catalogs/Тест" }, + "expectError": true +} diff --git a/tests/skills/cases/meta-edit/snapshots/add-attribute/Catalogs/Контрагенты.xml b/tests/skills/cases/meta-edit/snapshots/add-attribute/Catalogs/Контрагенты.xml new file mode 100644 index 00000000..cb1813d2 --- /dev/null +++ b/tests/skills/cases/meta-edit/snapshots/add-attribute/Catalogs/Контрагенты.xml @@ -0,0 +1,327 @@ + + + + + + UUID-002 + UUID-003 + + + UUID-004 + UUID-005 + + + UUID-006 + UUID-007 + + + UUID-008 + UUID-009 + + + UUID-010 + UUID-011 + + + + Контрагенты + + + ru + Контрагенты + + + + false + HierarchyFoldersAndItems + false + 2 + true + true + + ToItems + 9 + 25 + String + Variable + WholeCatalog + false + true + AsDescription + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + Auto + InDialog + true + BothWays + + Catalog.Контрагенты.StandardAttribute.Description + Catalog.Контрагенты.StandardAttribute.Code + + Begin + DontUse + Directly + + + + + + + + + + + false + + + Automatic + Use + + + + + + DontUse + Auto + DontUse + false + false + + + + diff --git a/tests/skills/cases/meta-edit/snapshots/add-attribute/Catalogs/Контрагенты/Ext/ObjectModule.bsl b/tests/skills/cases/meta-edit/snapshots/add-attribute/Catalogs/Контрагенты/Ext/ObjectModule.bsl new file mode 100644 index 00000000..e69de29b diff --git a/tests/skills/cases/meta-edit/snapshots/add-attribute/Configuration.xml b/tests/skills/cases/meta-edit/snapshots/add-attribute/Configuration.xml new file mode 100644 index 00000000..c9614252 --- /dev/null +++ b/tests/skills/cases/meta-edit/snapshots/add-attribute/Configuration.xml @@ -0,0 +1,252 @@ + + + + + + UUID-002 + UUID-003 + + + UUID-004 + UUID-005 + + + UUID-006 + UUID-007 + + + UUID-008 + UUID-009 + + + UUID-010 + UUID-011 + + + UUID-012 + UUID-013 + + + UUID-014 + UUID-015 + + + + TestConfig + + + ru + TestConfig + + + + + Version8_3_24 + ManagedApplication + + PlatformApplication + + Russian + + + + + false + false + false + + + + + + + + + + + + + + + + + + + + + + Biometrics + true + + + Location + false + + + BackgroundLocation + false + + + BluetoothPrinters + false + + + WiFiPrinters + false + + + Contacts + false + + + Calendars + false + + + PushNotifications + false + + + LocalNotifications + false + + + InAppPurchases + false + + + PersonalComputerFileExchange + false + + + Ads + false + + + NumberDialing + false + + + CallProcessing + false + + + CallLog + false + + + AutoSendSMS + false + + + ReceiveSMS + false + + + SMSLog + false + + + Camera + false + + + Microphone + false + + + MusicLibrary + false + + + PictureAndVideoLibraries + false + + + AudioPlaybackAndVibration + false + + + BackgroundAudioPlaybackAndVibration + false + + + InstallPackages + false + + + OSBackup + true + + + ApplicationUsageStatistics + false + + + BarcodeScanning + false + + + BackgroundAudioRecording + false + + + AllFilesAccess + false + + + Videoconferences + false + + + NFC + false + + + DocumentScanning + false + + + SpeechToText + false + + + Geofences + false + + + IncomingShareRequests + false + + + AllIncomingShareRequestsTypesProcessing + false + + + + + + Normal + + + Language.Русский + + + + + + Managed + NotAutoFree + DontUse + DontUse + Taxi + DontUse + Version8_3_24 + + + + Русский + Контрагенты + + + \ No newline at end of file diff --git a/tests/skills/cases/meta-edit/snapshots/add-attribute/Languages/Русский.xml b/tests/skills/cases/meta-edit/snapshots/add-attribute/Languages/Русский.xml new file mode 100644 index 00000000..37c60d78 --- /dev/null +++ b/tests/skills/cases/meta-edit/snapshots/add-attribute/Languages/Русский.xml @@ -0,0 +1,16 @@ + + + + + Русский + + + ru + Русский + + + + ru + + + \ No newline at end of file diff --git a/tests/skills/cases/meta-edit/snapshots/add-tabpart/Catalogs/Контрагенты.xml b/tests/skills/cases/meta-edit/snapshots/add-tabpart/Catalogs/Контрагенты.xml new file mode 100644 index 00000000..cb1813d2 --- /dev/null +++ b/tests/skills/cases/meta-edit/snapshots/add-tabpart/Catalogs/Контрагенты.xml @@ -0,0 +1,327 @@ + + + + + + UUID-002 + UUID-003 + + + UUID-004 + UUID-005 + + + UUID-006 + UUID-007 + + + UUID-008 + UUID-009 + + + UUID-010 + UUID-011 + + + + Контрагенты + + + ru + Контрагенты + + + + false + HierarchyFoldersAndItems + false + 2 + true + true + + ToItems + 9 + 25 + String + Variable + WholeCatalog + false + true + AsDescription + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + Auto + InDialog + true + BothWays + + Catalog.Контрагенты.StandardAttribute.Description + Catalog.Контрагенты.StandardAttribute.Code + + Begin + DontUse + Directly + + + + + + + + + + + false + + + Automatic + Use + + + + + + DontUse + Auto + DontUse + false + false + + + + diff --git a/tests/skills/cases/meta-edit/snapshots/add-tabpart/Catalogs/Контрагенты/Ext/ObjectModule.bsl b/tests/skills/cases/meta-edit/snapshots/add-tabpart/Catalogs/Контрагенты/Ext/ObjectModule.bsl new file mode 100644 index 00000000..e69de29b diff --git a/tests/skills/cases/meta-edit/snapshots/add-tabpart/Configuration.xml b/tests/skills/cases/meta-edit/snapshots/add-tabpart/Configuration.xml new file mode 100644 index 00000000..c9614252 --- /dev/null +++ b/tests/skills/cases/meta-edit/snapshots/add-tabpart/Configuration.xml @@ -0,0 +1,252 @@ + + + + + + UUID-002 + UUID-003 + + + UUID-004 + UUID-005 + + + UUID-006 + UUID-007 + + + UUID-008 + UUID-009 + + + UUID-010 + UUID-011 + + + UUID-012 + UUID-013 + + + UUID-014 + UUID-015 + + + + TestConfig + + + ru + TestConfig + + + + + Version8_3_24 + ManagedApplication + + PlatformApplication + + Russian + + + + + false + false + false + + + + + + + + + + + + + + + + + + + + + + Biometrics + true + + + Location + false + + + BackgroundLocation + false + + + BluetoothPrinters + false + + + WiFiPrinters + false + + + Contacts + false + + + Calendars + false + + + PushNotifications + false + + + LocalNotifications + false + + + InAppPurchases + false + + + PersonalComputerFileExchange + false + + + Ads + false + + + NumberDialing + false + + + CallProcessing + false + + + CallLog + false + + + AutoSendSMS + false + + + ReceiveSMS + false + + + SMSLog + false + + + Camera + false + + + Microphone + false + + + MusicLibrary + false + + + PictureAndVideoLibraries + false + + + AudioPlaybackAndVibration + false + + + BackgroundAudioPlaybackAndVibration + false + + + InstallPackages + false + + + OSBackup + true + + + ApplicationUsageStatistics + false + + + BarcodeScanning + false + + + BackgroundAudioRecording + false + + + AllFilesAccess + false + + + Videoconferences + false + + + NFC + false + + + DocumentScanning + false + + + SpeechToText + false + + + Geofences + false + + + IncomingShareRequests + false + + + AllIncomingShareRequestsTypesProcessing + false + + + + + + Normal + + + Language.Русский + + + + + + Managed + NotAutoFree + DontUse + DontUse + Taxi + DontUse + Version8_3_24 + + + + Русский + Контрагенты + + + \ No newline at end of file diff --git a/tests/skills/cases/meta-edit/snapshots/add-tabpart/Languages/Русский.xml b/tests/skills/cases/meta-edit/snapshots/add-tabpart/Languages/Русский.xml new file mode 100644 index 00000000..37c60d78 --- /dev/null +++ b/tests/skills/cases/meta-edit/snapshots/add-tabpart/Languages/Русский.xml @@ -0,0 +1,16 @@ + + + + + Русский + + + ru + Русский + + + + ru + + + \ No newline at end of file diff --git a/tests/skills/runner.mjs b/tests/skills/runner.mjs index e4225e51..4c9ce787 100644 --- a/tests/skills/runner.mjs +++ b/tests/skills/runner.mjs @@ -175,6 +175,12 @@ function buildArgs(skillConfig, caseData, workDir, inputFilePath, runtime) { case 'outputPath': args.push(join(workDir, caseData.outputPath || '')); break; + case 'workPath': + // workDir + value from case.params or case (specified in mapping.field) + const wpField = mapping.field || 'objectPath'; + const wpVal = caseData.params?.[wpField] ?? caseData[wpField] ?? ''; + args.push(join(workDir, wpVal)); + break; case 'switch': // flag already pushed, no value needed — remove the flag and re-push conditionally args.pop(); // remove flag, will re-add if switch is active @@ -327,13 +333,44 @@ function runCase(testCase, opts) { const fixturePath = ensureSetup(setupName, opts.runtime); workDir = createWorkspace(fixturePath); - // 2. Write input JSON if needed + // 2. Pre-run steps (setup prerequisites like creating objects) + if (caseData.preRun) { + for (const step of caseData.preRun) { + const preScript = resolveScript(step.script, opts.runtime); + const preArgs = []; + for (const [flag, value] of Object.entries(step.args || {})) { + preArgs.push(flag); + const resolved = String(value) + .replace('{workDir}', workDir) + .replace('{inputFile}', ''); + preArgs.push(resolved); + } + // Write step input to temp file if needed + let preInputFile = null; + if (step.input) { + preInputFile = join(workDir, '__pre_input.json'); + writeFileSync(preInputFile, JSON.stringify(step.input, null, 2), 'utf8'); + // Replace {inputFile} references in args + for (let i = 0; i < preArgs.length; i++) { + if (preArgs[i] === '') preArgs[i] = preInputFile; + } + } + try { + execSkillRaw(opts.runtime, preScript, preArgs); + } catch (e) { + throw new Error(`preRun step "${step.script}" failed: ${e.stderr || e.message}`); + } + if (preInputFile && existsSync(preInputFile)) rmSync(preInputFile); + } + } + + // 3. Write input JSON if needed if (caseData.input !== undefined) { inputFile = join(workDir, '__input.json'); writeFileSync(inputFile, JSON.stringify(caseData.input, null, 2), 'utf8'); } - // 3. Build CLI args and execute + // 4. Build CLI args and execute const { scriptPath, args } = buildArgs(skillConfig, caseData, workDir, inputFile, opts.runtime); let stdout = '', stderr = '', exitCode = 0;