@@ -89,19 +89,18 @@ suite('DatabaseSync() constructor', () => { |
89 | 89 |
|
90 | 90 | test('is not read-only by default', (t) => { |
91 | 91 | const dbPath = nextDb(); |
92 | | - const db = new DatabaseSync(dbPath); |
| 92 | + using db = new DatabaseSync(dbPath); |
93 | 93 | db.exec('CREATE TABLE foo (id INTEGER PRIMARY KEY)'); |
94 | 94 | }); |
95 | 95 |
|
96 | 96 | test('is read-only if readOnly is set', (t) => { |
97 | 97 | const dbPath = nextDb(); |
98 | 98 | { |
99 | | - const db = new DatabaseSync(dbPath); |
| 99 | + using db = new DatabaseSync(dbPath); |
100 | 100 | db.exec('CREATE TABLE foo (id INTEGER PRIMARY KEY)'); |
101 | | - db.close(); |
102 | 101 | } |
103 | 102 | { |
104 | | - const db = new DatabaseSync(dbPath, { readOnly: true }); |
| 103 | + using db = new DatabaseSync(dbPath, { readOnly: true }); |
105 | 104 | t.assert.throws(() => { |
106 | 105 | db.exec('CREATE TABLE bar (id INTEGER PRIMARY KEY)'); |
107 | 106 | }, { |
@@ -122,12 +121,11 @@ suite('DatabaseSync() constructor', () => { |
122 | 121 |
|
123 | 122 | test('enables foreign key constraints by default', (t) => { |
124 | 123 | const dbPath = nextDb(); |
125 | | - const db = new DatabaseSync(dbPath); |
| 124 | + using db = new DatabaseSync(dbPath); |
126 | 125 | db.exec(` |
127 | 126 | CREATE TABLE foo (id INTEGER PRIMARY KEY); |
128 | 127 | CREATE TABLE bar (foo_id INTEGER REFERENCES foo(id)); |
129 | 128 | `); |
130 | | - t.after(() => { db.close(); }); |
131 | 129 | t.assert.throws(() => { |
132 | 130 | db.exec('INSERT INTO bar (foo_id) VALUES (1)'); |
133 | 131 | }, { |
@@ -138,12 +136,11 @@ suite('DatabaseSync() constructor', () => { |
138 | 136 |
|
139 | 137 | test('allows disabling foreign key constraints', (t) => { |
140 | 138 | const dbPath = nextDb(); |
141 | | - const db = new DatabaseSync(dbPath, { enableForeignKeyConstraints: false }); |
| 139 | + using db = new DatabaseSync(dbPath, { enableForeignKeyConstraints: false }); |
142 | 140 | db.exec(` |
143 | 141 | CREATE TABLE foo (id INTEGER PRIMARY KEY); |
144 | 142 | CREATE TABLE bar (foo_id INTEGER REFERENCES foo(id)); |
145 | 143 | `); |
146 | | - t.after(() => { db.close(); }); |
147 | 144 | db.exec('INSERT INTO bar (foo_id) VALUES (1)'); |
148 | 145 | }); |
149 | 146 |
|
@@ -158,8 +155,7 @@ suite('DatabaseSync() constructor', () => { |
158 | 155 |
|
159 | 156 | test('disables double-quoted string literals by default', (t) => { |
160 | 157 | const dbPath = nextDb(); |
161 | | - const db = new DatabaseSync(dbPath); |
162 | | - t.after(() => { db.close(); }); |
| 158 | + using db = new DatabaseSync(dbPath); |
163 | 159 | t.assert.throws(() => { |
164 | 160 | db.exec('SELECT "foo";'); |
165 | 161 | }, { |
@@ -170,8 +166,7 @@ suite('DatabaseSync() constructor', () => { |
170 | 166 |
|
171 | 167 | test('allows enabling double-quoted string literals', (t) => { |
172 | 168 | const dbPath = nextDb(); |
173 | | - const db = new DatabaseSync(dbPath, { enableDoubleQuotedStringLiterals: true }); |
174 | | - t.after(() => { db.close(); }); |
| 169 | + using db = new DatabaseSync(dbPath, { enableDoubleQuotedStringLiterals: true }); |
175 | 170 | db.exec('SELECT "foo";'); |
176 | 171 | }); |
177 | 172 |
|
@@ -186,8 +181,7 @@ suite('DatabaseSync() constructor', () => { |
186 | 181 |
|
187 | 182 | test('allows reading big integers', (t) => { |
188 | 183 | const dbPath = nextDb(); |
189 | | - const db = new DatabaseSync(dbPath, { readBigInts: true }); |
190 | | - t.after(() => { db.close(); }); |
| 184 | + using db = new DatabaseSync(dbPath, { readBigInts: true }); |
191 | 185 |
|
192 | 186 | const setup = db.exec(` |
193 | 187 | CREATE TABLE data(key INTEGER PRIMARY KEY, val INTEGER) STRICT; |
@@ -216,8 +210,7 @@ suite('DatabaseSync() constructor', () => { |
216 | 210 |
|
217 | 211 | test('allows returning arrays', (t) => { |
218 | 212 | const dbPath = nextDb(); |
219 | | - const db = new DatabaseSync(dbPath, { returnArrays: true }); |
220 | | - t.after(() => { db.close(); }); |
| 213 | + using db = new DatabaseSync(dbPath, { returnArrays: true }); |
221 | 214 | const setup = db.exec(` |
222 | 215 | CREATE TABLE data(key INTEGER PRIMARY KEY, val TEXT) STRICT; |
223 | 216 | INSERT INTO data (key, val) VALUES (1, 'one'); |
@@ -240,8 +233,7 @@ suite('DatabaseSync() constructor', () => { |
240 | 233 |
|
241 | 234 | test('throws if bare named parameters are used when option is false', (t) => { |
242 | 235 | const dbPath = nextDb(); |
243 | | - const db = new DatabaseSync(dbPath, { allowBareNamedParameters: false }); |
244 | | - t.after(() => { db.close(); }); |
| 236 | + using db = new DatabaseSync(dbPath, { allowBareNamedParameters: false }); |
245 | 237 | const setup = db.exec( |
246 | 238 | 'CREATE TABLE data(key INTEGER PRIMARY KEY, val INTEGER) STRICT;' |
247 | 239 | ); |
@@ -267,8 +259,7 @@ suite('DatabaseSync() constructor', () => { |
267 | 259 |
|
268 | 260 | test('allows unknown named parameters', (t) => { |
269 | 261 | const dbPath = nextDb(); |
270 | | - const db = new DatabaseSync(dbPath, { allowUnknownNamedParameters: true }); |
271 | | - t.after(() => { db.close(); }); |
| 262 | + using db = new DatabaseSync(dbPath, { allowUnknownNamedParameters: true }); |
272 | 263 | const setup = db.exec( |
273 | 264 | 'CREATE TABLE data(key INTEGER, val INTEGER) STRICT;' |
274 | 265 | ); |
@@ -284,8 +275,7 @@ suite('DatabaseSync() constructor', () => { |
284 | 275 |
|
285 | 276 | test('has sqlite-type symbol property', (t) => { |
286 | 277 | const dbPath = nextDb(); |
287 | | - const db = new DatabaseSync(dbPath); |
288 | | - t.after(() => { db.close(); }); |
| 278 | + using db = new DatabaseSync(dbPath); |
289 | 279 |
|
290 | 280 | const sqliteTypeSymbol = Symbol.for('sqlite-type'); |
291 | 281 | t.assert.strictEqual(db[sqliteTypeSymbol], 'node:sqlite'); |
@@ -295,8 +285,7 @@ suite('DatabaseSync() constructor', () => { |
295 | 285 | suite('DatabaseSync.prototype.open()', () => { |
296 | 286 | test('opens a database connection', (t) => { |
297 | 287 | const dbPath = nextDb(); |
298 | | - const db = new DatabaseSync(dbPath, { open: false }); |
299 | | - t.after(() => { db.close(); }); |
| 288 | + using db = new DatabaseSync(dbPath, { open: false }); |
300 | 289 |
|
301 | 290 | t.assert.strictEqual(db.isOpen, false); |
302 | 291 | t.assert.strictEqual(existsSync(dbPath), false); |
@@ -306,8 +295,7 @@ suite('DatabaseSync.prototype.open()', () => { |
306 | 295 | }); |
307 | 296 |
|
308 | 297 | test('throws if database is already open', (t) => { |
309 | | - const db = new DatabaseSync(nextDb(), { open: false }); |
310 | | - t.after(() => { db.close(); }); |
| 298 | + using db = new DatabaseSync(nextDb(), { open: false }); |
311 | 299 |
|
312 | 300 | t.assert.strictEqual(db.isOpen, false); |
313 | 301 | db.open(); |
@@ -324,15 +312,15 @@ suite('DatabaseSync.prototype.open()', () => { |
324 | 312 |
|
325 | 313 | suite('DatabaseSync.prototype.close()', () => { |
326 | 314 | test('closes an open database connection', (t) => { |
327 | | - const db = new DatabaseSync(nextDb()); |
| 315 | + using db = new DatabaseSync(nextDb()); |
328 | 316 |
|
329 | 317 | t.assert.strictEqual(db.isOpen, true); |
330 | 318 | t.assert.strictEqual(db.close(), undefined); |
331 | 319 | t.assert.strictEqual(db.isOpen, false); |
332 | 320 | }); |
333 | 321 |
|
334 | 322 | test('throws if database is not open', (t) => { |
335 | | - const db = new DatabaseSync(nextDb(), { open: false }); |
| 323 | + using db = new DatabaseSync(nextDb(), { open: false }); |
336 | 324 |
|
337 | 325 | t.assert.strictEqual(db.isOpen, false); |
338 | 326 | t.assert.throws(() => { |
@@ -347,14 +335,13 @@ suite('DatabaseSync.prototype.close()', () => { |
347 | 335 |
|
348 | 336 | suite('DatabaseSync.prototype.prepare()', () => { |
349 | 337 | test('returns a prepared statement', (t) => { |
350 | | - const db = new DatabaseSync(nextDb()); |
351 | | - t.after(() => { db.close(); }); |
| 338 | + using db = new DatabaseSync(nextDb()); |
352 | 339 | const stmt = db.prepare('CREATE TABLE webstorage(key TEXT)'); |
353 | 340 | t.assert.ok(stmt instanceof StatementSync); |
354 | 341 | }); |
355 | 342 |
|
356 | 343 | test('throws if database is not open', (t) => { |
357 | | - const db = new DatabaseSync(nextDb(), { open: false }); |
| 344 | + using db = new DatabaseSync(nextDb(), { open: false }); |
358 | 345 |
|
359 | 346 | t.assert.throws(() => { |
360 | 347 | db.prepare(); |
@@ -365,8 +352,7 @@ suite('DatabaseSync.prototype.prepare()', () => { |
365 | 352 | }); |
366 | 353 |
|
367 | 354 | test('throws if sql is not a string', (t) => { |
368 | | - const db = new DatabaseSync(nextDb()); |
369 | | - t.after(() => { db.close(); }); |
| 355 | + using db = new DatabaseSync(nextDb()); |
370 | 356 |
|
371 | 357 | t.assert.throws(() => { |
372 | 358 | db.prepare(); |
@@ -379,8 +365,7 @@ suite('DatabaseSync.prototype.prepare()', () => { |
379 | 365 |
|
380 | 366 | suite('DatabaseSync.prototype.exec()', () => { |
381 | 367 | test('executes SQL', (t) => { |
382 | | - const db = new DatabaseSync(nextDb()); |
383 | | - t.after(() => { db.close(); }); |
| 368 | + using db = new DatabaseSync(nextDb()); |
384 | 369 | const result = db.exec(` |
385 | 370 | CREATE TABLE data( |
386 | 371 | key INTEGER PRIMARY KEY, |
@@ -398,8 +383,7 @@ suite('DatabaseSync.prototype.exec()', () => { |
398 | 383 | }); |
399 | 384 |
|
400 | 385 | test('reports errors from SQLite', (t) => { |
401 | | - const db = new DatabaseSync(nextDb()); |
402 | | - t.after(() => { db.close(); }); |
| 386 | + using db = new DatabaseSync(nextDb()); |
403 | 387 |
|
404 | 388 | t.assert.throws(() => { |
405 | 389 | db.exec('CREATE TABLEEEE'); |
@@ -419,7 +403,7 @@ suite('DatabaseSync.prototype.exec()', () => { |
419 | 403 | }); |
420 | 404 |
|
421 | 405 | test('throws if database is not open', (t) => { |
422 | | - const db = new DatabaseSync(nextDb(), { open: false }); |
| 406 | + using db = new DatabaseSync(nextDb(), { open: false }); |
423 | 407 |
|
424 | 408 | t.assert.throws(() => { |
425 | 409 | db.exec(); |
@@ -430,8 +414,7 @@ suite('DatabaseSync.prototype.exec()', () => { |
430 | 414 | }); |
431 | 415 |
|
432 | 416 | test('throws if sql is not a string', (t) => { |
433 | | - const db = new DatabaseSync(nextDb()); |
434 | | - t.after(() => { db.close(); }); |
| 417 | + using db = new DatabaseSync(nextDb()); |
435 | 418 |
|
436 | 419 | t.assert.throws(() => { |
437 | 420 | db.exec(); |
@@ -444,7 +427,7 @@ suite('DatabaseSync.prototype.exec()', () => { |
444 | 427 |
|
445 | 428 | suite('DatabaseSync.prototype.isTransaction', () => { |
446 | 429 | test('correctly detects a committed transaction', (t) => { |
447 | | - const db = new DatabaseSync(':memory:'); |
| 430 | + using db = new DatabaseSync(':memory:'); |
448 | 431 |
|
449 | 432 | t.assert.strictEqual(db.isTransaction, false); |
450 | 433 | db.exec('BEGIN'); |
@@ -456,7 +439,7 @@ suite('DatabaseSync.prototype.isTransaction', () => { |
456 | 439 | }); |
457 | 440 |
|
458 | 441 | test('correctly detects a rolled back transaction', (t) => { |
459 | | - const db = new DatabaseSync(':memory:'); |
| 442 | + using db = new DatabaseSync(':memory:'); |
460 | 443 |
|
461 | 444 | t.assert.strictEqual(db.isTransaction, false); |
462 | 445 | db.exec('BEGIN'); |
@@ -468,7 +451,7 @@ suite('DatabaseSync.prototype.isTransaction', () => { |
468 | 451 | }); |
469 | 452 |
|
470 | 453 | test('throws if database is not open', (t) => { |
471 | | - const db = new DatabaseSync(nextDb(), { open: false }); |
| 454 | + using db = new DatabaseSync(nextDb(), { open: false }); |
472 | 455 |
|
473 | 456 | t.assert.throws(() => { |
474 | 457 | return db.isTransaction; |
@@ -481,7 +464,7 @@ suite('DatabaseSync.prototype.isTransaction', () => { |
481 | 464 |
|
482 | 465 | suite('DatabaseSync.prototype.location()', () => { |
483 | 466 | test('throws if database is not open', (t) => { |
484 | | - const db = new DatabaseSync(nextDb(), { open: false }); |
| 467 | + using db = new DatabaseSync(nextDb(), { open: false }); |
485 | 468 |
|
486 | 469 | t.assert.throws(() => { |
487 | 470 | db.location(); |
@@ -492,8 +475,7 @@ suite('DatabaseSync.prototype.location()', () => { |
492 | 475 | }); |
493 | 476 |
|
494 | 477 | test('throws if provided dbName is not string', (t) => { |
495 | | - const db = new DatabaseSync(nextDb()); |
496 | | - t.after(() => { db.close(); }); |
| 478 | + using db = new DatabaseSync(nextDb()); |
497 | 479 |
|
498 | 480 | t.assert.throws(() => { |
499 | 481 | db.location(null); |
@@ -504,24 +486,20 @@ suite('DatabaseSync.prototype.location()', () => { |
504 | 486 | }); |
505 | 487 |
|
506 | 488 | test('returns null when connected to in-memory database', (t) => { |
507 | | - const db = new DatabaseSync(':memory:'); |
| 489 | + using db = new DatabaseSync(':memory:'); |
508 | 490 | t.assert.strictEqual(db.location(), null); |
509 | 491 | }); |
510 | 492 |
|
511 | 493 | test('returns db path when connected to a persistent database', (t) => { |
512 | 494 | const dbPath = nextDb(); |
513 | | - const db = new DatabaseSync(dbPath); |
514 | | - t.after(() => { db.close(); }); |
| 495 | + using db = new DatabaseSync(dbPath); |
515 | 496 | t.assert.strictEqual(db.location(), dbPath); |
516 | 497 | }); |
517 | 498 |
|
518 | 499 | test('returns that specific db path when attached', (t) => { |
519 | 500 | const dbPath = nextDb(); |
520 | 501 | const otherPath = nextDb(); |
521 | | - const db = new DatabaseSync(dbPath); |
522 | | - t.after(() => { db.close(); }); |
523 | | - const other = new DatabaseSync(dbPath); |
524 | | - t.after(() => { other.close(); }); |
| 502 | + using db = new DatabaseSync(dbPath); |
525 | 503 |
|
526 | 504 | // Adding this escape because the test with unusual chars have a single quote which breaks the query |
527 | 505 | const escapedPath = otherPath.replace("'", "''"); |
@@ -530,3 +508,18 @@ suite('DatabaseSync.prototype.location()', () => { |
530 | 508 | t.assert.strictEqual(db.location('other'), otherPath); |
531 | 509 | }); |
532 | 510 | }); |
| 511 | + |
| 512 | +suite('DatabaseSync.prototype[Symbol.dispose]', () => { |
| 513 | + test('closes an open database', (t) => { |
| 514 | + const db = new DatabaseSync(nextDb()); |
| 515 | + t.assert.strictEqual(db.isOpen, true); |
| 516 | + db[Symbol.dispose](); |
| 517 | + t.assert.strictEqual(db.isOpen, false); |
| 518 | + }); |
| 519 | + |
| 520 | + test('does not throw on databases that are not open', (t) => { |
| 521 | + const db = new DatabaseSync(nextDb(), { open: false }); |
| 522 | + t.assert.strictEqual(db.isOpen, false); |
| 523 | + db[Symbol.dispose](); |
| 524 | + }); |
| 525 | +}); |