1
1
import { DynamicModule } from '@nestjs/common' ;
2
+ import { Test , TestingModule } from '@nestjs/testing' ;
2
3
import { MikroOrmModule } from '@mikro-orm/nestjs' ;
3
- import { MikroORM } from '@mikro-orm/core' ;
4
+ import { EntityManager , MikroORM } from '@mikro-orm/core' ;
4
5
import { PostgreSqlDriver } from '@mikro-orm/postgresql' ;
6
+ import { SqlHighlighter } from '@mikro-orm/sql-highlighter' ;
7
+ import { QueryField } from '@klerick/json-api-nestjs-shared' ;
5
8
6
9
import { IMemoryDb } from 'pg-mem' ;
7
10
@@ -13,20 +16,54 @@ import {
13
16
UserGroups ,
14
17
Users ,
15
18
} from './entities' ;
19
+ import { ObjectLiteral } from '../../types' ;
20
+ import { Query } from '../../modules/mixin/zod' ;
21
+
22
+ import {
23
+ CurrentEntityManager ,
24
+ CurrentEntityMetadata ,
25
+ CurrentEntityRepository ,
26
+ CurrentMicroOrmProvider ,
27
+ OrmServiceFactory ,
28
+ EntityPropsMap ,
29
+ } from '../../modules/micro-orm/factory' ;
30
+ import { MicroOrmUtilService } from '../../modules/micro-orm/service/micro-orm-util.service' ;
31
+ import { CURRENT_ENTITY , GLOBAL_MODULE_OPTIONS_TOKEN } from '../../constants' ;
16
32
17
33
export * from './entities' ;
18
34
export * from './utils' ;
19
35
20
36
export const entities = [ Users , UserGroups , Roles , Comments , Addresses , Notes ] ;
21
37
38
+ import { sharedConnect , initMikroOrm , pullAllData } from './utils' ;
39
+ import { DEFAULT_ARRAY_TYPE } from '../../modules/micro-orm/constants' ;
40
+ import { JsonApiTransformerService } from '../../modules/mixin/service/json-api-transformer.service' ;
41
+
42
+ export function mockDbPgLiteTestModule ( dbName = `test_db_${ Date . now ( ) } ` ) {
43
+ const mikroORM = {
44
+ provide : MikroORM ,
45
+ useFactory : async ( ) => {
46
+ const knexInst = await sharedConnect ( ) ;
47
+ return initMikroOrm ( knexInst , dbName ) ;
48
+ } ,
49
+ } ;
50
+ return {
51
+ module : MikroOrmModule ,
52
+ providers : [ mikroORM ] ,
53
+ exports : [ mikroORM ] ,
54
+ } ;
55
+ }
56
+
22
57
export function mockDBTestModule ( db : IMemoryDb ) : DynamicModule {
23
58
const mikroORM = {
24
59
provide : MikroORM ,
25
60
useFactory : ( ) =>
26
61
db . adapters . createMikroOrm ( {
62
+ highlighter : new SqlHighlighter ( ) ,
27
63
entities : [ Users , UserGroups , Roles , Comments , Addresses , Notes ] ,
28
64
driver : PostgreSqlDriver ,
29
65
allowGlobalContext : true ,
66
+ debug : [ 'query' , 'query-params' ] ,
30
67
} ) ,
31
68
} ;
32
69
return {
@@ -35,3 +72,81 @@ export function mockDBTestModule(db: IMemoryDb): DynamicModule {
35
72
exports : [ mikroORM ] ,
36
73
} ;
37
74
}
75
+ const readOnlyDbName = `readonly_db_${ Date . now ( ) } ` ;
76
+
77
+ export function dbRandomName ( readOnly = false ) {
78
+ if ( readOnly ) {
79
+ return readOnlyDbName ;
80
+ }
81
+ return `test_db_${ Date . now ( ) } ` ;
82
+ }
83
+
84
+ export async function pullData ( em : EntityManager , count = 1 ) {
85
+ for ( let i = 0 ; i < count ; i ++ ) {
86
+ await pullAllData ( em ) ;
87
+ }
88
+ }
89
+
90
+ export function getModuleForPgLite < E extends ObjectLiteral > (
91
+ entity : E ,
92
+ dbName = `test_db_${ Date . now ( ) } `
93
+ ) : Promise < TestingModule > {
94
+ return Test . createTestingModule ( {
95
+ imports : [ mockDbPgLiteTestModule ( dbName ) ] ,
96
+ providers : [
97
+ CurrentMicroOrmProvider ( ) ,
98
+ CurrentEntityManager ( ) ,
99
+ CurrentEntityMetadata ( ) ,
100
+ CurrentEntityRepository ( entity ) ,
101
+ MicroOrmUtilService ,
102
+ {
103
+ provide : CURRENT_ENTITY ,
104
+ useValue : entity ,
105
+ } ,
106
+ OrmServiceFactory ( ) ,
107
+ EntityPropsMap ( entities as any ) ,
108
+ {
109
+ provide : GLOBAL_MODULE_OPTIONS_TOKEN ,
110
+ useValue : { options : { arrayType : DEFAULT_ARRAY_TYPE } } ,
111
+ } ,
112
+ JsonApiTransformerService ,
113
+ ] ,
114
+ } ) . compile ( ) ;
115
+ }
116
+
117
+ export function getModuleFor < E extends ObjectLiteral > (
118
+ db : IMemoryDb ,
119
+ entity : E
120
+ ) : Promise < TestingModule > {
121
+ return Test . createTestingModule ( {
122
+ imports : [ mockDBTestModule ( db ) ] ,
123
+ providers : [
124
+ CurrentMicroOrmProvider ( ) ,
125
+ CurrentEntityManager ( ) ,
126
+ CurrentEntityMetadata ( ) ,
127
+ CurrentEntityRepository ( entity ) ,
128
+ MicroOrmUtilService ,
129
+ {
130
+ provide : CURRENT_ENTITY ,
131
+ useValue : entity ,
132
+ } ,
133
+ OrmServiceFactory ( ) ,
134
+ ] ,
135
+ } ) . compile ( ) ;
136
+ }
137
+
138
+ export function getDefaultQuery < R extends ObjectLiteral > ( ) : Query < R > {
139
+ return {
140
+ [ QueryField . filter ] : {
141
+ relation : null ,
142
+ target : null ,
143
+ } ,
144
+ [ QueryField . fields ] : null ,
145
+ [ QueryField . include ] : null ,
146
+ [ QueryField . sort ] : null ,
147
+ [ QueryField . page ] : {
148
+ size : 1 ,
149
+ number : 1 ,
150
+ } ,
151
+ } satisfies Query < R > ;
152
+ }
0 commit comments