项目文件夹

文件
wehub-resource-sync 2114b14ee0
Sync main into demo / sync (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:35:26 +08:00

100 行
2.8 KiB
TypeScript

import { beforeEach, describe, expect, it, vi } from 'vitest';
function createLocalStorageMock() {
const store = new Map<string, string>();
return {
getItem(key: string) {
return store.has(key) ? store.get(key)! : null;
},
setItem(key: string, value: string) {
store.set(key, value);
},
removeItem(key: string) {
store.delete(key);
},
clear() {
store.clear();
},
};
}
describe('RedBook data loader hydration', () => {
beforeEach(() => {
vi.resetModules();
Object.defineProperty(globalThis, 'localStorage', {
value: createLocalStorageMock(),
configurable: true,
});
vi.stubGlobal('fetch', vi.fn(async (url: string | URL) => {
const raw = String(url);
if (raw.endsWith('/users.json')) {
return Response.json([
{
id: 'u_loader',
name: 'Loader User',
avatar: '',
intro: '',
location: '北京',
followers: 1,
following: 0,
likesAndCollections: 0,
},
]);
}
if (raw.endsWith('/notes.json')) {
return Response.json([
{
id: 'n_loader',
title: 'Loader Note',
desc: 'loaded from JSON',
content: 'loaded from JSON',
authorId: 'u_loader',
images: [],
likes: 0,
collections: 0,
comments: 0,
commentList: [],
createdAt: 1,
},
]);
}
return new Response('not found', { status: 404 });
}));
});
it('populates the loader-level base dataset cache and notifies subscribers', async () => {
const loader = await import('../apps/RedBook/data/loader');
expect(loader.hydrateStore).toBeTypeOf('function');
expect(loader.getBaseDataset()).toBeNull();
const notifications: number[] = [];
const unsubscribe = loader.subscribeBaseDataset(() => {
notifications.push(1);
});
await loader.hydrateStore();
const base = loader.getBaseDataset();
expect(base?.usersById.u_loader?.name).toBe('Loader User');
expect(base?.notesById.n_loader?.title).toBe('Loader Note');
expect(base?.feedIds).toContain('n_loader');
expect(base?.userIds).toContain('u_loader');
expect(notifications.length).toBe(1);
unsubscribe();
});
it('does not introduce base dataset fields into the Zustand store state', async () => {
const loader = await import('../apps/RedBook/data/loader');
await loader.hydrateStore();
const { useRedBookStore } = await import('../apps/RedBook/state');
const state: any = useRedBookStore.getState();
expect(state.entities).toBeUndefined();
expect(state.feedIds).toBeUndefined();
expect(state.userIds).toBeUndefined();
});
});