отображение ошибки
Tests / frontend-test (push) Successful in 1m9s

This commit is contained in:
gorbenko.pavel
2026-08-11 12:51:26 +05:00
parent 00977dcea6
commit 5cbc9eb89b
4 changed files with 239 additions and 39 deletions
@@ -1,4 +1,4 @@
import { installErrorLogging } from './diagnostics';
import { describeReason, installErrorLogging } from './diagnostics';
// jsdom не порождает unhandledrejection сам — событие диспатчим руками, как это
// сделал бы браузер. Конструктора PromiseRejectionEvent в jsdom нет, поэтому
@@ -62,3 +62,47 @@ describe('installErrorLogging', () => {
expect(count).toBe(1);
});
});
// describeReason — то, что пользователь реально видит в отчёте об ошибке (и в
// угловом уведомлении ErrorOverlay), поэтому пустых строк он давать не должен
// ни на одном виде причины.
describe('describeReason', () => {
it('промис без причины описывается словами, а не пустой строкой', () => {
// Здесь и ломалось: JSON.stringify(undefined) возвращает undefined, и
// сообщение схлопывалось в пустоту — по отчёту нельзя было понять даже
// того, что причины не было вовсе.
expect(describeReason(undefined)).toContain('без причины');
});
it('null тоже описывается', () => {
expect(describeReason(null)).toContain('null');
});
it('ошибка — имя и сообщение', () => {
expect(describeReason(new TypeError('нет доступа'))).toBe('TypeError: нет доступа');
});
it('ошибка с пустым сообщением не даёт пустую строку', () => {
expect(describeReason(new Error(''))).toContain('пустое сообщение');
});
it('строка возвращается как есть', () => {
expect(describeReason('сервер недоступен')).toBe('сервер недоступен');
});
it('обычный объект сериализуется', () => {
expect(describeReason({ status: 404 })).toContain('404');
});
it('циклическая ссылка не роняет разбор — остаются ключи', () => {
// Внутри ошибок PnPjs лежит Response со ссылками на себя: JSON.stringify на
// таком объекте бросает, и раньше это происходило прямо внутри обработчика
// события.
const circular: Record<string, unknown> = { status: 500 };
circular.self = circular;
const text = describeReason(circular);
expect(text).toContain('status');
expect(text).toContain('self');
});
});