@@ -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');
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user