Skip to content

Commit ad583bd

Browse files
committed
test: add more DatabaseQueue tests
1 parent 91abc20 commit ad583bd

File tree

1 file changed

+182
-0
lines changed

1 file changed

+182
-0
lines changed
Lines changed: 182 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,182 @@
1+
import {
2+
expect,
3+
isNitroSQLiteError,
4+
TEST_ERROR,
5+
TEST_ERROR_CODES,
6+
TEST_ERROR_MESSAGE,
7+
} from '../common'
8+
import { describe, it } from '../../MochaRNAdapter'
9+
import { testDb, testDbQueue } from '../../db'
10+
import type { BatchQueryCommand } from 'react-native-nitro-sqlite'
11+
12+
const TEST_QUERY = 'SELECT * FROM [User];'
13+
14+
const TEST_BATCH_COMMANDS: BatchQueryCommand[] = [{ query: TEST_QUERY }]
15+
16+
export default function registerDatabaseQueueUnitTests() {
17+
describe('Database Queue', () => {
18+
it('multiple transactions are queued', async () => {
19+
const transaction1Promise = testDb.transaction(async (tx) => {
20+
tx.execute(TEST_QUERY)
21+
22+
expect(testDbQueue.queue.length).to.equal(2)
23+
expect(testDbQueue.inProgress).to.equal(true)
24+
25+
await new Promise<void>((resolve) => setTimeout(resolve, 100))
26+
27+
tx.execute(TEST_QUERY)
28+
29+
expect(testDbQueue.queue.length).to.equal(2)
30+
expect(testDbQueue.inProgress).to.equal(true)
31+
})
32+
33+
expect(testDbQueue.inProgress).to.equal(true)
34+
expect(testDbQueue.queue.length).to.equal(0)
35+
36+
const transaction2Promise = testDb.transaction(async (tx) => {
37+
tx.execute(TEST_QUERY)
38+
})
39+
40+
expect(testDbQueue.queue.length).to.equal(1)
41+
expect(testDbQueue.inProgress).to.equal(true)
42+
43+
const transaction3Promise = testDb.transaction(async (tx) => {
44+
tx.execute(TEST_QUERY)
45+
})
46+
47+
await transaction1Promise
48+
49+
expect(testDbQueue.queue.length).to.equal(1)
50+
expect(testDbQueue.inProgress).to.equal(true)
51+
52+
await transaction2Promise
53+
54+
expect(testDbQueue.queue.length).to.equal(0)
55+
expect(testDbQueue.inProgress).to.equal(true)
56+
57+
await transaction3Promise
58+
59+
expect(testDbQueue.queue.length).to.equal(0)
60+
expect(testDbQueue.inProgress).to.equal(false)
61+
})
62+
63+
it('multiple executeBatchAsync operations are queued', async () => {
64+
const executeBatch1Promise = testDb.executeBatchAsync(TEST_BATCH_COMMANDS)
65+
66+
expect(testDbQueue.queue.length).to.equal(0)
67+
expect(testDbQueue.inProgress).to.equal(true)
68+
69+
const executeBatch2Promise = testDb.executeBatchAsync(TEST_BATCH_COMMANDS)
70+
71+
expect(testDbQueue.queue.length).to.equal(1)
72+
expect(testDbQueue.inProgress).to.equal(true)
73+
74+
const executeBatch3Promise = testDb.executeBatchAsync(TEST_BATCH_COMMANDS)
75+
76+
expect(testDbQueue.queue.length).to.equal(2)
77+
expect(testDbQueue.inProgress).to.equal(true)
78+
79+
await executeBatch1Promise
80+
81+
expect(testDbQueue.queue.length).to.equal(1)
82+
expect(testDbQueue.inProgress).to.equal(true)
83+
84+
await executeBatch2Promise
85+
86+
expect(testDbQueue.queue.length).to.equal(0)
87+
expect(testDbQueue.inProgress).to.equal(true)
88+
89+
await executeBatch3Promise
90+
91+
expect(testDbQueue.queue.length).to.equal(0)
92+
expect(testDbQueue.inProgress).to.equal(false)
93+
})
94+
95+
it('mixed transactions and executeBatchAsync operations are queued', async () => {
96+
const transaction1Promise = testDb.transaction(async (tx) => {
97+
tx.execute('SELECT * FROM [User];')
98+
})
99+
100+
expect(testDbQueue.queue.length).to.equal(0)
101+
expect(testDbQueue.inProgress).to.equal(true)
102+
103+
const executeBatch1Promise = testDb.executeBatchAsync(TEST_BATCH_COMMANDS)
104+
105+
expect(testDbQueue.queue.length).to.equal(1)
106+
expect(testDbQueue.inProgress).to.equal(true)
107+
108+
const transaction2Promise = testDb.transaction(async (tx) => {
109+
tx.execute(TEST_QUERY)
110+
})
111+
112+
expect(testDbQueue.queue.length).to.equal(2)
113+
expect(testDbQueue.inProgress).to.equal(true)
114+
115+
const executeBatch2Promise = testDb.executeBatchAsync(TEST_BATCH_COMMANDS)
116+
117+
expect(testDbQueue.queue.length).to.equal(3)
118+
expect(testDbQueue.inProgress).to.equal(true)
119+
120+
await transaction1Promise
121+
122+
expect(testDbQueue.queue.length).to.equal(2)
123+
expect(testDbQueue.inProgress).to.equal(true)
124+
125+
await executeBatch1Promise
126+
127+
expect(testDbQueue.queue.length).to.equal(1)
128+
expect(testDbQueue.inProgress).to.equal(true)
129+
130+
await transaction2Promise
131+
132+
expect(testDbQueue.queue.length).to.equal(0)
133+
expect(testDbQueue.inProgress).to.equal(true)
134+
135+
await executeBatch2Promise
136+
137+
expect(testDbQueue.queue.length).to.equal(0)
138+
expect(testDbQueue.inProgress).to.equal(false)
139+
})
140+
141+
it('errors are thrown through DatabaseQueue', async () => {
142+
const transaction1Promise = testDb.transaction(async (tx) => {
143+
tx.execute('SELECT * FROM [User];')
144+
throw TEST_ERROR
145+
})
146+
147+
expect(testDbQueue.queue.length).to.equal(0)
148+
expect(testDbQueue.inProgress).to.equal(true)
149+
150+
const executeBatch1Promise = testDb.executeBatchAsync(TEST_BATCH_COMMANDS)
151+
152+
expect(testDbQueue.queue.length).to.equal(1)
153+
expect(testDbQueue.inProgress).to.equal(true)
154+
155+
try {
156+
await transaction1Promise
157+
158+
expect(testDbQueue.queue.length).to.equal(0)
159+
expect(testDbQueue.inProgress).to.equal(true)
160+
} catch (e) {
161+
if (isNitroSQLiteError(e)) {
162+
expect(e.message).to.include(TEST_ERROR_MESSAGE)
163+
} else {
164+
expect.fail(TEST_ERROR_CODES.EXPECT_NITRO_SQLITE_ERROR)
165+
}
166+
}
167+
168+
try {
169+
await executeBatch1Promise
170+
171+
expect(testDbQueue.queue.length).to.equal(0)
172+
expect(testDbQueue.inProgress).to.equal(false)
173+
} catch (e) {
174+
if (isNitroSQLiteError(e)) {
175+
expect(e.message).to.include(TEST_ERROR_MESSAGE)
176+
} else {
177+
expect.fail(TEST_ERROR_CODES.EXPECT_NITRO_SQLITE_ERROR)
178+
}
179+
}
180+
})
181+
})
182+
}

0 commit comments

Comments
 (0)