feat(skill-tests): platform integration tests via .v8-project.json

Runner reads v8path from .v8-project.json, skips platform tests if
1cv8.exe unavailable. Placeholders: {v8path}, {v8exe}, {dbPath}, etc.

- platform-config: cf-init → meta-compile → db-create → load → update
- platform-epf: epf-init → epf-build → db-create → epf-dump (roundtrip)
- platform-cfe: config + extension → db-create → load both → update both

All 6 integration tests green (3 file-only + 3 platform).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-03-29 17:59:44 +03:00
parent be1bbb2d26
commit 29a5cbae4c
4 changed files with 270 additions and 8 deletions
@@ -0,0 +1,93 @@
// platform-cfe.test.mjs — Integration test: load CFE extension into 1C platform
// Requires: 1C platform (1cv8.exe) via .v8-project.json
// Steps: build config → build extension → db-create → load config → load extension → update
export const name = 'Загрузка расширения в базу с конфигурацией';
export const setup = 'none';
export const requiresPlatform = true;
export const steps = [
// ── 1. Build minimal base config ──
{
name: 'cf-init: базовая конфигурация',
script: 'cf-init/scripts/cf-init',
args: { '-Name': 'БазаДляРасширения', '-OutputDir': '{workDir}/config' },
},
{
name: 'meta-compile: Справочник Контрагенты',
script: 'meta-compile/scripts/meta-compile',
input: { type: 'Catalog', name: 'Контрагенты', codeLength: 9, descriptionLength: 100 },
args: { '-JsonPath': '{inputFile}', '-OutputDir': '{workDir}/config' },
},
{
name: 'cf-edit: регистрация + совместимость интерфейса',
script: 'cf-edit/scripts/cf-edit',
input: [
{ operation: 'add-childObject', value: 'Catalog.Контрагенты' },
{ operation: 'modify-property', value: 'InterfaceCompatibilityMode=TaxiEnableVersion8_2' },
],
args: { '-ConfigPath': '{workDir}/config', '-DefinitionFile': '{inputFile}' },
},
// ── 2. Build extension (borrow without forms) ──
{
name: 'cfe-init: расширение',
script: 'cfe-init/scripts/cfe-init',
args: {
'-Name': 'ТестРасширение',
'-OutputDir': '{workDir}/ext',
'-ConfigPath': '{workDir}/config',
},
},
{
name: 'cfe-borrow: заимствование Catalog.Контрагенты',
script: 'cfe-borrow/scripts/cfe-borrow',
args: {
'-ExtensionPath': '{workDir}/ext',
'-ConfigPath': '{workDir}/config',
'-Object': 'Catalog.Контрагенты',
},
},
// ── 3. Create DB, load config ──
{
name: 'db-create: создание ИБ',
script: 'db-create/scripts/db-create',
args: { '-V8Path': '{v8path}', '-InfoBasePath': '{workDir}/testdb' },
},
{
name: 'db-load-xml: загрузка конфигурации',
script: 'db-load-xml/scripts/db-load-xml',
args: {
'-V8Path': '{v8path}',
'-InfoBasePath': '{workDir}/testdb',
'-ConfigDir': '{workDir}/config',
},
},
{
name: 'db-update: обновление БД (конфигурация)',
script: 'db-update/scripts/db-update',
args: { '-V8Path': '{v8path}', '-InfoBasePath': '{workDir}/testdb' },
},
// ── 4. Load extension ──
{
name: 'db-load-xml: загрузка расширения',
script: 'db-load-xml/scripts/db-load-xml',
args: {
'-V8Path': '{v8path}',
'-InfoBasePath': '{workDir}/testdb',
'-ConfigDir': '{workDir}/ext',
'-Extension': 'ТестРасширение',
},
},
{
name: 'db-update: обновление БД (расширение)',
script: 'db-update/scripts/db-update',
args: {
'-V8Path': '{v8path}',
'-InfoBasePath': '{workDir}/testdb',
'-Extension': 'ТестРасширение',
},
},
];
@@ -0,0 +1,74 @@
// platform-config.test.mjs — Integration test: load config into 1C platform
// Requires: 1C platform (1cv8.exe) via .v8-project.json
// Steps: cf-init → meta-compile (objects without forms) → cf-edit → db-create → db-load-xml → db-update
export const name = 'Загрузка конфигурации в платформу 1С';
export const setup = 'none';
export const requiresPlatform = true;
export const steps = [
// ── 1. Build minimal config (no forms — avoids ExtendedPresentation issue) ──
{
name: 'cf-init: пустая конфигурация',
script: 'cf-init/scripts/cf-init',
args: { '-Name': 'ПлатформенныйТест', '-OutputDir': '{workDir}/config' },
},
{
name: 'meta-compile: Справочник',
script: 'meta-compile/scripts/meta-compile',
input: { type: 'Catalog', name: 'Товары', codeLength: 9, descriptionLength: 100 },
args: { '-JsonPath': '{inputFile}', '-OutputDir': '{workDir}/config' },
},
{
name: 'meta-compile: Документ',
script: 'meta-compile/scripts/meta-compile',
input: {
type: 'Document', name: 'Приход',
attributes: [{ name: 'Склад', type: 'String', length: 50 }],
},
args: { '-JsonPath': '{inputFile}', '-OutputDir': '{workDir}/config' },
},
{
name: 'meta-compile: Перечисление',
script: 'meta-compile/scripts/meta-compile',
input: { type: 'Enum', name: 'Статусы', values: ['Новый', 'Выполнен'] },
args: { '-JsonPath': '{inputFile}', '-OutputDir': '{workDir}/config' },
},
{
name: 'cf-edit: регистрация объектов',
script: 'cf-edit/scripts/cf-edit',
input: [
{ operation: 'add-childObject', value: 'Catalog.Товары' },
{ operation: 'add-childObject', value: 'Document.Приход' },
{ operation: 'add-childObject', value: 'Enum.Статусы' },
],
args: { '-ConfigPath': '{workDir}/config', '-DefinitionFile': '{inputFile}' },
},
// ── 2. Create DB and load ──
{
name: 'db-create: создание файловой ИБ',
script: 'db-create/scripts/db-create',
args: {
'-V8Path': '{v8path}',
'-InfoBasePath': '{workDir}/testdb',
},
},
{
name: 'db-load-xml: загрузка конфигурации',
script: 'db-load-xml/scripts/db-load-xml',
args: {
'-V8Path': '{v8path}',
'-InfoBasePath': '{workDir}/testdb',
'-ConfigDir': '{workDir}/config',
},
},
{
name: 'db-update: обновление БД',
script: 'db-update/scripts/db-update',
args: {
'-V8Path': '{v8path}',
'-InfoBasePath': '{workDir}/testdb',
},
},
];
@@ -0,0 +1,46 @@
// platform-epf.test.mjs — Integration test: EPF build/dump roundtrip
// Requires: 1C platform (1cv8.exe) via .v8-project.json
// Steps: epf-init (no forms) → epf-build → epf-dump
export const name = 'Сборка и разборка внешней обработки (roundtrip)';
export const setup = 'none';
export const requiresPlatform = true;
export const steps = [
// ── 1. Create EPF without forms (avoids ExtendedPresentation issue) ──
{
name: 'epf-init: пустая обработка',
script: 'epf-init/scripts/init',
args: { '-Name': 'RoundtripТест', '-SrcDir': '{workDir}' },
},
// ── 2. Build EPF binary ──
{
name: 'epf-build: сборка EPF',
script: 'epf-build/scripts/epf-build',
args: {
'-V8Path': '{v8path}',
'-SourceFile': '{workDir}/RoundtripТест.xml',
'-OutputFile': '{workDir}/RoundtripТест.epf',
},
},
// ── 3. Create temp DB for dump (epf-dump requires database connection) ──
{
name: 'db-create: временная ИБ для разборки',
script: 'db-create/scripts/db-create',
args: { '-V8Path': '{v8path}', '-InfoBasePath': '{workDir}/tmpdb' },
},
// ── 4. Dump EPF back to XML ──
{
name: 'epf-dump: разборка EPF в XML',
script: 'epf-dump/scripts/epf-dump',
args: {
'-V8Path': '{v8path}',
'-InputFile': '{workDir}/RoundtripТест.epf',
'-OutputDir': '{workDir}/roundtrip-dump',
'-InfoBasePath': '{workDir}/tmpdb',
},
},
];