feat(web-test): M5-pre #2 — составной тип Источник + 03-fillfields/composite

Расширение синтетики: реквизит Источник составного типа
(CatalogRef.Контрагенты + CatalogRef.Номенклатура + CatalogRef.Организации)
добавлен в шапку ПриходнаяНакладная и в ТЧ Товары. meta-compile принимает
составной тип через строковый синтаксис `A + B + C` (см. SKILL.md:56) —
эмитит три `<v8:Type>` элемента с правильным `d5p1:` префиксом.

Элемент ТЧ-колонки переименован в ИсточникТЧ (path/title оставлены
оригинальные) — иначе form-compile генерирует одинаковые companion-имена
(`ИсточникКонтекстноеМеню`) для шапки и ТЧ, и платформа отказывает в
открытии формы документа: "К сожалению, возникла непредвиденная ошибка"
(server-side, без полезного stack). TODO в form-compile-bugs.md: учитывать
путь поля при генерации companion-имён, чтобы избежать конфликта.

Новый шаг 03-fillfields/composite (~25s) — покрывает selectValue с
параметром `{type}` на составном поле:
- Шапка: selectValue('Источник', 'ООО Север', {type:'Контрагенты'})
  → method:'form', type:'Контрагенты', выбор через каталог-форму.
- ТЧ: fillTableRow({Источник: {value:'Альфа', type:'Организации'}},
  {row:0}) → method:'form', type:'Организации' (quickChoice=true →
  без формы выбора, прямой dropdown).

fillFields на composite без type выбрасывает понятную ошибку
с инструкцией «specify the type: selectValue(...,{type:'ИмяТипа'})» —
поведение API стабильно.

timeout 03-fillfields поднят с 60000 → 120000ms (6 шагов суммарно
~63s, новый composite step добавляет ~25s).

Полный регресс **18/18 зелёный** (8m 28.7s).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-05-12 15:51:41 +03:00
parent 3d16e35e80
commit ddebd7b6df
2 changed files with 44 additions and 2 deletions
+34 -2
View File
@@ -1,10 +1,10 @@
export const name = 'fillFields: text, checkbox, date, dropdown, reference';
export const tags = ['fillfields', 'smoke'];
export const timeout = 60000;
export const timeout = 120000;
const findField = (state, name) => state.fields?.find(f => f.name === name || f.label === name);
export default async function({ navigateSection, openCommand, clickElement, fillFields, filterList, closeForm, getFormState, assert, step, log }) {
export default async function({ navigateSection, openCommand, clickElement, fillFields, fillTableRow, selectValue, filterList, closeForm, getFormState, assert, step, log }) {
await step('text+checkbox+date+dropdown: fillFields на Номенклатура', async () => {
await navigateSection('Склад');
@@ -122,4 +122,36 @@ export default async function({ navigateSection, openCommand, clickElement, fill
await closeForm({ save: false });
});
await step('composite: selectValue с {type} в шапке и ТЧ накладной', async () => {
// ПриходнаяНакладная.Источник — составной тип:
// CatalogRef.Контрагенты + CatalogRef.Номенклатура + CatalogRef.Организации
// fillFields без type→ошибка с подсказкой «specify the type»;
// selectValue('Источник', value, {type:'Контрагенты'}) выбирает тип в диалоге.
await navigateSection('Склад');
await openCommand('Приходная накладная');
await clickElement('Создать');
// Шапка: выбор Контрагента в составном поле
const headRes = await selectValue('Источник', 'ООО Север', { type: 'Контрагенты' });
log('header: type=' + headRes.selected?.type + ' method=' + headRes.selected?.method);
assert.equal(headRes.selected?.method, 'form', 'composite header → method=form');
assert.equal(headRes.selected?.type, 'Контрагенты', 'type=Контрагенты выбран');
const state1 = await getFormState();
const headField = state1.fields?.find(f => f.name === 'Источник');
assert.equal(headField?.value, 'ООО Север', 'значение в шапке установилось');
// ТЧ: добавить строку, выбрать тип Организация (квик-чойс — без формы выбора)
await clickElement('Добавить');
const rowRes = await fillTableRow(
{ Источник: { value: 'Альфа', type: 'Организации' } },
{ row: 0 },
);
log('row: ' + JSON.stringify(rowRes.filled?.[0]));
assert.equal(rowRes.filled?.[0]?.ok, true, 'composite row → ok');
assert.equal(rowRes.filled?.[0]?.type, 'Организации', 'выбран тип Организации в ТЧ');
await closeForm({ save: false });
});
}