mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-07-22 12:41:02 +03:00
fix(web-test): заголовок формы в состоянии + formHasField по массиву fields
Два задокументированных ассерта бросали ВСЕГДА, то есть были мертвы:
- formTitle читал state.title, которого не заполнял никто: getFormStateScript
собирал форму без заголовка. Единственным носителем оставалась панель
открытых окон (activeTab), а она отключается в настройках 1С — на такой базе
заголовок был недоступен ничем.
- formHasField читал state.fields[name], хотя fields — массив объектов
{name, value, …}. На массиве это всегда undefined.
getFormState теперь отдаёт title. Берётся он из шапки самой формы: заголовок
лежит в атрибуте (title у .toplineBoxTitle, data-title у родителя), сам элемент
пустой — поэтому поиском по тексту он и не находился.
Выбор шапки — не «первая видимая»: при открытом всплывающем окне видимы ДВЕ,
родителя и окна, и наивное правило отдавало заголовок родителя — правдоподобный
неверный ответ, при котором тест «окно выбора открылось» зеленел бы по
документу. Приоритет взят тот же, что уже отлажен для крестика закрытия в
closeCrossScript: плавающее окно ps<N> с наибольшим индексом → собственная шапка
формы → и только потом панель открытых окон. Привязка к id, а не к тексту — не
ломается на другой локали. Панель осталась последним звеном: она отключаема, а
при всплывающем окне ещё и показывает родителя.
Диагностика раннера (resetState) тоже переведена на title с прежним activeTab
как запасным.
formHasField ищет по массиву и перечисляет доступные имена в ошибке (раньше
Object.keys по массиву давал индексы). formTitle отличает «заголовок недоступен»
(title === null) от несовпадения.
Почему не поймали раньше: из 12 ассертов сюита вызывала 8, и оба сломанных были
среди четырёх невызываемых. Теперь все четыре задействованы на настоящем выводе
getFormState — formTitle/formHasField/noErrors в 12-formstate (включая случай
всплывающего окна), tableRowCount в 09-filter. Отдельного юнит-теста намеренно
нет: состояние для него пришлось бы писать руками, а именно неверное
представление о форме состояния и породило оба дефекта.
Доки приведены к массиву: примеры вида s.fields['X']?.value в regress.md и в
спеке заменены на fields.find(f => f.name === 'X').
Проверено: заголовок на списке, форме элемента и всплывающем окне; каскад
разведён по значениям (шапка выигрывает у панели, при пустой шапке — откат);
позитив и негатив всех четырёх ассертов на реальном состоянии формы; полный
регресс 29/29 до и после, file/name/status идентичны.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
9b65dccd8a
commit
8826a88427
@@ -40,7 +40,7 @@ export default async function({ navigateSection, openCommand, filterList, unfilt
|
||||
await filterList('ООО Север', { field: 'Наименование', exact: true });
|
||||
const t = await readTable({ maxRows: 50 });
|
||||
log(`exact 'ООО Север': rows=${t.rows?.length} names=${t.rows?.map(r => r['Наименование']).join(',')}`);
|
||||
assert.equal(t.rows?.length, 1, 'exact:true должен дать строго 1 совпадение');
|
||||
assert.tableRowCount(t, 1, 'exact:true должен дать строго 1 совпадение');
|
||||
assert.equal(t.rows[0]['Наименование'], 'ООО Север', 'Это должно быть ООО Север');
|
||||
await unfilterList();
|
||||
await closeForm();
|
||||
|
||||
@@ -14,6 +14,10 @@ export default async function({ navigateSection, openCommand, clickElement, clos
|
||||
assert.ok(s.tables?.length >= 1, 'На форме списка есть таблица');
|
||||
assert.ok(s.tables[0].columns?.length >= 2, 'У таблицы есть колонки');
|
||||
assert.ok(s.buttons?.length >= 1, 'На форме есть кнопки');
|
||||
// title читается из шапки формы (атрибут .toplineBoxTitle), а не из панели открытых окон —
|
||||
// она отключаема в настройках 1С. Панель остаётся запасным источником.
|
||||
assert.formTitle(s, 'Контрагенты', 'Заголовок формы списка');
|
||||
assert.noErrors(s, 'На только что открытой форме списка ошибок быть не должно');
|
||||
await closeForm();
|
||||
});
|
||||
|
||||
@@ -26,6 +30,8 @@ export default async function({ navigateSection, openCommand, clickElement, clos
|
||||
assert.ok(s.fields?.length >= 1, 'На форме элемента есть поля');
|
||||
const named = s.fields.find(f => f.name === 'Наименование');
|
||||
log(`Наименование: label='${named?.label}' value='${named?.value}'`);
|
||||
assert.formHasField(s, 'Наименование', 'formHasField ищет по массиву fields, а не по ключу');
|
||||
assert.formTitle(s, 'Контрагент', 'Заголовок формы элемента');
|
||||
assert.ok(named, 'Должно быть поле Наименование');
|
||||
assert.equal(named.value, 'ООО Север', 'value поля Наименование');
|
||||
assert.ok(named.label, 'У поля есть label');
|
||||
@@ -52,6 +58,9 @@ export default async function({ navigateSection, openCommand, clickElement, clos
|
||||
log(`after F4: form=${s.form} formCount=${s.formCount} modal=${s.modal}`);
|
||||
assert.equal(s.modal, true, 'state.modal=true для модальной формы выбора');
|
||||
assert.ok(s.formCount >= 2, 'formCount >= 2 (родитель + модальная)');
|
||||
// Заголовок берётся у всплывающего окна, а не у родителя: видимы обе шапки, а панель
|
||||
// открытых окон в этот момент показывает родителя ('Приходная накладная').
|
||||
assert.formTitle(s, 'Выбор контрагента', 'title всплывающего окна, а не родительской формы');
|
||||
|
||||
await closeForm();
|
||||
await closeForm({ save: false });
|
||||
|
||||
Reference in New Issue
Block a user