From 31fa66d8feafe7212ecfed1ada974d8aa3e158ca Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Tue, 2 Jun 2026 17:41:06 +0300 Subject: [PATCH] =?UTF-8?q?test(web-test):=20=D1=80=D0=B5=D0=B3=D1=80?= =?UTF-8?q?=D0=B5=D1=81=D1=81=20=D0=BD=D0=B0=20readSpreadsheet=20=D0=B4?= =?UTF-8?q?=D0=BE=20=D0=A1=D1=84=D0=BE=D1=80=D0=BC=D0=B8=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D1=82=D1=8C=20+=20object-search=20selectValue?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 11-report: чтение несформированного отчёта бросает осмысленную ошибку, не ReferenceError (покрывает import checkForErrors в readSpreadsheet); - 04-selectvalue: объектный поиск selectValue({Наименование}) выбирает через форму выбора (покрывает 3A guard + import filterList). Co-Authored-By: Claude Opus 4.8 (1M context) --- tests/web-test/04-selectvalue.test.mjs | 22 ++++++++++++++++++++++ tests/web-test/11-report.test.mjs | 14 ++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/tests/web-test/04-selectvalue.test.mjs b/tests/web-test/04-selectvalue.test.mjs index 7c5798a8..592523bc 100644 --- a/tests/web-test/04-selectvalue.test.mjs +++ b/tests/web-test/04-selectvalue.test.mjs @@ -69,6 +69,28 @@ export default async function({ navigateSection, openCommand, clickElement, sele await closeForm({ save: false }); }); + await step('object-search: selectValue({ Наименование }) выбирает через форму выбора', async () => { + // Регрессия объектного поиска { field: value }: + // 1) dropdown-путь 3A падал на searchText.toLowerCase() (объект, не строка); + // 2) pickFromSelectionForm (Шаг 2) вызывал filterList без импорта — + // ReferenceError тихо глотался catch'ем, поиск по полю не отрабатывал. + // Теперь объектный search уходит в форму выбора и фильтрует per-field. + await navigateSection('Склад'); + await openCommand('Приходная накладная'); + await clickElement('Создать'); + + const r = await selectValue('Контрагент', { 'Наименование': 'Север' }); + log(`object-search: method=${r.selected?.method} errors=${JSON.stringify(r.errors)}`); + assert.equal(r.selected?.method, 'form', 'объектный поиск идёт через форму выбора'); + assert.ok(!r.errors, 'без ошибок 1С'); + + const field = findField(r, 'Контрагент'); + log(`Контрагент value='${field?.value}'`); + assert.includes(field?.value || '', 'Север', 'выбран контрагент с Наименование=Север'); + + await closeForm({ save: false }); + }); + await step('clear: selectValue с пустым search → Shift+F4', async () => { await navigateSection('Склад'); await openCommand('Приходная накладная'); diff --git a/tests/web-test/11-report.test.mjs b/tests/web-test/11-report.test.mjs index dad62c06..7c60a856 100644 --- a/tests/web-test/11-report.test.mjs +++ b/tests/web-test/11-report.test.mjs @@ -20,6 +20,20 @@ export default async function({ navigateSection, openCommand, getFormState, getC assert.equal(submit.default, true, '«Сформировать» — кнопка по умолчанию'); }); + await step('guard: readSpreadsheet до «Сформировать» → осмысленная ошибка, не ReferenceError', async () => { + // Регрессия: чтение несформированного отчёта идёт в ветку allCells.size===0, + // которая вызывает checkForErrors(). После рефакторинга на модули символ не был + // импортирован в spreadsheet.mjs → падало с "checkForErrors is not defined". + // Теперь должно бросать осмысленное сообщение (+ подсказка из инфо-панели 1С). + let threw = false, msg = ''; + try { await readSpreadsheet(); } + catch (e) { threw = true; msg = e.message; } + log(`readBeforeGenerate: threw=${threw} msg=${msg}`); + assert.ok(threw, 'readSpreadsheet должен бросить — отчёт ещё не сформирован'); + assert.includes(msg, 'no SpreadsheetDocument', 'осмысленное сообщение readSpreadsheet'); + assert.ok(!/is not defined/.test(msg), 'не ReferenceError — checkForErrors импортирован'); + }); + await step('reset: сброс пользовательских настроек к стандартным', async () => { // 1С хранит пользовательские настройки между сессиями — сбрасываем к дефолту, // чтобы тест был идемпотентным независимо от предыдущих прогонов.