28 lines
1.2 KiB
TypeScript
28 lines
1.2 KiB
TypeScript
import { describe, expect, it } from 'vitest';
|
|
import { MAX_TOASTS, pushToast, type Toast } from './useToasts';
|
|
|
|
// ISS-008 (v0.17.0): the toast queue's pure core — append + cap at MAX_TOASTS dropping the
|
|
// oldest. The hook itself is a thin useState wrapper around this (auto-dismiss timers are
|
|
// plain setTimeout, covered by e2e via the visible toasts).
|
|
|
|
const toast = (id: number, message: string): Toast => ({ id, kind: 'info', message });
|
|
|
|
describe('pushToast', () => {
|
|
it('appends to an empty queue and preserves order', () => {
|
|
expect(pushToast([], toast(1, 'a'))).toEqual([toast(1, 'a')]);
|
|
expect(pushToast([toast(1, 'a')], toast(2, 'b'))).toEqual([toast(1, 'a'), toast(2, 'b')]);
|
|
});
|
|
|
|
it('keeps the newest MAX_TOASTS entries, dropping the oldest beyond the cap', () => {
|
|
let queue: Toast[] = [];
|
|
for (let id = 1; id <= MAX_TOASTS + 2; id++) queue = pushToast(queue, toast(id, `m${id}`));
|
|
expect(queue).toEqual([toast(MAX_TOASTS - 1, 'm3'), toast(MAX_TOASTS, 'm4'), toast(MAX_TOASTS + 1, 'm5'), toast(MAX_TOASTS + 2, 'm6')]);
|
|
});
|
|
|
|
it('does not mutate the input queue', () => {
|
|
const before = [toast(1, 'a')];
|
|
pushToast(before, toast(2, 'b'));
|
|
expect(before).toEqual([toast(1, 'a')]);
|
|
});
|
|
});
|