diff --git a/tests/web-test/02-crud.test.mjs b/tests/web-test/02-crud.test.mjs index d4fa9f9b..66704796 100644 --- a/tests/web-test/02-crud.test.mjs +++ b/tests/web-test/02-crud.test.mjs @@ -92,14 +92,18 @@ export default async function({ navigateSection, openCommand, clickElement, clos await closeForm({ save: false }); }); - await step('more-menu: clickElement("Ещё") возвращает submenu[]', async () => { + await step('more-menu / submenu-read: clickElement("Ещё") возвращает submenu[] с типовыми пунктами', async () => { await navigateSection('Склад'); await openCommand('Контрагенты'); const r = await clickElement('Ещё'); const items = r.submenu || []; log(`submenu items: ${items.length} sample=${items.slice(0, 5).join(', ')}`); + assert.equal(r.clicked?.kind, 'submenu', 'clicked.kind=submenu'); assert.ok(Array.isArray(r.submenu), 'clickElement("Ещё") должен вернуть submenu[]'); - assert.ok(items.length >= 1, 'submenu не должен быть пустым'); + assert.ok(items.length >= 5, `submenu должен содержать типовые пункты (got ${items.length})`); + assert.includes(items, 'Создать', 'пункт «Создать»'); + assert.includes(items, 'Изменить', 'пункт «Изменить»'); + assert.includes(items, 'Расширенный поиск', 'пункт «Расширенный поиск»'); // Закрыть submenu const page = await getPage(); await page.keyboard.press('Escape'); diff --git a/tests/web-test/11-report.test.mjs b/tests/web-test/11-report.test.mjs index f68e7d94..dad62c06 100644 --- a/tests/web-test/11-report.test.mjs +++ b/tests/web-test/11-report.test.mjs @@ -95,6 +95,29 @@ export default async function({ navigateSection, openCommand, getFormState, getC assert.equal(report.totals['Сумма'], baseTotalSum, 'Восстановился исходный итог по Сумме'); }); + await step('drill-down: dblclick по ячейке Номенклатура открывает форму элемента', async () => { + // Сформируем отчёт ещё раз для чистого состояния + await clickElement('Сформировать'); + await wait(3); + const r = await readSpreadsheet(); + const namedIdx = r.data.findIndex(row => row['Номенклатура']); + log(`first row with Номенклатура: idx=${namedIdx} value=${r.data[namedIdx]?.['Номенклатура']}`); + assert.ok(namedIdx >= 0, 'есть строка с заполненной Номенклатурой'); + + const beforeForm = await getFormState(); + const clicked = await clickElement({ row: namedIdx, column: 'Номенклатура' }, { dblclick: true }); + log(`clicked: ${JSON.stringify(clicked.clicked)}`); + assert.equal(clicked.clicked?.kind, 'spreadsheetCell', 'clicked.kind=spreadsheetCell'); + await wait(1); + + const after = await getFormState(); + log(`after drill: form=${after.form} buttons=${after.buttons?.map(b => b.name).join(',')}`); + assert.notEqual(after.form, beforeForm.form, 'открыта новая форма (form изменился)'); + const hasItemButton = after.buttons?.some(b => b.name === 'Записать и закрыть' || b.name === 'Записать'); + assert.ok(hasItemButton, 'открыта форма элемента (есть «Записать»)'); + await closeForm(); + }); + await step('cleanup: закрываем форму отчёта', async () => { const r = await closeForm(); log(`closed=${r.closed} formCount=${r.formCount}`);