@studiosonrai/nestjs-testfx 1.0.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 +666 -0
- package/dist/src/factories/base.factory.d.ts +49 -0
- package/dist/src/factories/base.factory.js +75 -0
- package/dist/src/factories/base.factory.js.map +1 -0
- package/dist/src/factories/example.factory.d.ts +44 -0
- package/dist/src/factories/example.factory.js +117 -0
- package/dist/src/factories/example.factory.js.map +1 -0
- package/dist/src/factories/index.d.ts +2 -0
- package/dist/src/factories/index.js +10 -0
- package/dist/src/factories/index.js.map +1 -0
- package/dist/src/fixtures/example.fixture.d.ts +28 -0
- package/dist/src/fixtures/example.fixture.js +112 -0
- package/dist/src/fixtures/example.fixture.js.map +1 -0
- package/dist/src/fixtures/index.d.ts +1 -0
- package/dist/src/fixtures/index.js +13 -0
- package/dist/src/fixtures/index.js.map +1 -0
- package/dist/src/helpers/database-test.helper.d.ts +29 -0
- package/dist/src/helpers/database-test.helper.js +154 -0
- package/dist/src/helpers/database-test.helper.js.map +1 -0
- package/dist/src/helpers/index.d.ts +1 -0
- package/dist/src/helpers/index.js +6 -0
- package/dist/src/helpers/index.js.map +1 -0
- package/dist/src/index.d.ts +4 -0
- package/dist/src/index.js +23 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/jest.setup.template.d.ts +9 -0
- package/dist/src/jest.setup.template.js +31 -0
- package/dist/src/jest.setup.template.js.map +1 -0
- package/dist/src/matchers/entity-comparator.d.ts +28 -0
- package/dist/src/matchers/entity-comparator.js +163 -0
- package/dist/src/matchers/entity-comparator.js.map +1 -0
- package/dist/src/matchers/index.d.ts +1 -0
- package/dist/src/matchers/index.js +7 -0
- package/dist/src/matchers/index.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BaseFactory = void 0;
|
|
4
|
+
const faker_1 = require("@faker-js/faker");
|
|
5
|
+
class BaseFactory {
|
|
6
|
+
dataSource;
|
|
7
|
+
repository;
|
|
8
|
+
entityClass;
|
|
9
|
+
constructor(dataSource, entityClass) {
|
|
10
|
+
this.dataSource = dataSource;
|
|
11
|
+
this.entityClass = entityClass;
|
|
12
|
+
this.repository = dataSource.getRepository(entityClass);
|
|
13
|
+
}
|
|
14
|
+
async create(overrides, options = {}) {
|
|
15
|
+
const entity = this.build(overrides);
|
|
16
|
+
if (options.save === false) {
|
|
17
|
+
return entity;
|
|
18
|
+
}
|
|
19
|
+
const manager = options.manager || this.dataSource.manager;
|
|
20
|
+
return await manager.save(entity);
|
|
21
|
+
}
|
|
22
|
+
async createMany(count, overrides, options = {}) {
|
|
23
|
+
const entities = Array.from({ length: count }, () => this.build(overrides));
|
|
24
|
+
if (options.save === false) {
|
|
25
|
+
return entities;
|
|
26
|
+
}
|
|
27
|
+
const manager = options.manager || this.dataSource.manager;
|
|
28
|
+
return await manager.save(entities);
|
|
29
|
+
}
|
|
30
|
+
generateFakeData() {
|
|
31
|
+
return {
|
|
32
|
+
id: faker_1.faker.number.int({ min: 1, max: 999999 }),
|
|
33
|
+
email: faker_1.faker.internet.email(),
|
|
34
|
+
firstName: faker_1.faker.person.firstName(),
|
|
35
|
+
lastName: faker_1.faker.person.lastName(),
|
|
36
|
+
phone: faker_1.faker.phone.number(),
|
|
37
|
+
address: faker_1.faker.location.streetAddress(),
|
|
38
|
+
city: faker_1.faker.location.city(),
|
|
39
|
+
state: faker_1.faker.location.state(),
|
|
40
|
+
postalCode: faker_1.faker.location.zipCode(),
|
|
41
|
+
country: faker_1.faker.location.country(),
|
|
42
|
+
name: faker_1.faker.company.name(),
|
|
43
|
+
description: faker_1.faker.lorem.paragraph(),
|
|
44
|
+
createdAt: faker_1.faker.date.past(),
|
|
45
|
+
updatedAt: faker_1.faker.date.recent(),
|
|
46
|
+
boolean: faker_1.faker.datatype.boolean(),
|
|
47
|
+
number: faker_1.faker.number.int({ min: 1, max: 1000 }),
|
|
48
|
+
decimal: faker_1.faker.number.float({ min: 0, max: 100, fractionDigits: 2 }),
|
|
49
|
+
datetime: faker_1.faker.date.future(),
|
|
50
|
+
text: faker_1.faker.lorem.sentences(),
|
|
51
|
+
url: faker_1.faker.internet.url(),
|
|
52
|
+
priority: faker_1.faker.helpers.arrayElement(['low', 'medium', 'high']),
|
|
53
|
+
status: faker_1.faker.helpers.arrayElement(['active', 'inactive', 'pending']),
|
|
54
|
+
code: faker_1.faker.helpers.arrayElement([
|
|
55
|
+
'installation',
|
|
56
|
+
'inspection',
|
|
57
|
+
'maintenance',
|
|
58
|
+
'repair',
|
|
59
|
+
]),
|
|
60
|
+
randomMinutes: faker_1.faker.number.int({ min: 30, max: 100 }),
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
applyOverrides(baseData, overrides) {
|
|
64
|
+
return { ...baseData, ...overrides };
|
|
65
|
+
}
|
|
66
|
+
createInstance(data) {
|
|
67
|
+
const instance = new this.entityClass();
|
|
68
|
+
return Object.assign(instance, data);
|
|
69
|
+
}
|
|
70
|
+
getRepository() {
|
|
71
|
+
return this.repository;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
exports.BaseFactory = BaseFactory;
|
|
75
|
+
//# sourceMappingURL=base.factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.factory.js","sourceRoot":"","sources":["../../../src/factories/base.factory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { DataSource, ObjectLiteral } from 'typeorm';
|
|
2
|
+
import { BaseFactory, FactoryOptions } from './base.factory';
|
|
3
|
+
interface ExampleUser {
|
|
4
|
+
id?: number;
|
|
5
|
+
email: string;
|
|
6
|
+
password?: string;
|
|
7
|
+
firstName: string;
|
|
8
|
+
lastName: string;
|
|
9
|
+
phone?: string | null;
|
|
10
|
+
isActive: boolean;
|
|
11
|
+
createdAt: Date;
|
|
12
|
+
updatedAt: Date;
|
|
13
|
+
}
|
|
14
|
+
export declare class ExampleUserFactory extends BaseFactory<ExampleUser & ObjectLiteral> {
|
|
15
|
+
constructor(dataSource: DataSource);
|
|
16
|
+
build(overrides?: Partial<ExampleUser>): ExampleUser & ObjectLiteral;
|
|
17
|
+
createAdmin(overrides?: Partial<ExampleUser>, options?: FactoryOptions): Promise<ExampleUser & ObjectLiteral>;
|
|
18
|
+
createInactive(overrides?: Partial<ExampleUser>, options?: FactoryOptions): Promise<ExampleUser & ObjectLiteral>;
|
|
19
|
+
buildMinimal(overrides?: Partial<ExampleUser>): ExampleUser & ObjectLiteral;
|
|
20
|
+
buildComplete(): ExampleUser & ObjectLiteral;
|
|
21
|
+
}
|
|
22
|
+
interface ExampleOrder {
|
|
23
|
+
id?: number;
|
|
24
|
+
orderNumber: string;
|
|
25
|
+
userId: number;
|
|
26
|
+
status: 'pending' | 'processing' | 'completed' | 'cancelled';
|
|
27
|
+
total: number;
|
|
28
|
+
notes?: string;
|
|
29
|
+
createdAt: Date;
|
|
30
|
+
}
|
|
31
|
+
export declare class ExampleOrderFactory extends BaseFactory<ExampleOrder & ObjectLiteral> {
|
|
32
|
+
constructor(dataSource: DataSource);
|
|
33
|
+
build(overrides?: Partial<ExampleOrder>): ExampleOrder & ObjectLiteral;
|
|
34
|
+
createForUser(userId: number, overrides?: Partial<ExampleOrder>, options?: FactoryOptions): Promise<ExampleOrder & ObjectLiteral>;
|
|
35
|
+
createPending(userId: number, overrides?: Partial<ExampleOrder>, options?: FactoryOptions): Promise<ExampleOrder & ObjectLiteral>;
|
|
36
|
+
createCompleted(userId: number, overrides?: Partial<ExampleOrder>, options?: FactoryOptions): Promise<ExampleOrder & ObjectLiteral>;
|
|
37
|
+
createHighValue(userId: number, overrides?: Partial<ExampleOrder>, options?: FactoryOptions): Promise<ExampleOrder & ObjectLiteral>;
|
|
38
|
+
}
|
|
39
|
+
export declare class ExampleFactoryManager {
|
|
40
|
+
readonly user: ExampleUserFactory;
|
|
41
|
+
readonly order: ExampleOrderFactory;
|
|
42
|
+
constructor(dataSource: DataSource);
|
|
43
|
+
}
|
|
44
|
+
export {};
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ExampleFactoryManager = exports.ExampleOrderFactory = exports.ExampleUserFactory = void 0;
|
|
4
|
+
const base_factory_1 = require("./base.factory");
|
|
5
|
+
const faker_1 = require("@faker-js/faker");
|
|
6
|
+
class ExampleUserFactory extends base_factory_1.BaseFactory {
|
|
7
|
+
constructor(dataSource) {
|
|
8
|
+
super(dataSource, class {
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
build(overrides) {
|
|
12
|
+
const fake = this.generateFakeData();
|
|
13
|
+
const userData = {
|
|
14
|
+
email: fake.email,
|
|
15
|
+
password: faker_1.faker.internet.password({ length: 12 }),
|
|
16
|
+
firstName: fake.firstName,
|
|
17
|
+
lastName: fake.lastName,
|
|
18
|
+
phone: fake.phone || null,
|
|
19
|
+
isActive: true,
|
|
20
|
+
createdAt: fake.createdAt,
|
|
21
|
+
updatedAt: fake.updatedAt,
|
|
22
|
+
};
|
|
23
|
+
return this.createInstance(this.applyOverrides(userData, overrides));
|
|
24
|
+
}
|
|
25
|
+
async createAdmin(overrides, options) {
|
|
26
|
+
return this.create({
|
|
27
|
+
email: faker_1.faker.internet.email({ provider: 'admin.company.com' }),
|
|
28
|
+
firstName: 'Admin',
|
|
29
|
+
isActive: true,
|
|
30
|
+
...overrides,
|
|
31
|
+
}, options);
|
|
32
|
+
}
|
|
33
|
+
async createInactive(overrides, options) {
|
|
34
|
+
return this.create({
|
|
35
|
+
isActive: false,
|
|
36
|
+
...overrides,
|
|
37
|
+
}, options);
|
|
38
|
+
}
|
|
39
|
+
buildMinimal(overrides) {
|
|
40
|
+
const fake = this.generateFakeData();
|
|
41
|
+
return this.createInstance(this.applyOverrides({
|
|
42
|
+
email: fake.email,
|
|
43
|
+
firstName: fake.firstName,
|
|
44
|
+
lastName: fake.lastName,
|
|
45
|
+
isActive: true,
|
|
46
|
+
createdAt: new Date(),
|
|
47
|
+
updatedAt: new Date(),
|
|
48
|
+
}, overrides));
|
|
49
|
+
}
|
|
50
|
+
buildComplete() {
|
|
51
|
+
const fake = this.generateFakeData();
|
|
52
|
+
return this.createInstance({
|
|
53
|
+
email: fake.email,
|
|
54
|
+
password: faker_1.faker.internet.password({ length: 16 }),
|
|
55
|
+
firstName: fake.firstName,
|
|
56
|
+
lastName: fake.lastName,
|
|
57
|
+
phone: fake.phone,
|
|
58
|
+
isActive: true,
|
|
59
|
+
createdAt: fake.createdAt,
|
|
60
|
+
updatedAt: fake.updatedAt,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
exports.ExampleUserFactory = ExampleUserFactory;
|
|
65
|
+
class ExampleOrderFactory extends base_factory_1.BaseFactory {
|
|
66
|
+
constructor(dataSource) {
|
|
67
|
+
super(dataSource, class {
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
build(overrides) {
|
|
71
|
+
const fake = this.generateFakeData();
|
|
72
|
+
const orderData = {
|
|
73
|
+
orderNumber: `ORD-${faker_1.faker.string.alphanumeric(8).toUpperCase()}`,
|
|
74
|
+
userId: fake.id,
|
|
75
|
+
status: 'pending',
|
|
76
|
+
total: faker_1.faker.number.float({ min: 10, max: 1000, fractionDigits: 2 }),
|
|
77
|
+
notes: faker_1.faker.commerce.productDescription(),
|
|
78
|
+
createdAt: fake.createdAt,
|
|
79
|
+
};
|
|
80
|
+
return this.createInstance(this.applyOverrides(orderData, overrides));
|
|
81
|
+
}
|
|
82
|
+
async createForUser(userId, overrides, options) {
|
|
83
|
+
return this.create({ userId, ...overrides }, options);
|
|
84
|
+
}
|
|
85
|
+
async createPending(userId, overrides, options) {
|
|
86
|
+
return this.create({
|
|
87
|
+
userId,
|
|
88
|
+
status: 'pending',
|
|
89
|
+
...overrides,
|
|
90
|
+
}, options);
|
|
91
|
+
}
|
|
92
|
+
async createCompleted(userId, overrides, options) {
|
|
93
|
+
return this.create({
|
|
94
|
+
userId,
|
|
95
|
+
status: 'completed',
|
|
96
|
+
...overrides,
|
|
97
|
+
}, options);
|
|
98
|
+
}
|
|
99
|
+
async createHighValue(userId, overrides, options) {
|
|
100
|
+
return this.create({
|
|
101
|
+
userId,
|
|
102
|
+
total: faker_1.faker.number.float({ min: 1000, max: 10000, fractionDigits: 2 }),
|
|
103
|
+
...overrides,
|
|
104
|
+
}, options);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
exports.ExampleOrderFactory = ExampleOrderFactory;
|
|
108
|
+
class ExampleFactoryManager {
|
|
109
|
+
user;
|
|
110
|
+
order;
|
|
111
|
+
constructor(dataSource) {
|
|
112
|
+
this.user = new ExampleUserFactory(dataSource);
|
|
113
|
+
this.order = new ExampleOrderFactory(dataSource);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
exports.ExampleFactoryManager = ExampleFactoryManager;
|
|
117
|
+
//# sourceMappingURL=example.factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"example.factory.js","sourceRoot":"","sources":["../../../src/factories/example.factory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ExampleFactoryManager = exports.ExampleOrderFactory = exports.ExampleUserFactory = exports.BaseFactory = void 0;
|
|
4
|
+
var base_factory_1 = require("./base.factory");
|
|
5
|
+
Object.defineProperty(exports, "BaseFactory", { enumerable: true, get: function () { return base_factory_1.BaseFactory; } });
|
|
6
|
+
var example_factory_1 = require("./example.factory");
|
|
7
|
+
Object.defineProperty(exports, "ExampleUserFactory", { enumerable: true, get: function () { return example_factory_1.ExampleUserFactory; } });
|
|
8
|
+
Object.defineProperty(exports, "ExampleOrderFactory", { enumerable: true, get: function () { return example_factory_1.ExampleOrderFactory; } });
|
|
9
|
+
Object.defineProperty(exports, "ExampleFactoryManager", { enumerable: true, get: function () { return example_factory_1.ExampleFactoryManager; } });
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/factories/index.ts"],"names":[],"mappings":";;;AAMA,+CAIwB;AAHtB,2GAAA,WAAW,OAAA;AAMb,qDAI2B;AAHzB,qHAAA,kBAAkB,OAAA;AAClB,sHAAA,mBAAmB,OAAA;AACnB,wHAAA,qBAAqB,OAAA"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export interface RoleFixture {
|
|
2
|
+
id: number;
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
createdAt: Date;
|
|
6
|
+
}
|
|
7
|
+
export declare const ROLE_FIXTURES: Record<string, RoleFixture>;
|
|
8
|
+
export declare function getAllRoleFixtures(): RoleFixture[];
|
|
9
|
+
export declare function getRoleById(id: number): RoleFixture | undefined;
|
|
10
|
+
export declare function getRoleByName(name: string): RoleFixture | undefined;
|
|
11
|
+
export interface StatusFixture {
|
|
12
|
+
id: number;
|
|
13
|
+
code: string;
|
|
14
|
+
name: string;
|
|
15
|
+
description: string;
|
|
16
|
+
sortOrder: number;
|
|
17
|
+
}
|
|
18
|
+
export declare const ORDER_STATUS_FIXTURES: Record<string, StatusFixture>;
|
|
19
|
+
export declare function getAllOrderStatusFixtures(): StatusFixture[];
|
|
20
|
+
export declare function getOrderStatusByCode(code: string): StatusFixture | undefined;
|
|
21
|
+
import { EntityManager } from 'typeorm';
|
|
22
|
+
export declare class ExampleFixtureLoader {
|
|
23
|
+
private manager;
|
|
24
|
+
constructor(manager: EntityManager);
|
|
25
|
+
loadRoles(): Promise<void>;
|
|
26
|
+
loadOrderStatuses(): Promise<void>;
|
|
27
|
+
loadAll(): Promise<void>;
|
|
28
|
+
}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ExampleFixtureLoader = exports.ORDER_STATUS_FIXTURES = exports.ROLE_FIXTURES = void 0;
|
|
4
|
+
exports.getAllRoleFixtures = getAllRoleFixtures;
|
|
5
|
+
exports.getRoleById = getRoleById;
|
|
6
|
+
exports.getRoleByName = getRoleByName;
|
|
7
|
+
exports.getAllOrderStatusFixtures = getAllOrderStatusFixtures;
|
|
8
|
+
exports.getOrderStatusByCode = getOrderStatusByCode;
|
|
9
|
+
exports.ROLE_FIXTURES = {
|
|
10
|
+
ADMIN: {
|
|
11
|
+
id: 1,
|
|
12
|
+
name: 'Admin',
|
|
13
|
+
description: 'System administrator with full access',
|
|
14
|
+
createdAt: new Date('2024-01-01T00:00:00Z'),
|
|
15
|
+
},
|
|
16
|
+
USER: {
|
|
17
|
+
id: 2,
|
|
18
|
+
name: 'User',
|
|
19
|
+
description: 'Standard user with basic access',
|
|
20
|
+
createdAt: new Date('2024-01-01T00:00:00Z'),
|
|
21
|
+
},
|
|
22
|
+
MODERATOR: {
|
|
23
|
+
id: 3,
|
|
24
|
+
name: 'Moderator',
|
|
25
|
+
description: 'User with content moderation permissions',
|
|
26
|
+
createdAt: new Date('2024-01-01T00:00:00Z'),
|
|
27
|
+
},
|
|
28
|
+
GUEST: {
|
|
29
|
+
id: 4,
|
|
30
|
+
name: 'Guest',
|
|
31
|
+
description: 'Limited access for unauthenticated users',
|
|
32
|
+
createdAt: new Date('2024-01-01T00:00:00Z'),
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
function getAllRoleFixtures() {
|
|
36
|
+
return Object.values(exports.ROLE_FIXTURES);
|
|
37
|
+
}
|
|
38
|
+
function getRoleById(id) {
|
|
39
|
+
return Object.values(exports.ROLE_FIXTURES).find((role) => role.id === id);
|
|
40
|
+
}
|
|
41
|
+
function getRoleByName(name) {
|
|
42
|
+
return Object.values(exports.ROLE_FIXTURES).find((role) => role.name === name);
|
|
43
|
+
}
|
|
44
|
+
exports.ORDER_STATUS_FIXTURES = {
|
|
45
|
+
PENDING: {
|
|
46
|
+
id: 1,
|
|
47
|
+
code: 'pending',
|
|
48
|
+
name: 'Pending',
|
|
49
|
+
description: 'Order is awaiting processing',
|
|
50
|
+
sortOrder: 1,
|
|
51
|
+
},
|
|
52
|
+
PROCESSING: {
|
|
53
|
+
id: 2,
|
|
54
|
+
code: 'processing',
|
|
55
|
+
name: 'Processing',
|
|
56
|
+
description: 'Order is being processed',
|
|
57
|
+
sortOrder: 2,
|
|
58
|
+
},
|
|
59
|
+
SHIPPED: {
|
|
60
|
+
id: 3,
|
|
61
|
+
code: 'shipped',
|
|
62
|
+
name: 'Shipped',
|
|
63
|
+
description: 'Order has been shipped',
|
|
64
|
+
sortOrder: 3,
|
|
65
|
+
},
|
|
66
|
+
DELIVERED: {
|
|
67
|
+
id: 4,
|
|
68
|
+
code: 'delivered',
|
|
69
|
+
name: 'Delivered',
|
|
70
|
+
description: 'Order has been delivered',
|
|
71
|
+
sortOrder: 4,
|
|
72
|
+
},
|
|
73
|
+
CANCELLED: {
|
|
74
|
+
id: 5,
|
|
75
|
+
code: 'cancelled',
|
|
76
|
+
name: 'Cancelled',
|
|
77
|
+
description: 'Order has been cancelled',
|
|
78
|
+
sortOrder: 5,
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
function getAllOrderStatusFixtures() {
|
|
82
|
+
return Object.values(exports.ORDER_STATUS_FIXTURES);
|
|
83
|
+
}
|
|
84
|
+
function getOrderStatusByCode(code) {
|
|
85
|
+
return Object.values(exports.ORDER_STATUS_FIXTURES).find((s) => s.code === code);
|
|
86
|
+
}
|
|
87
|
+
class ExampleFixtureLoader {
|
|
88
|
+
manager;
|
|
89
|
+
constructor(manager) {
|
|
90
|
+
this.manager = manager;
|
|
91
|
+
}
|
|
92
|
+
async loadRoles() {
|
|
93
|
+
for (const role of getAllRoleFixtures()) {
|
|
94
|
+
await this.manager.query(`INSERT INTO Role (id, name, description, createdAt)
|
|
95
|
+
VALUES ($1, $2, $3, $4)
|
|
96
|
+
ON CONFLICT (id) DO NOTHING`, [role.id, role.name, role.description, role.createdAt]);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
async loadOrderStatuses() {
|
|
100
|
+
for (const status of getAllOrderStatusFixtures()) {
|
|
101
|
+
await this.manager.query(`INSERT INTO OrderStatus (id, code, name, description, sortOrder)
|
|
102
|
+
VALUES ($1, $2, $3, $4, $5)
|
|
103
|
+
ON CONFLICT (id) DO NOTHING`, [status.id, status.code, status.name, status.description, status.sortOrder]);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
async loadAll() {
|
|
107
|
+
await this.loadRoles();
|
|
108
|
+
await this.loadOrderStatuses();
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
exports.ExampleFixtureLoader = ExampleFixtureLoader;
|
|
112
|
+
//# sourceMappingURL=example.fixture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"example.fixture.js","sourceRoot":"","sources":["../../../src/fixtures/example.fixture.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { RoleFixture, ROLE_FIXTURES, getAllRoleFixtures, getRoleById, getRoleByName, StatusFixture, ORDER_STATUS_FIXTURES, getAllOrderStatusFixtures, getOrderStatusByCode, ExampleFixtureLoader, } from './example.fixture';
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ExampleFixtureLoader = exports.getOrderStatusByCode = exports.getAllOrderStatusFixtures = exports.ORDER_STATUS_FIXTURES = exports.getRoleByName = exports.getRoleById = exports.getAllRoleFixtures = exports.ROLE_FIXTURES = void 0;
|
|
4
|
+
var example_fixture_1 = require("./example.fixture");
|
|
5
|
+
Object.defineProperty(exports, "ROLE_FIXTURES", { enumerable: true, get: function () { return example_fixture_1.ROLE_FIXTURES; } });
|
|
6
|
+
Object.defineProperty(exports, "getAllRoleFixtures", { enumerable: true, get: function () { return example_fixture_1.getAllRoleFixtures; } });
|
|
7
|
+
Object.defineProperty(exports, "getRoleById", { enumerable: true, get: function () { return example_fixture_1.getRoleById; } });
|
|
8
|
+
Object.defineProperty(exports, "getRoleByName", { enumerable: true, get: function () { return example_fixture_1.getRoleByName; } });
|
|
9
|
+
Object.defineProperty(exports, "ORDER_STATUS_FIXTURES", { enumerable: true, get: function () { return example_fixture_1.ORDER_STATUS_FIXTURES; } });
|
|
10
|
+
Object.defineProperty(exports, "getAllOrderStatusFixtures", { enumerable: true, get: function () { return example_fixture_1.getAllOrderStatusFixtures; } });
|
|
11
|
+
Object.defineProperty(exports, "getOrderStatusByCode", { enumerable: true, get: function () { return example_fixture_1.getOrderStatusByCode; } });
|
|
12
|
+
Object.defineProperty(exports, "ExampleFixtureLoader", { enumerable: true, get: function () { return example_fixture_1.ExampleFixtureLoader; } });
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/fixtures/index.ts"],"names":[],"mappings":";;;AAMA,qDAgB2B;AAbzB,gHAAA,aAAa,OAAA;AACb,qHAAA,kBAAkB,OAAA;AAClB,8GAAA,WAAW,OAAA;AACX,gHAAA,aAAa,OAAA;AAIb,wHAAA,qBAAqB,OAAA;AACrB,4HAAA,yBAAyB,OAAA;AACzB,uHAAA,oBAAoB,OAAA;AAGpB,uHAAA,oBAAoB,OAAA"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { DataSource, EntityManager, FindOptionsWhere, ObjectLiteral, EntityTarget, Repository } from 'typeorm';
|
|
2
|
+
export interface DatabaseTestHelperConfig {
|
|
3
|
+
dataSource: DataSource;
|
|
4
|
+
cleanupOrder?: string[];
|
|
5
|
+
dialect?: 'mssql' | 'postgres' | 'mysql';
|
|
6
|
+
}
|
|
7
|
+
export declare class DatabaseTestHelper {
|
|
8
|
+
private dataSource;
|
|
9
|
+
private queryRunner;
|
|
10
|
+
private transactionStarted;
|
|
11
|
+
private cleanupOrder;
|
|
12
|
+
private dialect;
|
|
13
|
+
constructor(config: DatabaseTestHelperConfig);
|
|
14
|
+
static fromDataSource(dataSource: DataSource, options?: Omit<DatabaseTestHelperConfig, 'dataSource'>): Promise<DatabaseTestHelper>;
|
|
15
|
+
startTransaction(): Promise<void>;
|
|
16
|
+
rollbackTransaction(): Promise<void>;
|
|
17
|
+
commitTransaction(): Promise<void>;
|
|
18
|
+
getTransactionManager(): EntityManager;
|
|
19
|
+
inNewTransaction<T>(operation: (manager: EntityManager) => Promise<T>): Promise<T>;
|
|
20
|
+
withoutTransaction<T>(operation: (manager: EntityManager) => Promise<T>): Promise<T>;
|
|
21
|
+
cleanDatabase(tableNames?: string[]): Promise<void>;
|
|
22
|
+
private quoteTableName;
|
|
23
|
+
getRepository<T extends ObjectLiteral>(entityClass: EntityTarget<T>): Repository<T>;
|
|
24
|
+
getDataSource(): DataSource;
|
|
25
|
+
entityExists<T extends ObjectLiteral>(entityClass: EntityTarget<T>, criteria: FindOptionsWhere<T>): Promise<boolean>;
|
|
26
|
+
countEntities<T extends ObjectLiteral>(entityClass: EntityTarget<T>, criteria?: FindOptionsWhere<T>): Promise<number>;
|
|
27
|
+
close(): Promise<void>;
|
|
28
|
+
isTransactionActive(): boolean;
|
|
29
|
+
}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DatabaseTestHelper = void 0;
|
|
4
|
+
class DatabaseTestHelper {
|
|
5
|
+
dataSource;
|
|
6
|
+
queryRunner = null;
|
|
7
|
+
transactionStarted = false;
|
|
8
|
+
cleanupOrder;
|
|
9
|
+
dialect;
|
|
10
|
+
constructor(config) {
|
|
11
|
+
this.dataSource = config.dataSource;
|
|
12
|
+
this.cleanupOrder = config.cleanupOrder || [];
|
|
13
|
+
this.dialect = config.dialect || 'mssql';
|
|
14
|
+
}
|
|
15
|
+
static async fromDataSource(dataSource, options) {
|
|
16
|
+
if (!dataSource.isInitialized) {
|
|
17
|
+
await dataSource.initialize();
|
|
18
|
+
}
|
|
19
|
+
return new DatabaseTestHelper({
|
|
20
|
+
dataSource,
|
|
21
|
+
...options,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
async startTransaction() {
|
|
25
|
+
if (this.transactionStarted) {
|
|
26
|
+
throw new Error('Transaction already started. Call rollbackTransaction() or commitTransaction() first.');
|
|
27
|
+
}
|
|
28
|
+
this.queryRunner = this.dataSource.createQueryRunner();
|
|
29
|
+
await this.queryRunner.connect();
|
|
30
|
+
await this.queryRunner.startTransaction();
|
|
31
|
+
this.transactionStarted = true;
|
|
32
|
+
}
|
|
33
|
+
async rollbackTransaction() {
|
|
34
|
+
if (!this.transactionStarted || !this.queryRunner) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
try {
|
|
38
|
+
await this.queryRunner.rollbackTransaction();
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
42
|
+
console.warn('Transaction rollback warning:', errorMessage);
|
|
43
|
+
}
|
|
44
|
+
finally {
|
|
45
|
+
await this.queryRunner.release();
|
|
46
|
+
this.queryRunner = null;
|
|
47
|
+
this.transactionStarted = false;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
async commitTransaction() {
|
|
51
|
+
if (!this.transactionStarted || !this.queryRunner) {
|
|
52
|
+
throw new Error('No active transaction to commit');
|
|
53
|
+
}
|
|
54
|
+
await this.queryRunner.commitTransaction();
|
|
55
|
+
await this.queryRunner.release();
|
|
56
|
+
this.queryRunner = null;
|
|
57
|
+
this.transactionStarted = false;
|
|
58
|
+
}
|
|
59
|
+
getTransactionManager() {
|
|
60
|
+
if (!this.transactionStarted || !this.queryRunner) {
|
|
61
|
+
throw new Error('No active transaction. Call startTransaction() first.');
|
|
62
|
+
}
|
|
63
|
+
return this.queryRunner.manager;
|
|
64
|
+
}
|
|
65
|
+
async inNewTransaction(operation) {
|
|
66
|
+
const newQueryRunner = this.dataSource.createQueryRunner();
|
|
67
|
+
await newQueryRunner.connect();
|
|
68
|
+
await newQueryRunner.startTransaction();
|
|
69
|
+
try {
|
|
70
|
+
const result = await operation(newQueryRunner.manager);
|
|
71
|
+
await newQueryRunner.commitTransaction();
|
|
72
|
+
return result;
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
await newQueryRunner.rollbackTransaction();
|
|
76
|
+
throw error;
|
|
77
|
+
}
|
|
78
|
+
finally {
|
|
79
|
+
await newQueryRunner.release();
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
async withoutTransaction(operation) {
|
|
83
|
+
return operation(this.dataSource.manager);
|
|
84
|
+
}
|
|
85
|
+
async cleanDatabase(tableNames) {
|
|
86
|
+
const manager = this.dataSource.manager;
|
|
87
|
+
const tablesToClean = tableNames || this.cleanupOrder;
|
|
88
|
+
if (tablesToClean.length === 0) {
|
|
89
|
+
console.warn('cleanDatabase called but no tables specified and cleanupOrder is empty');
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
const sortedTables = tableNames
|
|
93
|
+
? [...tableNames].sort((a, b) => {
|
|
94
|
+
const indexA = this.cleanupOrder.indexOf(a);
|
|
95
|
+
const indexB = this.cleanupOrder.indexOf(b);
|
|
96
|
+
if (indexA === -1)
|
|
97
|
+
return 1;
|
|
98
|
+
if (indexB === -1)
|
|
99
|
+
return -1;
|
|
100
|
+
return indexA - indexB;
|
|
101
|
+
})
|
|
102
|
+
: tablesToClean;
|
|
103
|
+
for (const tableName of sortedTables) {
|
|
104
|
+
try {
|
|
105
|
+
const quotedName = this.quoteTableName(tableName);
|
|
106
|
+
await manager.query(`DELETE FROM ${quotedName}`);
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
110
|
+
console.warn(`Could not clean table ${tableName}: ${errorMessage}`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
quoteTableName(tableName) {
|
|
115
|
+
switch (this.dialect) {
|
|
116
|
+
case 'mssql':
|
|
117
|
+
return `[${tableName}]`;
|
|
118
|
+
case 'postgres':
|
|
119
|
+
return `"${tableName}"`;
|
|
120
|
+
case 'mysql':
|
|
121
|
+
return `\`${tableName}\``;
|
|
122
|
+
default:
|
|
123
|
+
return tableName;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
getRepository(entityClass) {
|
|
127
|
+
return this.dataSource.getRepository(entityClass);
|
|
128
|
+
}
|
|
129
|
+
getDataSource() {
|
|
130
|
+
return this.dataSource;
|
|
131
|
+
}
|
|
132
|
+
async entityExists(entityClass, criteria) {
|
|
133
|
+
const repository = this.getRepository(entityClass);
|
|
134
|
+
const count = await repository.count({ where: criteria });
|
|
135
|
+
return count > 0;
|
|
136
|
+
}
|
|
137
|
+
async countEntities(entityClass, criteria) {
|
|
138
|
+
const repository = this.getRepository(entityClass);
|
|
139
|
+
return repository.count(criteria ? { where: criteria } : {});
|
|
140
|
+
}
|
|
141
|
+
async close() {
|
|
142
|
+
if (this.transactionStarted) {
|
|
143
|
+
await this.rollbackTransaction();
|
|
144
|
+
}
|
|
145
|
+
if (this.dataSource.isInitialized) {
|
|
146
|
+
await this.dataSource.destroy();
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
isTransactionActive() {
|
|
150
|
+
return this.transactionStarted;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
exports.DatabaseTestHelper = DatabaseTestHelper;
|
|
154
|
+
//# sourceMappingURL=database-test.helper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database-test.helper.js","sourceRoot":"","sources":["../../../src/helpers/database-test.helper.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { DatabaseTestHelper, DatabaseTestHelperConfig, } from './database-test.helper';
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DatabaseTestHelper = void 0;
|
|
4
|
+
var database_test_helper_1 = require("./database-test.helper");
|
|
5
|
+
Object.defineProperty(exports, "DatabaseTestHelper", { enumerable: true, get: function () { return database_test_helper_1.DatabaseTestHelper; } });
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/helpers/index.ts"],"names":[],"mappings":";;;AAMA,+DAGgC;AAF9B,0HAAA,kBAAkB,OAAA"}
|