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')]); }); });