Skip to content

Commit a197778

Browse files
committed
test: T0 前置验证——Dexie 存储冒烟测试(fake-indexeddb)
1 parent 17b44e5 commit a197778

3 files changed

Lines changed: 73 additions & 0 deletions

File tree

‎client/package-lock.json‎

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎client/package.json‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@
105105
"electron": "^35.7.5",
106106
"electron-builder": "^25.1.8",
107107
"electron-rebuild": "^3.2.9",
108+
"fake-indexeddb": "^6.2.5",
108109
"jsdom": "^29.1.1",
109110
"oxlint": "^1.71.0",
110111
"postcss": "^8.5.16",
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
// @vitest-environment jsdom
2+
/**
3+
* PWA Dexie 存储冒烟测试(T0.3 前置验证)
4+
*
5+
* @ai-context: 用 fake-indexeddb 在 jsdom 中真实初始化 IndexedDB,验证
6+
* 'keban' 库 25 版本 schema 可 open、核心表(notes/pomodoroSessions/
7+
* classroomNotes/offlineQueue/crdtDocs)可写读、createAllStores() PWA 分支
8+
* 返回 Dexie 存储。现有单测均 vi.mock 掉 db,schema 升级链从未真实验证——
9+
* 本冒烟是 PWA 移动端存储地基的最低保障。
10+
* @ai-context EN: real IndexedDB smoke test via fake-indexeddb in jsdom —
11+
* verifies the 25-version 'keban' schema opens, core tables read/write, and
12+
* createAllStores() resolves to Dexie-backed stores under the PWA branch.
13+
*/
14+
import 'fake-indexeddb/auto';
15+
import { describe, it, expect, beforeAll } from 'vitest';
16+
import { db } from './database';
17+
import { createAllStores, getRuntimeEnvironment } from './storageFactory';
18+
import type { Note } from '@/types/models';
19+
20+
describe('Dexie PWA 存储冒烟(T0.3)', () => {
21+
beforeAll(async () => {
22+
await db.open();
23+
});
24+
25+
it('schema open 成功且库名/版本正确', () => {
26+
expect(db.name).toBe('keban');
27+
expect(db.verno).toBe(25);
28+
expect(db.notes).toBeDefined();
29+
expect(db.pomodoroSessions).toBeDefined();
30+
expect(db.classroomNotes).toBeDefined();
31+
expect(db.offlineQueue).toBeDefined();
32+
expect(db.crdtDocs).toBeDefined();
33+
});
34+
35+
it('PWA 运行时判定(jsdom 无 electronAPI)', () => {
36+
expect(getRuntimeEnvironment()).toBe('pwa');
37+
});
38+
39+
it('notes 表真实读写', async () => {
40+
const id = 'smoke-note-1';
41+
await db.notes.put({
42+
id,
43+
title: '冒烟',
44+
createdAt: 1,
45+
updatedAt: 1,
46+
tags: [],
47+
pinned: false,
48+
} as unknown as Note);
49+
const got = await db.notes.get(id);
50+
expect(got?.title).toBe('冒烟');
51+
await db.notes.delete(id);
52+
expect(await db.notes.get(id)).toBeUndefined();
53+
});
54+
55+
it('createAllStores PWA 分支返回可用存储', async () => {
56+
const stores = createAllStores();
57+
expect(await stores.notes.count()).toBe(0);
58+
expect(await stores.pomodoroSessions.count()).toBe(0);
59+
expect(await stores.offlineQueue.count()).toBe(0);
60+
});
61+
});

0 commit comments

Comments
 (0)