From a828f1847f54a7146061f30429312a9c331e8d5d Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Fri, 1 May 2026 14:27:38 +0300 Subject: [PATCH] =?UTF-8?q?feat(web-test):=20=D0=BE=D0=B1=D1=80=D0=B0?= =?UTF-8?q?=D0=B1=D0=BE=D1=82=D0=BA=D0=B0=20=D0=A2=D0=B5=D1=81=D1=82=D0=BE?= =?UTF-8?q?=D0=B2=D1=8B=D0=B5=D0=9E=D1=88=D0=B8=D0=B1=D0=BA=D0=B8=20+=20bs?= =?UTF-8?q?l-=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D0=B8=20(M1=20Step=203)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Покрытие matrix #6 — errors balloon/messages/modal (10-validation, fetchErrorStack Path 2): - ОбщиеФункции.ПоказатьСообщение() → Сообщить("Тестовое сообщение") - ОбщиеФункции.ВызватьТестовоеИсключение() → ВызватьИсключение - DataProcessor.ТестовыеОшибки + ФормаОбработки с двумя кнопками, каждая делает клиент→сервер вызов соответствующей процедуры - Регистрация в Configuration + Subsystem.Администрирование Runner расширен step-типом writeFile — записывает произвольный текст (обычно Module.bsl) в workDir. Нет навыка для модификации bsl-кода модулей, и плодить отдельный навык под одну задачу избыточно. Платформенная верификация: 36 шагов, 21.2s. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../integration/build-webtest-config.test.mjs | 76 +++++++++++++++++++ tests/skills/runner.mjs | 16 ++++ 2 files changed, 92 insertions(+) diff --git a/tests/skills/integration/build-webtest-config.test.mjs b/tests/skills/integration/build-webtest-config.test.mjs index cbab3962..e15f490c 100644 --- a/tests/skills/integration/build-webtest-config.test.mjs +++ b/tests/skills/integration/build-webtest-config.test.mjs @@ -153,6 +153,29 @@ export const steps = [ args: { '-JsonPath': '{inputFile}', '-OutputDir': '{workDir}' }, validate: { script: 'meta-validate/scripts/meta-validate', flag: '-ObjectPath', path: 'CommonModules/ОбщиеФункции' }, }, + { + name: 'writeFile: ОбщиеФункции Module.bsl', + writeFile: 'CommonModules/ОбщиеФункции/Ext/Module.bsl', + content: `Процедура ПоказатьСообщение() Экспорт +\tСообщить("Тестовое сообщение"); +КонецПроцедуры + +Процедура ВызватьТестовоеИсключение() Экспорт +\tВызватьИсключение "Тестовое исключение"; +КонецПроцедуры +`, + }, + + // Обработка ТестовыеОшибки — для тестов errors balloon/messages/modal (10-validation) + { + name: 'meta-compile: Обработка ТестовыеОшибки', + script: 'meta-compile/scripts/meta-compile', + input: { + type: 'DataProcessor', name: 'ТестовыеОшибки', + }, + args: { '-JsonPath': '{inputFile}', '-OutputDir': '{workDir}' }, + validate: { script: 'meta-validate/scripts/meta-validate', flag: '-ObjectPath', path: 'DataProcessors/ТестовыеОшибки' }, + }, // Отчёт ОстаткиТоваров { @@ -348,6 +371,57 @@ export const steps = [ validate: { script: 'form-validate/scripts/form-validate', flag: '-FormPath', path: 'Documents/ПриходнаяНакладная/Forms/ФормаСписка/Ext/Form.xml' }, }, + // Форма обработки ТестовыеОшибки — кнопки вызова процедур ОбщиеФункции + { + name: 'form-add: Форма обработки ТестовыеОшибки', + script: 'form-add/scripts/form-add', + args: { '-ObjectPath': '{workDir}/DataProcessors/ТестовыеОшибки.xml', '-FormName': 'ФормаОбработки' }, + }, + { + name: 'form-compile: Форма обработки ТестовыеОшибки', + script: 'form-compile/scripts/form-compile', + input: { + title: 'Тестовые ошибки', + attributes: [ + { name: 'Объект', type: 'DataProcessorObject.ТестовыеОшибки', main: true }, + ], + elements: [ + { button: 'ПоказатьСообщение', command: 'ПоказатьСообщение', title: 'Показать сообщение' }, + { button: 'ВызватьИсключение', command: 'ВызватьИсключениеКоманда', title: 'Вызвать исключение' }, + ], + commands: [ + { name: 'ПоказатьСообщение', action: 'ПоказатьСообщение' }, + { name: 'ВызватьИсключениеКоманда', action: 'ВызватьИсключениеКоманда' }, + ], + }, + args: { '-JsonPath': '{inputFile}', '-OutputPath': '{workDir}/DataProcessors/ТестовыеОшибки/Forms/ФормаОбработки/Ext/Form.xml' }, + validate: { script: 'form-validate/scripts/form-validate', flag: '-FormPath', path: 'DataProcessors/ТестовыеОшибки/Forms/ФормаОбработки/Ext/Form.xml' }, + }, + { + name: 'writeFile: ТестовыеОшибки form Module.bsl', + writeFile: 'DataProcessors/ТестовыеОшибки/Forms/ФормаОбработки/Ext/Form/Module.bsl', + content: `&НаКлиенте +Процедура ПоказатьСообщение(Команда) +\tПоказатьСообщениеНаСервере(); +КонецПроцедуры + +&НаСервере +Процедура ПоказатьСообщениеНаСервере() +\tОбщиеФункции.ПоказатьСообщение(); +КонецПроцедуры + +&НаКлиенте +Процедура ВызватьИсключениеКоманда(Команда) +\tВызватьИсключениеНаСервере(); +КонецПроцедуры + +&НаСервере +Процедура ВызватьИсключениеНаСервере() +\tОбщиеФункции.ВызватьТестовоеИсключение(); +КонецПроцедуры +`, + }, + // ── 4. DCS for report ── { name: 'skd-compile: Схема отчёта ОстаткиТоваров', @@ -397,6 +471,7 @@ export const steps = [ content: [ 'InformationRegister.КурсыВалют', 'Constant.ОсновнаяВалюта', + 'DataProcessor.ТестовыеОшибки', ], }, args: { '-DefinitionFile': '{inputFile}', '-OutputDir': '{workDir}' }, @@ -434,6 +509,7 @@ export const steps = [ { operation: 'add-childObject', value: 'InformationRegister.КурсыВалют' }, { operation: 'add-childObject', value: 'Constant.ОсновнаяВалюта' }, { operation: 'add-childObject', value: 'CommonModule.ОбщиеФункции' }, + { operation: 'add-childObject', value: 'DataProcessor.ТестовыеОшибки' }, { operation: 'add-childObject', value: 'Report.ОстаткиТоваров' }, { operation: 'add-childObject', value: 'Subsystem.Склад' }, { operation: 'add-childObject', value: 'Subsystem.Администрирование' }, diff --git a/tests/skills/runner.mjs b/tests/skills/runner.mjs index f1728b5a..a2e35624 100644 --- a/tests/skills/runner.mjs +++ b/tests/skills/runner.mjs @@ -929,6 +929,22 @@ async function runIntegrationTest(test, opts) { const step = test.steps[i]; const stepT0 = performance.now(); + // writeFile step: записать содержимое (обычно .bsl модуля) в workDir + if (step.writeFile) { + try { + const target = replacePlaceholders(step.writeFile); + const abs = target.includes(':') || target.startsWith('/') ? target : join(workDir, target); + mkdirSync(dirname(abs), { recursive: true }); + writeFileSync(abs, step.content ?? '', 'utf8'); + const stepElapsed = ((performance.now() - stepT0) / 1000).toFixed(1); + stepResults.push({ name: step.name, passed: true, elapsed: `${stepElapsed}s` }); + } catch (e) { + stepResults.push({ name: step.name, passed: false, error: `writeFile failed: ${e.message}` }); + break; + } + continue; + } + // Write input if provided let inputFile = null; if (step.input) {