Files
cc-1c-skills/tests/web-test/10-validation.test.mjs
T
Nick Shirokov 4af69f1600 test(web-test): M4.A — validation messages + exception modal + error stack
10-validation.test.mjs (3 шага): Сообщить() → state.errors.messages,
ВызватьИсключение → onecError.errors.modal с автоматическим закрытием
fetchErrorStack.

14-errors-stack.test.mjs (3 шага): Path 1 OpenReport автоматически фетчит
стек для серверных исключений (entries[] содержит кадр ОбщиеФункции);
оставленная error modal через raw page.click закрывается closeForm;
платформенный диалог «О программе» виден в state.platformDialogs и
закрывается closeForm.

Покрыто 4 P2-кейса coverage matrix: 10-validation/messages,
10-validation/exception-modal, 14-errors/path1, 14-errors/dismiss-platform
+ бонус dismiss-modal. Открытие обработки ТестовыеОшибки через
navigateLink('Обработка.ТестовыеОшибки') — стандартные команды у
DataProcessor отключены.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 15:21:11 +03:00

44 lines
2.6 KiB
JavaScript

export const name = 'validation: messages panel + exception modal';
export const tags = ['validation', 'errors'];
export const timeout = 60000;
export default async function({ navigateLink, clickElement, closeForm, getFormState, assert, step, log }) {
await step('open: обработка ТестовыеОшибки доступна через navigateLink', async () => {
const s = await navigateLink('Обработка.ТестовыеОшибки');
log(`buttons: ${s.buttons?.map(b => b.name).join(', ')}`);
assert.ok(s.buttons?.some(b => b.name === 'Показать сообщение'), 'кнопка «Показать сообщение»');
assert.ok(s.buttons?.some(b => b.name === 'Вызвать исключение'), 'кнопка «Вызвать исключение»');
});
await step('messages: Сообщить() показывает текст в панели Сообщения', async () => {
const r = await clickElement('Показать сообщение');
log(`errors.messages: ${JSON.stringify(r.errors?.messages)}`);
assert.ok(Array.isArray(r.errors?.messages), 'errors.messages — массив');
assert.ok(r.errors.messages.includes('Тестовое сообщение'), 'содержит «Тестовое сообщение»');
assert.ok(!r.errors.modal, 'модальной ошибки нет — это инфо-панель');
});
await step('exception-modal: ВызватьИсключение приводит к onecError.errors.modal', async () => {
let caught = null;
try {
await clickElement('Вызвать исключение');
} catch (e) {
caught = e;
}
assert.ok(caught, 'clickElement должен бросить ошибку при платформенном исключении');
assert.equal(caught.message, 'Тестовое исключение', 'e.message = текст исключения');
const modal = caught.onecError?.errors?.modal;
log(`modal: ${JSON.stringify(modal)}`);
assert.ok(modal, 'onecError.errors.modal присутствует');
assert.equal(modal.message, 'Тестовое исключение', 'modal.message');
assert.ok(typeof modal.formNum === 'number', 'modal.formNum — число');
// После throw fetchErrorStack автоматически закрыл модалку — проверим
const after = await getFormState();
assert.ok(!after.errors?.modal, 'модалка автоматически закрыта');
assert.ok(!after.platformDialogs?.length, 'платформенные диалоги не оставлены');
});
await closeForm();
}