47 lines
1.7 KiB
TypeScript
47 lines
1.7 KiB
TypeScript
import { describe, it, expect, beforeEach } from 'vitest';
|
|
import { useSceneRuntimeErrors } from '@/lib/store/scene-runtime-errors';
|
|
|
|
describe('useSceneRuntimeErrors', () => {
|
|
beforeEach(() => useSceneRuntimeErrors.setState({ errors: {} }));
|
|
|
|
it('records errors per scene', () => {
|
|
useSceneRuntimeErrors.getState().addError('s1', 'JSON.parse SyntaxError');
|
|
useSceneRuntimeErrors.getState().addError('s2', 'ReferenceError: katex');
|
|
expect(useSceneRuntimeErrors.getState().errors).toEqual({
|
|
s1: ['JSON.parse SyntaxError'],
|
|
s2: ['ReferenceError: katex'],
|
|
});
|
|
});
|
|
|
|
it('dedups identical errors (a render loop logging the same thing)', () => {
|
|
const add = useSceneRuntimeErrors.getState().addError;
|
|
add('s1', 'boom');
|
|
add('s1', 'boom');
|
|
add('s1', 'boom');
|
|
expect(useSceneRuntimeErrors.getState().errors.s1).toEqual(['boom']);
|
|
});
|
|
|
|
it('ignores blank messages', () => {
|
|
useSceneRuntimeErrors.getState().addError('s1', ' ');
|
|
expect(useSceneRuntimeErrors.getState().errors.s1).toBeUndefined();
|
|
});
|
|
|
|
it('caps to the most recent 8 distinct errors', () => {
|
|
for (let i = 0; i < 12; i++) useSceneRuntimeErrors.getState().addError('s1', `err ${i}`);
|
|
const e = useSceneRuntimeErrors.getState().errors.s1;
|
|
expect(e).toHaveLength(8);
|
|
expect(e[0]).toBe('err 4');
|
|
expect(e[7]).toBe('err 11');
|
|
});
|
|
|
|
it('clearScene drops only that scene; clearAll drops everything', () => {
|
|
const { addError, clearScene, clearAll } = useSceneRuntimeErrors.getState();
|
|
addError('s1', 'a');
|
|
addError('s2', 'b');
|
|
clearScene('s1');
|
|
expect(useSceneRuntimeErrors.getState().errors).toEqual({ s2: ['b'] });
|
|
clearAll();
|
|
expect(useSceneRuntimeErrors.getState().errors).toEqual({});
|
|
});
|
|
});
|