Skip to content

Commit 5c95419

Browse files
committed
feat: add IndexedDB unit test
1 parent 79d22b9 commit 5c95419

5 files changed

Lines changed: 118 additions & 0 deletions

File tree

jest.config.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,5 @@ module.exports = {
99
testPathIgnorePatterns: ['/node_modules/'],
1010
testMatch: ['**/__test__/**/(*.)+test.[jt]s?(x)'],
1111
moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx'],
12+
setupFilesAfterEnv: ['./jest.setup.ts'],
1213
};

jest.setup.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import structuredClone from '@ungap/structured-clone';
2+
import 'fake-indexeddb/auto';
3+
4+
if (typeof globalThis.structuredClone !== 'function') {
5+
globalThis.structuredClone = structuredClone as unknown as typeof globalThis.structuredClone;
6+
}

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,12 @@
4646
"@types/js-cookie": "^3.0.6",
4747
"@types/lodash-es": "^4.17.12",
4848
"@types/ua-parser-js": "^0.7.39",
49+
"@ungap/structured-clone": "^1.3.0",
4950
"commitizen": "^4.3.1",
5051
"commitlint": "^19.5.0",
5152
"conventional-changelog-cli": "^2.0.31",
5253
"cz-conventional-changelog": "^3.3.0",
54+
"fake-indexeddb": "^6.2.5",
5355
"gh-pages": "^6.3.0",
5456
"husky": "^9.1.6",
5557
"jest": "^29.7.0",

pnpm-lock.yaml

Lines changed: 9 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
import IndexedDB from '../index';
2+
3+
const createDB = async () => {
4+
const db = new IndexedDB(`testDB_${Date.now()}_${Math.random()}`, 1, 'testStore');
5+
await db.open();
6+
return db;
7+
};
8+
9+
describe('IndexedDB', () => {
10+
// open
11+
test('opens database successfully', async () => {
12+
const db = await createDB();
13+
14+
const instance = await db.open();
15+
expect(instance).toBeDefined();
16+
expect(instance.name).toBeDefined();
17+
});
18+
19+
test('returns existing connection if already opened', async () => {
20+
const db = await createDB();
21+
22+
const first = await db.open();
23+
const second = await db.open();
24+
expect(first).toBe(second);
25+
});
26+
27+
// 'add & get'
28+
test('adds and retrieves data', async () => {
29+
const db = await createDB();
30+
31+
await db.add('user1', { name: 'John', age: 30 });
32+
33+
const result = await db.get<{ name: string; age: number }>('user1');
34+
35+
expect(result).toEqual({ name: 'John', age: 30 });
36+
});
37+
38+
// set(update)
39+
test('updates existing data', async () => {
40+
const db = await createDB();
41+
42+
await db.add('user1', { name: 'John', age: 30 });
43+
await db.set('user1', { name: 'John', age: 31 });
44+
45+
const result = await db.get<{ age: number }>('user1');
46+
expect(result.age).toBe(31);
47+
});
48+
49+
// delete
50+
test('deletes data by key', async () => {
51+
const db = await createDB();
52+
53+
await db.add('user1', { name: 'John' });
54+
await db.delete('user1');
55+
56+
const result = await db.get('user1');
57+
expect(result).toBeUndefined();
58+
});
59+
60+
// clear
61+
test('clears all data in store', async () => {
62+
const db = await createDB();
63+
64+
await db.add('user1', { name: 'John' });
65+
await db.add('user2', { name: 'Jane' });
66+
67+
await db.clear();
68+
69+
const result1 = await db.get('user1');
70+
const result2 = await db.get('user2');
71+
72+
expect(result1).toBeUndefined();
73+
expect(result2).toBeUndefined();
74+
});
75+
76+
// ensureConnection / error handling
77+
test('throws error when operating before open', async () => {
78+
const newDB = new IndexedDB('newDB', 1, 'store');
79+
80+
await expect(newDB.get('key')).resolves.toBeUndefined();
81+
});
82+
83+
test('handles non-existing key gracefully', async () => {
84+
const db = await createDB();
85+
86+
const result = await db.get('not-exist');
87+
expect(result).toBeUndefined();
88+
});
89+
90+
// version upgrade
91+
test('creates object store on upgrade', async () => {
92+
const oldDb = new IndexedDB('upgradeDB', 1, 'store1');
93+
await oldDb.open();
94+
95+
const newDb = new IndexedDB('upgradeDB', 2, 'store2');
96+
const instance = await newDb.open();
97+
98+
expect(instance.objectStoreNames.contains('store2')).toBe(true);
99+
});
100+
});

0 commit comments

Comments
 (0)