test: add suites for 8 simple state reducers + msgContent (+50)
Via subagent, all verified, no bugs: - state/toast (7), room-list/roomList (6), inviteList (6), room-list/utils compareRoomsEqual (6), backupRestore (6), callEmbed dispose-on-replace (6), closedNavCategories factory + makeNavCategoryId (8). - features/room/msgContent (5): getAudioMsgContent/getFileMsgContent incl. encrypted (content.file) vs plain (content.url) branch. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,87 @@
|
||||
import { test } from 'node:test';
|
||||
import assert from 'node:assert/strict';
|
||||
import { createStore } from 'jotai';
|
||||
import { toastQueueAtom, dismissToastAtom, ToastNotif } from './toast';
|
||||
|
||||
// The queue lives in an unexported baseAtom; we drive the two write-only setters
|
||||
// (toastQueueAtom append + null no-op guard, dismissToastAtom remove-by-id)
|
||||
// through a jotai store and read back via toastQueueAtom's getter.
|
||||
|
||||
const makeToast = (id: string): ToastNotif => ({
|
||||
id,
|
||||
displayName: `name-${id}`,
|
||||
body: `body-${id}`,
|
||||
roomName: `room-${id}`,
|
||||
roomId: `!${id}:server`,
|
||||
});
|
||||
|
||||
test('starts empty', () => {
|
||||
const store = createStore();
|
||||
assert.deepEqual(store.get(toastQueueAtom), []);
|
||||
});
|
||||
|
||||
test('toastQueueAtom appends in order', () => {
|
||||
const store = createStore();
|
||||
const a = makeToast('a');
|
||||
const b = makeToast('b');
|
||||
store.set(toastQueueAtom, a);
|
||||
store.set(toastQueueAtom, b);
|
||||
assert.deepEqual(
|
||||
store.get(toastQueueAtom).map((t) => t.id),
|
||||
['a', 'b'],
|
||||
);
|
||||
assert.equal(store.get(toastQueueAtom)[0], a);
|
||||
});
|
||||
|
||||
test('toastQueueAtom ignores null (no-op guard)', () => {
|
||||
const store = createStore();
|
||||
store.set(toastQueueAtom, makeToast('a'));
|
||||
store.set(toastQueueAtom, null);
|
||||
assert.deepEqual(
|
||||
store.get(toastQueueAtom).map((t) => t.id),
|
||||
['a'],
|
||||
);
|
||||
});
|
||||
|
||||
test('toastQueueAtom allows duplicate ids (no dedupe)', () => {
|
||||
const store = createStore();
|
||||
store.set(toastQueueAtom, makeToast('a'));
|
||||
store.set(toastQueueAtom, makeToast('a'));
|
||||
assert.equal(store.get(toastQueueAtom).length, 2);
|
||||
});
|
||||
|
||||
test('dismissToastAtom removes the matching id only', () => {
|
||||
const store = createStore();
|
||||
store.set(toastQueueAtom, makeToast('a'));
|
||||
store.set(toastQueueAtom, makeToast('b'));
|
||||
store.set(toastQueueAtom, makeToast('c'));
|
||||
|
||||
store.set(dismissToastAtom, 'b');
|
||||
assert.deepEqual(
|
||||
store.get(toastQueueAtom).map((t) => t.id),
|
||||
['a', 'c'],
|
||||
);
|
||||
});
|
||||
|
||||
test('dismissToastAtom removes every entry sharing the id', () => {
|
||||
const store = createStore();
|
||||
store.set(toastQueueAtom, makeToast('a'));
|
||||
store.set(toastQueueAtom, makeToast('a'));
|
||||
store.set(toastQueueAtom, makeToast('b'));
|
||||
|
||||
store.set(dismissToastAtom, 'a');
|
||||
assert.deepEqual(
|
||||
store.get(toastQueueAtom).map((t) => t.id),
|
||||
['b'],
|
||||
);
|
||||
});
|
||||
|
||||
test('dismissToastAtom for an unknown id is a no-op', () => {
|
||||
const store = createStore();
|
||||
store.set(toastQueueAtom, makeToast('a'));
|
||||
store.set(dismissToastAtom, 'missing');
|
||||
assert.deepEqual(
|
||||
store.get(toastQueueAtom).map((t) => t.id),
|
||||
['a'],
|
||||
);
|
||||
});
|
||||
Reference in New Issue
Block a user