@geekmidas/testkit 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +162 -13
- package/dist/{Factory-BZ8uMoXl.d.cts → Factory-D7oHtI2D.d.cts} +2 -2
- package/dist/Factory.d.cts +2 -2
- package/dist/{KyselyFactory-BFygzOlO.d.cts → KyselyFactory-dYdviox2.d.cts} +3 -3
- package/dist/KyselyFactory.d.cts +3 -3
- package/dist/{ObjectionFactory-CeSIN3kZ.d.cts → ObjectionFactory-0gUdx8bB.d.cts} +3 -3
- package/dist/ObjectionFactory.d.cts +3 -3
- package/dist/{VitestKyselyTransactionIsolator-XDL3ngs_.mjs → VitestKyselyTransactionIsolator-CNURW8y6.mjs} +2 -2
- package/dist/{VitestKyselyTransactionIsolator-XDL3ngs_.mjs.map → VitestKyselyTransactionIsolator-CNURW8y6.mjs.map} +1 -1
- package/dist/{VitestKyselyTransactionIsolator-DnyZMaA-.d.mts → VitestKyselyTransactionIsolator-D3EZZhjZ.d.cts} +2 -2
- package/dist/{VitestKyselyTransactionIsolator-4HOeLQ0d.d.cts → VitestKyselyTransactionIsolator-Dxlp1u0f.d.mts} +2 -2
- package/dist/{VitestKyselyTransactionIsolator-DX_VPKS-.cjs → VitestKyselyTransactionIsolator-EvDLk5zg.cjs} +2 -2
- package/dist/{VitestKyselyTransactionIsolator-DX_VPKS-.cjs.map → VitestKyselyTransactionIsolator-EvDLk5zg.cjs.map} +1 -1
- package/dist/VitestKyselyTransactionIsolator.cjs +2 -2
- package/dist/VitestKyselyTransactionIsolator.d.cts +2 -2
- package/dist/VitestKyselyTransactionIsolator.d.mts +2 -2
- package/dist/VitestKyselyTransactionIsolator.mjs +2 -2
- package/dist/{VitestObjectionTransactionIsolator-COVDlpEo.d.cts → VitestObjectionTransactionIsolator-1TpsPqfG.d.cts} +2 -2
- package/dist/{VitestObjectionTransactionIsolator-D_tlOtq8.cjs → VitestObjectionTransactionIsolator-CM5KTAFA.cjs} +2 -2
- package/dist/{VitestObjectionTransactionIsolator-D_tlOtq8.cjs.map → VitestObjectionTransactionIsolator-CM5KTAFA.cjs.map} +1 -1
- package/dist/{VitestObjectionTransactionIsolator-lZUSz1w0.d.mts → VitestObjectionTransactionIsolator-i9jIgU8Q.d.mts} +2 -2
- package/dist/{VitestObjectionTransactionIsolator-_EhJKu_O.mjs → VitestObjectionTransactionIsolator-jQFaCz0u.mjs} +2 -2
- package/dist/{VitestObjectionTransactionIsolator-_EhJKu_O.mjs.map → VitestObjectionTransactionIsolator-jQFaCz0u.mjs.map} +1 -1
- package/dist/VitestObjectionTransactionIsolator.cjs +2 -2
- package/dist/VitestObjectionTransactionIsolator.d.cts +2 -2
- package/dist/VitestObjectionTransactionIsolator.d.mts +2 -2
- package/dist/VitestObjectionTransactionIsolator.mjs +2 -2
- package/dist/{VitestTransactionIsolator-DWDbnITQ.d.mts → VitestTransactionIsolator-BvR19bYn.d.mts} +44 -18
- package/dist/{VitestTransactionIsolator-BKIrj3Uy.cjs → VitestTransactionIsolator-CMfJXZP8.cjs} +52 -36
- package/dist/VitestTransactionIsolator-CMfJXZP8.cjs.map +1 -0
- package/dist/{VitestTransactionIsolator-CyG_i_Nj.d.cts → VitestTransactionIsolator-CwQaxZLP.d.cts} +44 -18
- package/dist/{VitestTransactionIsolator-BIaMs4c2.mjs → VitestTransactionIsolator-DQ7tLqgV.mjs} +52 -36
- package/dist/VitestTransactionIsolator-DQ7tLqgV.mjs.map +1 -0
- package/dist/VitestTransactionIsolator.cjs +1 -1
- package/dist/VitestTransactionIsolator.d.cts +2 -2
- package/dist/VitestTransactionIsolator.d.mts +2 -2
- package/dist/VitestTransactionIsolator.mjs +1 -1
- package/dist/better-auth.d.cts +2 -2
- package/dist/{directory-DlkPEzL4.d.cts → directory-BUcnztHI.d.cts} +3 -3
- package/dist/{faker-Cg76aFNO.d.cts → faker-Dg3trU4a.d.cts} +3 -3
- package/dist/faker.d.cts +1 -1
- package/dist/kysely.cjs +23 -29
- package/dist/kysely.cjs.map +1 -1
- package/dist/kysely.d.cts +40 -38
- package/dist/kysely.d.mts +37 -35
- package/dist/kysely.mjs +23 -29
- package/dist/kysely.mjs.map +1 -1
- package/dist/objection.cjs +23 -47
- package/dist/objection.cjs.map +1 -1
- package/dist/objection.d.cts +40 -56
- package/dist/objection.d.mts +37 -53
- package/dist/objection.mjs +23 -47
- package/dist/objection.mjs.map +1 -1
- package/dist/os/directory.d.cts +1 -1
- package/dist/os/index.d.cts +1 -1
- package/package.json +1 -1
- package/src/VitestTransactionIsolator.ts +98 -31
- package/src/__tests__/KyselyFactory.spec.ts +4 -5
- package/src/__tests__/ObjectionFactory.spec.ts +4 -5
- package/src/__tests__/VitestObjectionTransactionIsolator.spec.ts +6 -3
- package/src/__tests__/integration.spec.ts +8 -10
- package/src/kysely.ts +49 -34
- package/src/objection.ts +47 -52
- package/dist/VitestTransactionIsolator-BIaMs4c2.mjs.map +0 -1
- package/dist/VitestTransactionIsolator-BKIrj3Uy.cjs.map +0 -1
package/README.md
CHANGED
|
@@ -33,8 +33,21 @@ yarn add -D @geekmidas/testkit
|
|
|
33
33
|
## Subpath Exports
|
|
34
34
|
|
|
35
35
|
```typescript
|
|
36
|
-
|
|
37
|
-
import {
|
|
36
|
+
// Kysely utilities
|
|
37
|
+
import {
|
|
38
|
+
KyselyFactory,
|
|
39
|
+
wrapVitestKyselyTransaction,
|
|
40
|
+
extendWithFixtures,
|
|
41
|
+
} from '@geekmidas/testkit/kysely';
|
|
42
|
+
|
|
43
|
+
// Objection.js utilities
|
|
44
|
+
import {
|
|
45
|
+
ObjectionFactory,
|
|
46
|
+
wrapVitestObjectionTransaction,
|
|
47
|
+
extendWithFixtures,
|
|
48
|
+
} from '@geekmidas/testkit/objection';
|
|
49
|
+
|
|
50
|
+
// Other utilities
|
|
38
51
|
import { faker } from '@geekmidas/testkit/faker';
|
|
39
52
|
import { waitFor } from '@geekmidas/testkit/timer';
|
|
40
53
|
import { itWithDir } from '@geekmidas/testkit/os';
|
|
@@ -71,7 +84,7 @@ interface Database {
|
|
|
71
84
|
const builders = {
|
|
72
85
|
user: KyselyFactory.createBuilder<Database, 'users'>(
|
|
73
86
|
'users',
|
|
74
|
-
(attrs,
|
|
87
|
+
({ attrs, faker }) => ({
|
|
75
88
|
id: faker.string.uuid(),
|
|
76
89
|
name: faker.person.fullName(),
|
|
77
90
|
email: faker.internet.email(),
|
|
@@ -81,7 +94,7 @@ const builders = {
|
|
|
81
94
|
),
|
|
82
95
|
post: KyselyFactory.createBuilder<Database, 'posts'>(
|
|
83
96
|
'posts',
|
|
84
|
-
(attrs,
|
|
97
|
+
({ attrs, faker }) => ({
|
|
85
98
|
id: faker.string.uuid(),
|
|
86
99
|
title: 'Test Post',
|
|
87
100
|
content: faker.lorem.paragraph(),
|
|
@@ -127,7 +140,7 @@ class User extends Model {
|
|
|
127
140
|
const builders = {
|
|
128
141
|
user: ObjectionFactory.createBuilder(
|
|
129
142
|
User,
|
|
130
|
-
(attrs,
|
|
143
|
+
({ attrs, faker }) => ({
|
|
131
144
|
id: faker.string.uuid(),
|
|
132
145
|
name: faker.person.fullName(),
|
|
133
146
|
email: faker.internet.email(),
|
|
@@ -337,9 +350,145 @@ afterAll(async () => {
|
|
|
337
350
|
});
|
|
338
351
|
```
|
|
339
352
|
|
|
340
|
-
## Transaction Isolation
|
|
353
|
+
## Vitest Transaction Isolation
|
|
354
|
+
|
|
355
|
+
TestKit provides Vitest-specific helpers for automatic transaction isolation. Each test runs in a transaction that is automatically rolled back after the test completes.
|
|
356
|
+
|
|
357
|
+
### Basic Usage
|
|
358
|
+
|
|
359
|
+
```typescript
|
|
360
|
+
import { test } from 'vitest';
|
|
361
|
+
import { wrapVitestKyselyTransaction } from '@geekmidas/testkit/kysely';
|
|
362
|
+
import { db } from './database';
|
|
363
|
+
|
|
364
|
+
// Wrap Vitest's test function with transaction support
|
|
365
|
+
const it = wrapVitestKyselyTransaction<Database>(
|
|
366
|
+
test,
|
|
367
|
+
() => db,
|
|
368
|
+
async (trx) => {
|
|
369
|
+
// Optional: Set up test tables or seed data
|
|
370
|
+
await trx.schema.createTable('users').execute();
|
|
371
|
+
}
|
|
372
|
+
);
|
|
373
|
+
|
|
374
|
+
// Each test gets its own transaction
|
|
375
|
+
it('should create user', async ({ trx }) => {
|
|
376
|
+
const user = await trx
|
|
377
|
+
.insertInto('users')
|
|
378
|
+
.values({ name: 'John' })
|
|
379
|
+
.returningAll()
|
|
380
|
+
.executeTakeFirst();
|
|
381
|
+
|
|
382
|
+
expect(user.name).toBe('John');
|
|
383
|
+
// Transaction is automatically rolled back after test
|
|
384
|
+
});
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
### Extending with Fixtures
|
|
388
|
+
|
|
389
|
+
Use `extendWithFixtures` to add factory and other fixtures to your tests:
|
|
390
|
+
|
|
391
|
+
```typescript
|
|
392
|
+
import { test } from 'vitest';
|
|
393
|
+
import {
|
|
394
|
+
wrapVitestKyselyTransaction,
|
|
395
|
+
extendWithFixtures,
|
|
396
|
+
KyselyFactory,
|
|
397
|
+
} from '@geekmidas/testkit/kysely';
|
|
398
|
+
|
|
399
|
+
// Define builders
|
|
400
|
+
const builders = {
|
|
401
|
+
user: KyselyFactory.createBuilder<Database, 'users'>('users', ({ faker }) => ({
|
|
402
|
+
name: faker.person.fullName(),
|
|
403
|
+
email: faker.internet.email(),
|
|
404
|
+
})),
|
|
405
|
+
post: KyselyFactory.createBuilder<Database, 'posts'>('posts', ({ faker }) => ({
|
|
406
|
+
title: faker.lorem.sentence(),
|
|
407
|
+
content: faker.lorem.paragraphs(),
|
|
408
|
+
})),
|
|
409
|
+
};
|
|
410
|
+
|
|
411
|
+
// Create base test with transaction
|
|
412
|
+
const baseTest = wrapVitestKyselyTransaction<Database>(test, () => db);
|
|
413
|
+
|
|
414
|
+
// Extend with factory fixture
|
|
415
|
+
const it = extendWithFixtures<
|
|
416
|
+
Database,
|
|
417
|
+
{ factory: KyselyFactory<Database, typeof builders, {}> }
|
|
418
|
+
>(baseTest, {
|
|
419
|
+
factory: (trx) => new KyselyFactory(builders, {}, trx),
|
|
420
|
+
});
|
|
421
|
+
|
|
422
|
+
// Both trx and factory are available in tests
|
|
423
|
+
it('should create user with factory', async ({ trx, factory }) => {
|
|
424
|
+
const user = await factory.insert('user', { name: 'Jane' });
|
|
425
|
+
|
|
426
|
+
expect(user.id).toBeDefined();
|
|
427
|
+
expect(user.name).toBe('Jane');
|
|
428
|
+
|
|
429
|
+
// Verify in database
|
|
430
|
+
const found = await trx
|
|
431
|
+
.selectFrom('users')
|
|
432
|
+
.where('id', '=', user.id)
|
|
433
|
+
.selectAll()
|
|
434
|
+
.executeTakeFirst();
|
|
435
|
+
|
|
436
|
+
expect(found?.name).toBe('Jane');
|
|
437
|
+
});
|
|
438
|
+
|
|
439
|
+
it('should create related records', async ({ factory }) => {
|
|
440
|
+
const user = await factory.insert('user');
|
|
441
|
+
const posts = await factory.insertMany(3, 'post', { userId: user.id });
|
|
442
|
+
|
|
443
|
+
expect(posts).toHaveLength(3);
|
|
444
|
+
expect(posts[0].userId).toBe(user.id);
|
|
445
|
+
});
|
|
446
|
+
```
|
|
447
|
+
|
|
448
|
+
### Multiple Fixtures
|
|
449
|
+
|
|
450
|
+
You can add multiple fixtures that all receive the transaction:
|
|
451
|
+
|
|
452
|
+
```typescript
|
|
453
|
+
const it = extendWithFixtures<
|
|
454
|
+
Database,
|
|
455
|
+
{
|
|
456
|
+
factory: KyselyFactory<Database, typeof builders, {}>;
|
|
457
|
+
userRepo: UserRepository;
|
|
458
|
+
config: { maxUsers: number };
|
|
459
|
+
}
|
|
460
|
+
>(baseTest, {
|
|
461
|
+
factory: (trx) => new KyselyFactory(builders, {}, trx),
|
|
462
|
+
userRepo: (trx) => new UserRepository(trx),
|
|
463
|
+
config: () => ({ maxUsers: 100 }), // Fixtures can ignore trx if not needed
|
|
464
|
+
});
|
|
465
|
+
|
|
466
|
+
it('should use multiple fixtures', async ({ factory, userRepo, config }) => {
|
|
467
|
+
const user = await factory.insert('user');
|
|
468
|
+
const found = await userRepo.findById(user.id);
|
|
469
|
+
expect(found).toBeDefined();
|
|
470
|
+
expect(config.maxUsers).toBe(100);
|
|
471
|
+
});
|
|
472
|
+
```
|
|
473
|
+
|
|
474
|
+
### With Objection.js
|
|
475
|
+
|
|
476
|
+
```typescript
|
|
477
|
+
import { wrapVitestObjectionTransaction, extendWithFixtures } from '@geekmidas/testkit/objection';
|
|
478
|
+
|
|
479
|
+
const baseTest = wrapVitestObjectionTransaction(test, () => knex);
|
|
480
|
+
|
|
481
|
+
const it = extendWithFixtures<{ factory: ObjectionFactory<typeof builders, {}> }>(
|
|
482
|
+
baseTest,
|
|
483
|
+
{
|
|
484
|
+
factory: (trx) => new ObjectionFactory(builders, {}, trx),
|
|
485
|
+
}
|
|
486
|
+
);
|
|
487
|
+
```
|
|
488
|
+
|
|
489
|
+
## Manual Transaction Isolation
|
|
341
490
|
|
|
342
|
-
|
|
491
|
+
For more control, you can manage transactions manually:
|
|
343
492
|
|
|
344
493
|
```typescript
|
|
345
494
|
describe('User Service', () => {
|
|
@@ -402,12 +551,12 @@ class KyselyFactory<DB, Builders, Seeds> {
|
|
|
402
551
|
|
|
403
552
|
static createBuilder<DB, TableName extends keyof DB & string>(
|
|
404
553
|
table: TableName,
|
|
405
|
-
|
|
406
|
-
attrs: Partial<Insertable<DB[TableName]
|
|
407
|
-
factory: KyselyFactory
|
|
408
|
-
db: Kysely<DB
|
|
409
|
-
faker: FakerFactory
|
|
410
|
-
) => Partial<Insertable<DB[TableName]>> | Promise<...>,
|
|
554
|
+
defaults?: (context: {
|
|
555
|
+
attrs: Partial<Insertable<DB[TableName]>>;
|
|
556
|
+
factory: KyselyFactory;
|
|
557
|
+
db: Kysely<DB>;
|
|
558
|
+
faker: FakerFactory;
|
|
559
|
+
}) => Partial<Insertable<DB[TableName]>> | Promise<...>,
|
|
411
560
|
autoInsert?: boolean
|
|
412
561
|
): BuilderFunction;
|
|
413
562
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { FakerFactory } from "./faker-
|
|
1
|
+
import { FakerFactory } from "./faker-Dg3trU4a.cjs";
|
|
2
2
|
|
|
3
3
|
//#region src/Factory.d.ts
|
|
4
4
|
|
|
@@ -129,4 +129,4 @@ type MixedFactoryBuilder<Attrs = any, Factory = any, Result = any, DB = any> = (
|
|
|
129
129
|
type FactorySeed<Attrs = any, Factory = any, Result = any, DB = any> = (attrs: Attrs, factory: Factory, db: DB) => Promise<Result>;
|
|
130
130
|
//#endregion
|
|
131
131
|
export { Factory, FactorySeed, MixedFactoryBuilder };
|
|
132
|
-
//# sourceMappingURL=Factory-
|
|
132
|
+
//# sourceMappingURL=Factory-D7oHtI2D.d.cts.map
|
package/dist/Factory.d.cts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import "./faker-
|
|
2
|
-
import { Factory, FactorySeed, MixedFactoryBuilder } from "./Factory-
|
|
1
|
+
import "./faker-Dg3trU4a.cjs";
|
|
2
|
+
import { Factory, FactorySeed, MixedFactoryBuilder } from "./Factory-D7oHtI2D.cjs";
|
|
3
3
|
export { Factory, FactorySeed, MixedFactoryBuilder };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { FakerFactory } from "./faker-
|
|
2
|
-
import { Factory, FactorySeed } from "./Factory-
|
|
1
|
+
import { FakerFactory } from "./faker-Dg3trU4a.cjs";
|
|
2
|
+
import { Factory, FactorySeed } from "./Factory-D7oHtI2D.cjs";
|
|
3
3
|
import { ControlledTransaction, Insertable, Kysely, Selectable } from "kysely";
|
|
4
4
|
|
|
5
5
|
//#region src/KyselyFactory.d.ts
|
|
@@ -211,4 +211,4 @@ declare class KyselyFactory<DB, Builders extends Record<string, any>, Seeds exte
|
|
|
211
211
|
}
|
|
212
212
|
//#endregion
|
|
213
213
|
export { KyselyFactory };
|
|
214
|
-
//# sourceMappingURL=KyselyFactory-
|
|
214
|
+
//# sourceMappingURL=KyselyFactory-dYdviox2.d.cts.map
|
package/dist/KyselyFactory.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import "./faker-
|
|
2
|
-
import "./Factory-
|
|
3
|
-
import { KyselyFactory } from "./KyselyFactory-
|
|
1
|
+
import "./faker-Dg3trU4a.cjs";
|
|
2
|
+
import "./Factory-D7oHtI2D.cjs";
|
|
3
|
+
import { KyselyFactory } from "./KyselyFactory-dYdviox2.cjs";
|
|
4
4
|
export { KyselyFactory };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { FakerFactory } from "./faker-
|
|
2
|
-
import { Factory, FactorySeed } from "./Factory-
|
|
1
|
+
import { FakerFactory } from "./faker-Dg3trU4a.cjs";
|
|
2
|
+
import { Factory, FactorySeed } from "./Factory-D7oHtI2D.cjs";
|
|
3
3
|
import { Knex } from "knex";
|
|
4
4
|
import { Model } from "objection";
|
|
5
5
|
|
|
@@ -224,4 +224,4 @@ declare class ObjectionFactory<Builders extends Record<string, any>, Seeds exten
|
|
|
224
224
|
}
|
|
225
225
|
//#endregion
|
|
226
226
|
export { ObjectionFactory };
|
|
227
|
-
//# sourceMappingURL=ObjectionFactory-
|
|
227
|
+
//# sourceMappingURL=ObjectionFactory-0gUdx8bB.d.cts.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import "./faker-
|
|
2
|
-
import "./Factory-
|
|
3
|
-
import { ObjectionFactory } from "./ObjectionFactory-
|
|
1
|
+
import "./faker-Dg3trU4a.cjs";
|
|
2
|
+
import "./Factory-D7oHtI2D.cjs";
|
|
3
|
+
import { ObjectionFactory } from "./ObjectionFactory-0gUdx8bB.cjs";
|
|
4
4
|
export { ObjectionFactory };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { VitestPostgresTransactionIsolator } from "./VitestTransactionIsolator-
|
|
1
|
+
import { VitestPostgresTransactionIsolator } from "./VitestTransactionIsolator-DQ7tLqgV.mjs";
|
|
2
2
|
|
|
3
3
|
//#region src/VitestKyselyTransactionIsolator.ts
|
|
4
4
|
/**
|
|
@@ -57,4 +57,4 @@ var VitestKyselyTransactionIsolator = class extends VitestPostgresTransactionIso
|
|
|
57
57
|
|
|
58
58
|
//#endregion
|
|
59
59
|
export { VitestKyselyTransactionIsolator };
|
|
60
|
-
//# sourceMappingURL=VitestKyselyTransactionIsolator-
|
|
60
|
+
//# sourceMappingURL=VitestKyselyTransactionIsolator-CNURW8y6.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VitestKyselyTransactionIsolator-
|
|
1
|
+
{"version":3,"file":"VitestKyselyTransactionIsolator-CNURW8y6.mjs","names":["conn: Kysely<Database>","level: IsolationLevel","fn: (trx: Transaction<Database>) => Promise<void>"],"sources":["../src/VitestKyselyTransactionIsolator.ts"],"sourcesContent":["import type { Kysely, Transaction } from 'kysely';\nimport {\n type IsolationLevel,\n VitestPostgresTransactionIsolator,\n} from './VitestTransactionIsolator';\n\n/**\n * Kysely-specific implementation of the Vitest transaction isolator.\n * Provides automatic transaction rollback for test isolation using Kysely's transaction API.\n * Each test runs within a database transaction that is rolled back after completion,\n * ensuring a clean state between tests without the overhead of recreating data.\n *\n * @template Database - The database schema type\n *\n * @example\n * ```typescript\n * import { VitestKyselyTransactionIsolator } from '@geekmidas/testkit';\n * import { db } from './database';\n *\n * // Create isolator instance\n * const isolator = new VitestKyselyTransactionIsolator<Database>();\n *\n * // In your test setup\n * beforeEach(async () => {\n * await isolator.start(db);\n * });\n *\n * afterEach(async () => {\n * await isolator.rollback();\n * });\n *\n * // Tests run in isolated transactions\n * it('should create user', async () => {\n * const user = await db.insertInto('users')\n * .values({ name: 'Test User' })\n * .returningAll()\n * .executeTakeFirst();\n *\n * expect(user).toBeDefined();\n * // This data will be rolled back after the test\n * });\n * ```\n */\nexport class VitestKyselyTransactionIsolator<\n Database,\n> extends VitestPostgresTransactionIsolator<\n Kysely<Database>,\n Transaction<Database>\n> {\n async destroy(conn: Kysely<Database>): Promise<void> {\n // return conn.destroy();\n }\n /**\n * Creates a Kysely transaction with the specified isolation level.\n * Implements the abstract transact method from VitestPostgresTransactionIsolator.\n *\n * @param conn - The Kysely database connection\n * @param level - The transaction isolation level\n * @param fn - The function to execute within the transaction\n * @returns Promise that resolves when the transaction completes\n */\n async transact(\n conn: Kysely<Database>,\n level: IsolationLevel,\n fn: (trx: Transaction<Database>) => Promise<void>,\n ): Promise<void> {\n const isolationLevel =\n level.toLocaleLowerCase() as Lowercase<IsolationLevel>;\n await conn.transaction().setIsolationLevel(isolationLevel).execute(fn);\n }\n // Implement any Kysely-specific transaction logic here\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2CA,IAAa,kCAAb,cAEU,kCAGR;CACA,MAAM,QAAQA,MAAuC,CAEpD;;;;;;;;;;CAUD,MAAM,SACJA,MACAC,OACAC,IACe;EACf,MAAM,iBACJ,MAAM,mBAAmB;AAC3B,QAAM,KAAK,aAAa,CAAC,kBAAkB,eAAe,CAAC,QAAQ,GAAG;CACvE;AAEF"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { IsolationLevel, VitestPostgresTransactionIsolator } from "./VitestTransactionIsolator-
|
|
1
|
+
import { IsolationLevel, VitestPostgresTransactionIsolator } from "./VitestTransactionIsolator-CwQaxZLP.cjs";
|
|
2
2
|
import { Kysely, Transaction } from "kysely";
|
|
3
3
|
|
|
4
4
|
//#region src/VitestKyselyTransactionIsolator.d.ts
|
|
@@ -55,4 +55,4 @@ declare class VitestKyselyTransactionIsolator<Database> extends VitestPostgresTr
|
|
|
55
55
|
}
|
|
56
56
|
//#endregion
|
|
57
57
|
export { VitestKyselyTransactionIsolator };
|
|
58
|
-
//# sourceMappingURL=VitestKyselyTransactionIsolator-
|
|
58
|
+
//# sourceMappingURL=VitestKyselyTransactionIsolator-D3EZZhjZ.d.cts.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { IsolationLevel, VitestPostgresTransactionIsolator } from "./VitestTransactionIsolator-
|
|
1
|
+
import { IsolationLevel, VitestPostgresTransactionIsolator } from "./VitestTransactionIsolator-BvR19bYn.mjs";
|
|
2
2
|
import { Kysely, Transaction } from "kysely";
|
|
3
3
|
|
|
4
4
|
//#region src/VitestKyselyTransactionIsolator.d.ts
|
|
@@ -55,4 +55,4 @@ declare class VitestKyselyTransactionIsolator<Database> extends VitestPostgresTr
|
|
|
55
55
|
}
|
|
56
56
|
//#endregion
|
|
57
57
|
export { VitestKyselyTransactionIsolator };
|
|
58
|
-
//# sourceMappingURL=VitestKyselyTransactionIsolator-
|
|
58
|
+
//# sourceMappingURL=VitestKyselyTransactionIsolator-Dxlp1u0f.d.mts.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const require_VitestTransactionIsolator = require('./VitestTransactionIsolator-
|
|
1
|
+
const require_VitestTransactionIsolator = require('./VitestTransactionIsolator-CMfJXZP8.cjs');
|
|
2
2
|
|
|
3
3
|
//#region src/VitestKyselyTransactionIsolator.ts
|
|
4
4
|
/**
|
|
@@ -62,4 +62,4 @@ Object.defineProperty(exports, 'VitestKyselyTransactionIsolator', {
|
|
|
62
62
|
return VitestKyselyTransactionIsolator;
|
|
63
63
|
}
|
|
64
64
|
});
|
|
65
|
-
//# sourceMappingURL=VitestKyselyTransactionIsolator-
|
|
65
|
+
//# sourceMappingURL=VitestKyselyTransactionIsolator-EvDLk5zg.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VitestKyselyTransactionIsolator-
|
|
1
|
+
{"version":3,"file":"VitestKyselyTransactionIsolator-EvDLk5zg.cjs","names":["VitestPostgresTransactionIsolator","conn: Kysely<Database>","level: IsolationLevel","fn: (trx: Transaction<Database>) => Promise<void>"],"sources":["../src/VitestKyselyTransactionIsolator.ts"],"sourcesContent":["import type { Kysely, Transaction } from 'kysely';\nimport {\n type IsolationLevel,\n VitestPostgresTransactionIsolator,\n} from './VitestTransactionIsolator';\n\n/**\n * Kysely-specific implementation of the Vitest transaction isolator.\n * Provides automatic transaction rollback for test isolation using Kysely's transaction API.\n * Each test runs within a database transaction that is rolled back after completion,\n * ensuring a clean state between tests without the overhead of recreating data.\n *\n * @template Database - The database schema type\n *\n * @example\n * ```typescript\n * import { VitestKyselyTransactionIsolator } from '@geekmidas/testkit';\n * import { db } from './database';\n *\n * // Create isolator instance\n * const isolator = new VitestKyselyTransactionIsolator<Database>();\n *\n * // In your test setup\n * beforeEach(async () => {\n * await isolator.start(db);\n * });\n *\n * afterEach(async () => {\n * await isolator.rollback();\n * });\n *\n * // Tests run in isolated transactions\n * it('should create user', async () => {\n * const user = await db.insertInto('users')\n * .values({ name: 'Test User' })\n * .returningAll()\n * .executeTakeFirst();\n *\n * expect(user).toBeDefined();\n * // This data will be rolled back after the test\n * });\n * ```\n */\nexport class VitestKyselyTransactionIsolator<\n Database,\n> extends VitestPostgresTransactionIsolator<\n Kysely<Database>,\n Transaction<Database>\n> {\n async destroy(conn: Kysely<Database>): Promise<void> {\n // return conn.destroy();\n }\n /**\n * Creates a Kysely transaction with the specified isolation level.\n * Implements the abstract transact method from VitestPostgresTransactionIsolator.\n *\n * @param conn - The Kysely database connection\n * @param level - The transaction isolation level\n * @param fn - The function to execute within the transaction\n * @returns Promise that resolves when the transaction completes\n */\n async transact(\n conn: Kysely<Database>,\n level: IsolationLevel,\n fn: (trx: Transaction<Database>) => Promise<void>,\n ): Promise<void> {\n const isolationLevel =\n level.toLocaleLowerCase() as Lowercase<IsolationLevel>;\n await conn.transaction().setIsolationLevel(isolationLevel).execute(fn);\n }\n // Implement any Kysely-specific transaction logic here\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2CA,IAAa,kCAAb,cAEUA,oEAGR;CACA,MAAM,QAAQC,MAAuC,CAEpD;;;;;;;;;;CAUD,MAAM,SACJA,MACAC,OACAC,IACe;EACf,MAAM,iBACJ,MAAM,mBAAmB;AAC3B,QAAM,KAAK,aAAa,CAAC,kBAAkB,eAAe,CAAC,QAAQ,GAAG;CACvE;AAEF"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
require('./VitestTransactionIsolator-
|
|
2
|
-
const require_VitestKyselyTransactionIsolator = require('./VitestKyselyTransactionIsolator-
|
|
1
|
+
require('./VitestTransactionIsolator-CMfJXZP8.cjs');
|
|
2
|
+
const require_VitestKyselyTransactionIsolator = require('./VitestKyselyTransactionIsolator-EvDLk5zg.cjs');
|
|
3
3
|
|
|
4
4
|
exports.VitestKyselyTransactionIsolator = require_VitestKyselyTransactionIsolator.VitestKyselyTransactionIsolator;
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import "./VitestTransactionIsolator-
|
|
2
|
-
import { VitestKyselyTransactionIsolator } from "./VitestKyselyTransactionIsolator-
|
|
1
|
+
import "./VitestTransactionIsolator-CwQaxZLP.cjs";
|
|
2
|
+
import { VitestKyselyTransactionIsolator } from "./VitestKyselyTransactionIsolator-D3EZZhjZ.cjs";
|
|
3
3
|
export { VitestKyselyTransactionIsolator };
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import "./VitestTransactionIsolator-
|
|
2
|
-
import { VitestKyselyTransactionIsolator } from "./VitestKyselyTransactionIsolator-
|
|
1
|
+
import "./VitestTransactionIsolator-BvR19bYn.mjs";
|
|
2
|
+
import { VitestKyselyTransactionIsolator } from "./VitestKyselyTransactionIsolator-Dxlp1u0f.mjs";
|
|
3
3
|
export { VitestKyselyTransactionIsolator };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import "./VitestTransactionIsolator-
|
|
2
|
-
import { VitestKyselyTransactionIsolator } from "./VitestKyselyTransactionIsolator-
|
|
1
|
+
import "./VitestTransactionIsolator-DQ7tLqgV.mjs";
|
|
2
|
+
import { VitestKyselyTransactionIsolator } from "./VitestKyselyTransactionIsolator-CNURW8y6.mjs";
|
|
3
3
|
|
|
4
4
|
export { VitestKyselyTransactionIsolator };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { IsolationLevel, VitestPostgresTransactionIsolator } from "./VitestTransactionIsolator-
|
|
1
|
+
import { IsolationLevel, VitestPostgresTransactionIsolator } from "./VitestTransactionIsolator-CwQaxZLP.cjs";
|
|
2
2
|
import { Knex } from "knex";
|
|
3
3
|
|
|
4
4
|
//#region src/VitestObjectionTransactionIsolator.d.ts
|
|
@@ -56,4 +56,4 @@ declare class VitestObjectionTransactionIsolator extends VitestPostgresTransacti
|
|
|
56
56
|
}
|
|
57
57
|
//#endregion
|
|
58
58
|
export { VitestObjectionTransactionIsolator };
|
|
59
|
-
//# sourceMappingURL=VitestObjectionTransactionIsolator-
|
|
59
|
+
//# sourceMappingURL=VitestObjectionTransactionIsolator-1TpsPqfG.d.cts.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const require_VitestTransactionIsolator = require('./VitestTransactionIsolator-
|
|
1
|
+
const require_VitestTransactionIsolator = require('./VitestTransactionIsolator-CMfJXZP8.cjs');
|
|
2
2
|
|
|
3
3
|
//#region src/VitestObjectionTransactionIsolator.ts
|
|
4
4
|
/**
|
|
@@ -65,4 +65,4 @@ Object.defineProperty(exports, 'VitestObjectionTransactionIsolator', {
|
|
|
65
65
|
return VitestObjectionTransactionIsolator;
|
|
66
66
|
}
|
|
67
67
|
});
|
|
68
|
-
//# sourceMappingURL=VitestObjectionTransactionIsolator-
|
|
68
|
+
//# sourceMappingURL=VitestObjectionTransactionIsolator-CM5KTAFA.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VitestObjectionTransactionIsolator-
|
|
1
|
+
{"version":3,"file":"VitestObjectionTransactionIsolator-CM5KTAFA.cjs","names":["VitestPostgresTransactionIsolator","conn: Knex<any, any[]>","connection: Knex","level: IsolationLevel","fn: (trx: Knex.Transaction) => Promise<void>"],"sources":["../src/VitestObjectionTransactionIsolator.ts"],"sourcesContent":["import type { Knex } from 'knex';\nimport {\n type IsolationLevel,\n VitestPostgresTransactionIsolator,\n} from './VitestTransactionIsolator';\n\n/**\n * Objection.js-specific implementation of the Vitest transaction isolator.\n * Provides automatic transaction rollback for test isolation using Objection.js and Knex transaction API.\n * Each test runs within a database transaction that is rolled back after completion,\n * ensuring a clean state between tests without the overhead of recreating data.\n *\n * @example\n * ```typescript\n * import { VitestObjectionTransactionIsolator } from '@geekmidas/testkit';\n * import { knex } from './database';\n * import { User } from './models';\n * import { test } from 'vitest';\n *\n * // Create isolator instance\n * const isolator = new VitestObjectionTransactionIsolator(test);\n *\n * // Use with wrapped test API\n * const isolatedTest = isolator.wrapVitestWithTransaction(knex);\n *\n * isolatedTest('should create user', async ({ trx }) => {\n * const user = await User.query(trx)\n * .insert({ name: 'Test User' });\n *\n * expect(user).toBeDefined();\n * // This data will be rolled back after the test\n * });\n * ```\n */\nexport class VitestObjectionTransactionIsolator extends VitestPostgresTransactionIsolator<\n Knex,\n Knex.Transaction\n> {\n async destroy(conn: Knex<any, any[]>): Promise<void> {}\n /**\n * Creates a Knex transaction with the specified isolation level.\n * Implements the abstract transact method from VitestPostgresTransactionIsolator.\n * This transaction can be used with Objection.js models via Model.query(trx).\n *\n * @param conn - The Knex database connection\n * @param level - The transaction isolation level\n * @param fn - The function to execute within the transaction\n * @returns Promise that resolves when the transaction completes\n *\n * @example\n * ```typescript\n * await isolator.transact(knex, IsolationLevel.REPEATABLE_READ, async (trx) => {\n * // Use transaction with Objection models\n * await User.query(trx).insert({ name: 'Test' });\n * await Post.query(trx).where('userId', user.id).delete();\n * });\n * ```\n */\n async transact(\n connection: Knex,\n level: IsolationLevel,\n fn: (trx: Knex.Transaction) => Promise<void>,\n ): Promise<void> {\n const isolationLevel = level.toLowerCase() as Lowercase<IsolationLevel>;\n\n await connection.transaction(\n async (trx) => {\n await fn(trx);\n },\n {\n isolationLevel,\n },\n );\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCA,IAAa,qCAAb,cAAwDA,oEAGtD;CACA,MAAM,QAAQC,MAAuC,CAAE;;;;;;;;;;;;;;;;;;;;CAoBvD,MAAM,SACJC,YACAC,OACAC,IACe;EACf,MAAM,iBAAiB,MAAM,aAAa;AAE1C,QAAM,WAAW,YACf,OAAO,QAAQ;AACb,SAAM,GAAG,IAAI;EACd,GACD,EACE,eACD,EACF;CACF;AACF"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { IsolationLevel, VitestPostgresTransactionIsolator } from "./VitestTransactionIsolator-
|
|
1
|
+
import { IsolationLevel, VitestPostgresTransactionIsolator } from "./VitestTransactionIsolator-BvR19bYn.mjs";
|
|
2
2
|
import { Knex } from "knex";
|
|
3
3
|
|
|
4
4
|
//#region src/VitestObjectionTransactionIsolator.d.ts
|
|
@@ -56,4 +56,4 @@ declare class VitestObjectionTransactionIsolator extends VitestPostgresTransacti
|
|
|
56
56
|
}
|
|
57
57
|
//#endregion
|
|
58
58
|
export { VitestObjectionTransactionIsolator };
|
|
59
|
-
//# sourceMappingURL=VitestObjectionTransactionIsolator-
|
|
59
|
+
//# sourceMappingURL=VitestObjectionTransactionIsolator-i9jIgU8Q.d.mts.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { VitestPostgresTransactionIsolator } from "./VitestTransactionIsolator-
|
|
1
|
+
import { VitestPostgresTransactionIsolator } from "./VitestTransactionIsolator-DQ7tLqgV.mjs";
|
|
2
2
|
|
|
3
3
|
//#region src/VitestObjectionTransactionIsolator.ts
|
|
4
4
|
/**
|
|
@@ -60,4 +60,4 @@ var VitestObjectionTransactionIsolator = class extends VitestPostgresTransaction
|
|
|
60
60
|
|
|
61
61
|
//#endregion
|
|
62
62
|
export { VitestObjectionTransactionIsolator };
|
|
63
|
-
//# sourceMappingURL=VitestObjectionTransactionIsolator-
|
|
63
|
+
//# sourceMappingURL=VitestObjectionTransactionIsolator-jQFaCz0u.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VitestObjectionTransactionIsolator-
|
|
1
|
+
{"version":3,"file":"VitestObjectionTransactionIsolator-jQFaCz0u.mjs","names":["conn: Knex<any, any[]>","connection: Knex","level: IsolationLevel","fn: (trx: Knex.Transaction) => Promise<void>"],"sources":["../src/VitestObjectionTransactionIsolator.ts"],"sourcesContent":["import type { Knex } from 'knex';\nimport {\n type IsolationLevel,\n VitestPostgresTransactionIsolator,\n} from './VitestTransactionIsolator';\n\n/**\n * Objection.js-specific implementation of the Vitest transaction isolator.\n * Provides automatic transaction rollback for test isolation using Objection.js and Knex transaction API.\n * Each test runs within a database transaction that is rolled back after completion,\n * ensuring a clean state between tests without the overhead of recreating data.\n *\n * @example\n * ```typescript\n * import { VitestObjectionTransactionIsolator } from '@geekmidas/testkit';\n * import { knex } from './database';\n * import { User } from './models';\n * import { test } from 'vitest';\n *\n * // Create isolator instance\n * const isolator = new VitestObjectionTransactionIsolator(test);\n *\n * // Use with wrapped test API\n * const isolatedTest = isolator.wrapVitestWithTransaction(knex);\n *\n * isolatedTest('should create user', async ({ trx }) => {\n * const user = await User.query(trx)\n * .insert({ name: 'Test User' });\n *\n * expect(user).toBeDefined();\n * // This data will be rolled back after the test\n * });\n * ```\n */\nexport class VitestObjectionTransactionIsolator extends VitestPostgresTransactionIsolator<\n Knex,\n Knex.Transaction\n> {\n async destroy(conn: Knex<any, any[]>): Promise<void> {}\n /**\n * Creates a Knex transaction with the specified isolation level.\n * Implements the abstract transact method from VitestPostgresTransactionIsolator.\n * This transaction can be used with Objection.js models via Model.query(trx).\n *\n * @param conn - The Knex database connection\n * @param level - The transaction isolation level\n * @param fn - The function to execute within the transaction\n * @returns Promise that resolves when the transaction completes\n *\n * @example\n * ```typescript\n * await isolator.transact(knex, IsolationLevel.REPEATABLE_READ, async (trx) => {\n * // Use transaction with Objection models\n * await User.query(trx).insert({ name: 'Test' });\n * await Post.query(trx).where('userId', user.id).delete();\n * });\n * ```\n */\n async transact(\n connection: Knex,\n level: IsolationLevel,\n fn: (trx: Knex.Transaction) => Promise<void>,\n ): Promise<void> {\n const isolationLevel = level.toLowerCase() as Lowercase<IsolationLevel>;\n\n await connection.transaction(\n async (trx) => {\n await fn(trx);\n },\n {\n isolationLevel,\n },\n );\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCA,IAAa,qCAAb,cAAwD,kCAGtD;CACA,MAAM,QAAQA,MAAuC,CAAE;;;;;;;;;;;;;;;;;;;;CAoBvD,MAAM,SACJC,YACAC,OACAC,IACe;EACf,MAAM,iBAAiB,MAAM,aAAa;AAE1C,QAAM,WAAW,YACf,OAAO,QAAQ;AACb,SAAM,GAAG,IAAI;EACd,GACD,EACE,eACD,EACF;CACF;AACF"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
require('./VitestTransactionIsolator-
|
|
2
|
-
const require_VitestObjectionTransactionIsolator = require('./VitestObjectionTransactionIsolator-
|
|
1
|
+
require('./VitestTransactionIsolator-CMfJXZP8.cjs');
|
|
2
|
+
const require_VitestObjectionTransactionIsolator = require('./VitestObjectionTransactionIsolator-CM5KTAFA.cjs');
|
|
3
3
|
|
|
4
4
|
exports.VitestObjectionTransactionIsolator = require_VitestObjectionTransactionIsolator.VitestObjectionTransactionIsolator;
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import "./VitestTransactionIsolator-
|
|
2
|
-
import { VitestObjectionTransactionIsolator } from "./VitestObjectionTransactionIsolator-
|
|
1
|
+
import "./VitestTransactionIsolator-CwQaxZLP.cjs";
|
|
2
|
+
import { VitestObjectionTransactionIsolator } from "./VitestObjectionTransactionIsolator-1TpsPqfG.cjs";
|
|
3
3
|
export { VitestObjectionTransactionIsolator };
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import "./VitestTransactionIsolator-
|
|
2
|
-
import { VitestObjectionTransactionIsolator } from "./VitestObjectionTransactionIsolator-
|
|
1
|
+
import "./VitestTransactionIsolator-BvR19bYn.mjs";
|
|
2
|
+
import { VitestObjectionTransactionIsolator } from "./VitestObjectionTransactionIsolator-i9jIgU8Q.mjs";
|
|
3
3
|
export { VitestObjectionTransactionIsolator };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import "./VitestTransactionIsolator-
|
|
2
|
-
import { VitestObjectionTransactionIsolator } from "./VitestObjectionTransactionIsolator-
|
|
1
|
+
import "./VitestTransactionIsolator-DQ7tLqgV.mjs";
|
|
2
|
+
import { VitestObjectionTransactionIsolator } from "./VitestObjectionTransactionIsolator-jQFaCz0u.mjs";
|
|
3
3
|
|
|
4
4
|
export { VitestObjectionTransactionIsolator };
|
package/dist/{VitestTransactionIsolator-DWDbnITQ.d.mts → VitestTransactionIsolator-BvR19bYn.d.mts}
RENAMED
|
@@ -112,35 +112,61 @@ declare abstract class VitestPostgresTransactionIsolator<TConn, Transaction> {
|
|
|
112
112
|
* Creates a wrapped version of Vitest's test API that provides transaction isolation.
|
|
113
113
|
* Each test will run within a database transaction that is automatically rolled back.
|
|
114
114
|
*
|
|
115
|
-
* @param
|
|
116
|
-
* @param setup - Optional setup function to run within the transaction before each test
|
|
117
|
-
* @param level - The transaction isolation level (defaults to REPEATABLE_READ)
|
|
115
|
+
* @param options - Configuration options for transaction wrapping
|
|
118
116
|
* @returns A wrapped test API with transaction support
|
|
119
117
|
*
|
|
120
118
|
* @example
|
|
121
119
|
* ```typescript
|
|
122
|
-
* const isolatedTest = isolator.wrapVitestWithTransaction(
|
|
123
|
-
*
|
|
124
|
-
*
|
|
120
|
+
* const isolatedTest = isolator.wrapVitestWithTransaction({
|
|
121
|
+
* connection: db,
|
|
122
|
+
* setup: async (trx) => {
|
|
123
|
+
* await trx.insert('settings', { key: 'test', value: 'true' });
|
|
124
|
+
* },
|
|
125
|
+
* fixtures: {
|
|
126
|
+
* factory: (trx) => new Factory(trx),
|
|
127
|
+
* },
|
|
125
128
|
* });
|
|
126
129
|
*
|
|
127
|
-
* isolatedTest('test with transaction', async ({ trx }) => {
|
|
128
|
-
* const user = await
|
|
130
|
+
* isolatedTest('test with transaction', async ({ trx, factory }) => {
|
|
131
|
+
* const user = await factory.insert('user', { name: 'Test' });
|
|
129
132
|
* expect(user).toBeDefined();
|
|
130
133
|
* });
|
|
131
134
|
* ```
|
|
132
135
|
*/
|
|
133
|
-
wrapVitestWithTransaction
|
|
134
|
-
trx: Transaction;
|
|
135
|
-
}>;
|
|
136
|
+
wrapVitestWithTransaction<Extended extends Record<string, unknown> = {}>(options: TransactionWrapperOptions<TConn, Transaction, Extended>): TestAPI<DatabaseFixtures<Transaction, object> & Extended>;
|
|
136
137
|
}
|
|
137
138
|
type DatabaseConnectionFn<Conn> = () => Conn | Promise<Conn>;
|
|
138
139
|
type DatabaseConnection<Conn> = DatabaseConnectionFn<Conn>;
|
|
140
|
+
/**
|
|
141
|
+
* Options for wrapping Vitest tests with database transaction isolation.
|
|
142
|
+
*/
|
|
143
|
+
interface TransactionWrapperOptions<TConn, Transaction, Extended extends Record<string, unknown> = {}> {
|
|
144
|
+
/** Function that creates or returns a database connection */
|
|
145
|
+
connection: DatabaseConnection<TConn>;
|
|
146
|
+
/** Optional setup function to run within the transaction before each test */
|
|
147
|
+
setup?: (trx: Transaction) => Promise<void>;
|
|
148
|
+
/** Transaction isolation level (defaults to REPEATABLE_READ) */
|
|
149
|
+
isolationLevel?: IsolationLevel;
|
|
150
|
+
/** Additional fixtures that depend on the transaction */
|
|
151
|
+
fixtures?: FixtureCreators<Transaction, Extended>;
|
|
152
|
+
}
|
|
139
153
|
/**
|
|
140
154
|
* Type for fixture creator functions that depend on the transaction.
|
|
141
155
|
* Each function receives the transaction and returns the fixture value.
|
|
142
156
|
*/
|
|
143
157
|
type FixtureCreators<Transaction, Extended extends Record<string, unknown>> = { [K in keyof Extended]: (trx: Transaction) => Extended[K] | Promise<Extended[K]> };
|
|
158
|
+
/**
|
|
159
|
+
* The test API returned by extendWithFixtures.
|
|
160
|
+
* Provides access to both the transaction (trx) and all extended fixtures.
|
|
161
|
+
*
|
|
162
|
+
* @template Transaction - The transaction type
|
|
163
|
+
* @template Extended - The type of additional fixtures provided
|
|
164
|
+
* @template BaseTest - The base wrapped test type
|
|
165
|
+
*/
|
|
166
|
+
type TestWithExtendedFixtures<Transaction, Extended extends Record<string, unknown>, BaseTest extends ReturnType<TestAPI['extend']> = ReturnType<TestAPI['extend']>> = BaseTest & {
|
|
167
|
+
<C extends object>(name: string, fn: (context: DatabaseFixtures<Transaction> & Extended & C) => Promise<void>): void;
|
|
168
|
+
<C extends object>(name: string, options: object, fn: (context: DatabaseFixtures<Transaction> & Extended & C) => Promise<void>): void;
|
|
169
|
+
};
|
|
144
170
|
/**
|
|
145
171
|
* Extends a wrapped test API with additional fixtures that depend on the transaction.
|
|
146
172
|
* This allows composing test context with factories, repositories, or other helpers.
|
|
@@ -156,7 +182,10 @@ type FixtureCreators<Transaction, Extended extends Record<string, unknown>> = {
|
|
|
156
182
|
* import { wrapVitestKyselyTransaction, extendWithFixtures } from '@geekmidas/testkit/kysely';
|
|
157
183
|
*
|
|
158
184
|
* // Create base wrapped test
|
|
159
|
-
* const baseTest = wrapVitestKyselyTransaction(test,
|
|
185
|
+
* const baseTest = wrapVitestKyselyTransaction(test, {
|
|
186
|
+
* connection: db,
|
|
187
|
+
* setup: createTestTables,
|
|
188
|
+
* });
|
|
160
189
|
*
|
|
161
190
|
* // Extend with fixtures
|
|
162
191
|
* const it = extendWithFixtures(baseTest, {
|
|
@@ -171,10 +200,7 @@ type FixtureCreators<Transaction, Extended extends Record<string, unknown>> = {
|
|
|
171
200
|
* });
|
|
172
201
|
* ```
|
|
173
202
|
*/
|
|
174
|
-
declare function extendWithFixtures<Transaction, Extended extends Record<string, unknown>, T extends ReturnType<TestAPI['extend']> = any>(wrappedTest: T, fixtures: FixtureCreators<Transaction, Extended>):
|
|
175
|
-
<C extends object>(name: string, fn: (context: DatabaseFixtures<Transaction> & Extended & C) => Promise<void>): void;
|
|
176
|
-
<C extends object>(name: string, options: object, fn: (context: DatabaseFixtures<Transaction> & Extended & C) => Promise<void>): void;
|
|
177
|
-
};
|
|
203
|
+
declare function extendWithFixtures<Transaction, Extended extends Record<string, unknown>, T extends ReturnType<TestAPI['extend']> = any>(wrappedTest: T, fixtures: FixtureCreators<Transaction, Extended>): TestWithExtendedFixtures<Transaction, Extended, T>;
|
|
178
204
|
//#endregion
|
|
179
|
-
export { DatabaseConnection, DatabaseConnectionFn, DatabaseFixtures, ExtendContextFn, ExtendedDatabaseFixtures, FixtureCreators, IsolationLevel, VitestPostgresTransactionIsolator, extendWithFixtures };
|
|
180
|
-
//# sourceMappingURL=VitestTransactionIsolator-
|
|
205
|
+
export { DatabaseConnection, DatabaseConnectionFn, DatabaseFixtures, ExtendContextFn, ExtendedDatabaseFixtures, FixtureCreators, IsolationLevel, TestWithExtendedFixtures, TransactionWrapperOptions, VitestPostgresTransactionIsolator, extendWithFixtures };
|
|
206
|
+
//# sourceMappingURL=VitestTransactionIsolator-BvR19bYn.d.mts.map
|