Skip to content

Commit 8e4f1a6

Browse files
committed
[test]: query test;
1 parent 3f56381 commit 8e4f1a6

1 file changed

Lines changed: 182 additions & 0 deletions

File tree

__tests__/query.test.ts

Lines changed: 182 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,182 @@
1+
import { Database, DataClass, KeyPath, Index } from "../index";
2+
3+
// Test entities for coverage improvement
4+
@DataClass()
5+
class CoverageUser {
6+
@KeyPath()
7+
id!: string;
8+
9+
@Index()
10+
age!: number;
11+
12+
@Index()
13+
status!: string;
14+
15+
@Index()
16+
score!: number;
17+
18+
constructor(id: string, age: number, status: string, score: number) {
19+
this.id = id;
20+
this.age = age;
21+
this.status = status;
22+
this.score = score;
23+
}
24+
}
25+
26+
describe('Coverage Improvement Tests', () => {
27+
let db: any;
28+
29+
beforeEach(async () => {
30+
// Use unique database names to avoid conflicts
31+
const dbName = `coverage-test-${Date.now()}-${Math.random()}`;
32+
33+
// Clear any existing database
34+
const deleteRequest = indexedDB.deleteDatabase(dbName);
35+
await new Promise<void>((resolve) => {
36+
deleteRequest.onsuccess = () => resolve();
37+
deleteRequest.onerror = () => resolve(); // Continue even if deletion fails
38+
});
39+
40+
db = await Database.build(dbName, [CoverageUser]);
41+
});
42+
43+
describe('QueryBuilder Coverage', () => {
44+
beforeEach(async () => {
45+
// Clear and add test data
46+
await db.CoverageUser.clear();
47+
await db.CoverageUser.create(new CoverageUser('u1', 25, 'active', 85));
48+
await db.CoverageUser.create(new CoverageUser('u2', 30, 'inactive', 75));
49+
await db.CoverageUser.create(new CoverageUser('u3', 35, 'active', 95));
50+
await db.CoverageUser.create(new CoverageUser('u4', 20, 'pending', 65));
51+
});
52+
53+
it('should test lte method in QueryBuilder', async () => {
54+
// Test lte method (line 62-65)
55+
const results = await db.CoverageUser.query()
56+
.where('age')
57+
.lte(30)
58+
.execute();
59+
60+
expect(results).toHaveLength(3);
61+
expect(results.map((u: any) => u.id)).toEqual(expect.arrayContaining(['u1', 'u2', 'u4']));
62+
});
63+
64+
it('should test lte comparison in query execution', async () => {
65+
// Test lte comparison (line 129)
66+
const results = await db.CoverageUser.query()
67+
.where('score')
68+
.lte(80)
69+
.execute();
70+
71+
expect(results).toHaveLength(2);
72+
expect(results.map((u: any) => u.id)).toEqual(expect.arrayContaining(['u2', 'u4']));
73+
});
74+
75+
it('should test descending order sorting', async () => {
76+
// Test descending order (line 142)
77+
const results = await db.CoverageUser.query()
78+
.where('status')
79+
.equals('active')
80+
.orderBy('age', 'desc')
81+
.execute();
82+
83+
expect(results).toHaveLength(2);
84+
expect(results[0].age).toBe(35); // u3 should be first
85+
expect(results[1].age).toBe(25); // u1 should be second
86+
});
87+
88+
it('should test query with only lower bound', async () => {
89+
// Test lowerBound only (line 109)
90+
const results = await db.CoverageUser.query()
91+
.where('age')
92+
.gte(30)
93+
.execute();
94+
95+
expect(results).toHaveLength(2);
96+
expect(results.map((u: any) => u.id)).toEqual(expect.arrayContaining(['u2', 'u3']));
97+
});
98+
99+
it('should test query with only upper bound', async () => {
100+
// Test upperBound only (line 110)
101+
const results = await db.CoverageUser.query()
102+
.where('age')
103+
.lte(30)
104+
.execute();
105+
106+
expect(results).toHaveLength(3);
107+
expect(results.map((u: any) => u.id)).toEqual(expect.arrayContaining(['u1', 'u2', 'u4']));
108+
});
109+
110+
it('should test query with both bounds', async () => {
111+
// Test bound (both lower and upper) (line 107)
112+
const results = await db.CoverageUser.query()
113+
.where('age')
114+
.gte(25)
115+
.where('age')
116+
.lte(30)
117+
.execute();
118+
119+
expect(results).toHaveLength(2);
120+
expect(results.map((u: any) => u.id)).toEqual(expect.arrayContaining(['u1', 'u2']));
121+
});
122+
});
123+
124+
describe('Repository Methods Coverage', () => {
125+
it('should test count method', async () => {
126+
// Clear and add test data
127+
await db.CoverageUser.clear();
128+
await db.CoverageUser.create(new CoverageUser('u1', 25, 'active', 85));
129+
await db.CoverageUser.create(new CoverageUser('u2', 30, 'inactive', 75));
130+
131+
// Test count method (lines 579-585)
132+
const count = await db.CoverageUser.count();
133+
expect(count).toBe(2);
134+
});
135+
136+
it('should test exists method', async () => {
137+
// Clear and add test data
138+
await db.CoverageUser.clear();
139+
await db.CoverageUser.create(new CoverageUser('u1', 25, 'active', 85));
140+
141+
// Test exists method (lines 587-597)
142+
const exists1 = await db.CoverageUser.exists('u1');
143+
expect(exists1).toBe(true);
144+
145+
const exists2 = await db.CoverageUser.exists('nonexistent');
146+
expect(exists2).toBe(false);
147+
});
148+
149+
it('should test clear method', async () => {
150+
// Add test data
151+
await db.CoverageUser.create(new CoverageUser('u1', 25, 'active', 85));
152+
await db.CoverageUser.create(new CoverageUser('u2', 30, 'inactive', 75));
153+
154+
// Verify data exists
155+
let count = await db.CoverageUser.count();
156+
expect(count).toBe(2);
157+
158+
// Test clear method (lines 599-609)
159+
await db.CoverageUser.clear();
160+
161+
// Verify data is cleared
162+
count = await db.CoverageUser.count();
163+
expect(count).toBe(0);
164+
});
165+
});
166+
167+
describe('Error Handling Coverage', () => {
168+
it('should test database not initialized error', async () => {
169+
// Test performOperation when database is not initialized (line 627)
170+
const DatabaseClass = require('../index').Database;
171+
const uninitializedDb = new DatabaseClass('testDb', [CoverageUser]);
172+
uninitializedDb.db = null; // Force uninitialized state
173+
174+
try {
175+
await uninitializedDb.performOperation('test', 'readonly', () => {});
176+
fail('Should have thrown an error');
177+
} catch (error: any) {
178+
expect(error.message).toBe('Database not initialized.');
179+
}
180+
});
181+
});
182+
});

0 commit comments

Comments
 (0)