@uql/core 3.1.0 → 3.1.2

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.
Files changed (170) hide show
  1. package/CHANGELOG.md +134 -176
  2. package/README.md +413 -0
  3. package/package.json +31 -26
  4. package/dist/package.json +0 -131
  5. package/src/@types/index.d.ts +0 -1
  6. package/src/@types/jest.d.ts +0 -6
  7. package/src/browser/http/bus.spec.ts +0 -22
  8. package/src/browser/http/bus.ts +0 -17
  9. package/src/browser/http/http.spec.ts +0 -70
  10. package/src/browser/http/http.ts +0 -55
  11. package/src/browser/http/index.ts +0 -2
  12. package/src/browser/index.ts +0 -4
  13. package/src/browser/options.spec.ts +0 -37
  14. package/src/browser/options.ts +0 -18
  15. package/src/browser/querier/genericClientRepository.spec.ts +0 -105
  16. package/src/browser/querier/genericClientRepository.ts +0 -49
  17. package/src/browser/querier/httpQuerier.ts +0 -82
  18. package/src/browser/querier/index.ts +0 -3
  19. package/src/browser/querier/querier.util.spec.ts +0 -35
  20. package/src/browser/querier/querier.util.ts +0 -18
  21. package/src/browser/type/clientQuerier.ts +0 -45
  22. package/src/browser/type/clientQuerierPool.ts +0 -5
  23. package/src/browser/type/clientRepository.ts +0 -22
  24. package/src/browser/type/index.ts +0 -4
  25. package/src/browser/type/request.ts +0 -25
  26. package/src/dialect/abstractDialect.ts +0 -28
  27. package/src/dialect/abstractSqlDialect-spec.ts +0 -1309
  28. package/src/dialect/abstractSqlDialect.ts +0 -805
  29. package/src/dialect/index.ts +0 -3
  30. package/src/dialect/namingStrategy.spec.ts +0 -52
  31. package/src/dialect/queryContext.ts +0 -69
  32. package/src/entity/decorator/definition.spec.ts +0 -736
  33. package/src/entity/decorator/definition.ts +0 -265
  34. package/src/entity/decorator/entity.ts +0 -8
  35. package/src/entity/decorator/field.ts +0 -9
  36. package/src/entity/decorator/id.ts +0 -9
  37. package/src/entity/decorator/index.ts +0 -5
  38. package/src/entity/decorator/relation.spec.ts +0 -41
  39. package/src/entity/decorator/relation.ts +0 -34
  40. package/src/entity/index.ts +0 -1
  41. package/src/express/@types/express.d.ts +0 -8
  42. package/src/express/@types/index.d.ts +0 -1
  43. package/src/express/index.ts +0 -2
  44. package/src/express/querierMiddleware.ts +0 -217
  45. package/src/express/query.util.spec.ts +0 -40
  46. package/src/express/query.util.ts +0 -21
  47. package/src/index.ts +0 -9
  48. package/src/maria/index.ts +0 -3
  49. package/src/maria/mariaDialect.spec.ts +0 -207
  50. package/src/maria/mariaDialect.ts +0 -42
  51. package/src/maria/mariaQuerierPool.test.ts +0 -23
  52. package/src/maria/mariadbQuerier.test.ts +0 -23
  53. package/src/maria/mariadbQuerier.ts +0 -45
  54. package/src/maria/mariadbQuerierPool.ts +0 -21
  55. package/src/migrate/cli.ts +0 -301
  56. package/src/migrate/generator/index.ts +0 -4
  57. package/src/migrate/generator/mongoSchemaGenerator.spec.ts +0 -112
  58. package/src/migrate/generator/mongoSchemaGenerator.ts +0 -115
  59. package/src/migrate/generator/mysqlSchemaGenerator.spec.ts +0 -34
  60. package/src/migrate/generator/mysqlSchemaGenerator.ts +0 -92
  61. package/src/migrate/generator/postgresSchemaGenerator.spec.ts +0 -44
  62. package/src/migrate/generator/postgresSchemaGenerator.ts +0 -127
  63. package/src/migrate/generator/sqliteSchemaGenerator.spec.ts +0 -33
  64. package/src/migrate/generator/sqliteSchemaGenerator.ts +0 -81
  65. package/src/migrate/index.ts +0 -41
  66. package/src/migrate/introspection/index.ts +0 -4
  67. package/src/migrate/introspection/mongoIntrospector.spec.ts +0 -75
  68. package/src/migrate/introspection/mongoIntrospector.ts +0 -47
  69. package/src/migrate/introspection/mysqlIntrospector.spec.ts +0 -113
  70. package/src/migrate/introspection/mysqlIntrospector.ts +0 -278
  71. package/src/migrate/introspection/postgresIntrospector.spec.ts +0 -112
  72. package/src/migrate/introspection/postgresIntrospector.ts +0 -329
  73. package/src/migrate/introspection/sqliteIntrospector.spec.ts +0 -112
  74. package/src/migrate/introspection/sqliteIntrospector.ts +0 -296
  75. package/src/migrate/migrator-mongo.test.ts +0 -54
  76. package/src/migrate/migrator.spec.ts +0 -255
  77. package/src/migrate/migrator.test.ts +0 -94
  78. package/src/migrate/migrator.ts +0 -719
  79. package/src/migrate/namingStrategy.spec.ts +0 -22
  80. package/src/migrate/schemaGenerator-advanced.spec.ts +0 -138
  81. package/src/migrate/schemaGenerator.spec.ts +0 -190
  82. package/src/migrate/schemaGenerator.ts +0 -478
  83. package/src/migrate/storage/databaseStorage.spec.ts +0 -69
  84. package/src/migrate/storage/databaseStorage.ts +0 -100
  85. package/src/migrate/storage/index.ts +0 -2
  86. package/src/migrate/storage/jsonStorage.ts +0 -58
  87. package/src/migrate/type.ts +0 -1
  88. package/src/mongo/index.ts +0 -3
  89. package/src/mongo/mongoDialect.spec.ts +0 -251
  90. package/src/mongo/mongoDialect.ts +0 -238
  91. package/src/mongo/mongodbQuerier.test.ts +0 -45
  92. package/src/mongo/mongodbQuerier.ts +0 -256
  93. package/src/mongo/mongodbQuerierPool.test.ts +0 -25
  94. package/src/mongo/mongodbQuerierPool.ts +0 -24
  95. package/src/mysql/index.ts +0 -3
  96. package/src/mysql/mysql2Querier.test.ts +0 -20
  97. package/src/mysql/mysql2Querier.ts +0 -49
  98. package/src/mysql/mysql2QuerierPool.test.ts +0 -20
  99. package/src/mysql/mysql2QuerierPool.ts +0 -21
  100. package/src/mysql/mysqlDialect.spec.ts +0 -20
  101. package/src/mysql/mysqlDialect.ts +0 -16
  102. package/src/namingStrategy/defaultNamingStrategy.ts +0 -18
  103. package/src/namingStrategy/index.spec.ts +0 -36
  104. package/src/namingStrategy/index.ts +0 -2
  105. package/src/namingStrategy/snakeCaseNamingStrategy.ts +0 -15
  106. package/src/options.spec.ts +0 -41
  107. package/src/options.ts +0 -18
  108. package/src/postgres/index.ts +0 -3
  109. package/src/postgres/manual-types.d.ts +0 -4
  110. package/src/postgres/pgQuerier.test.ts +0 -25
  111. package/src/postgres/pgQuerier.ts +0 -45
  112. package/src/postgres/pgQuerierPool.test.ts +0 -28
  113. package/src/postgres/pgQuerierPool.ts +0 -21
  114. package/src/postgres/postgresDialect.spec.ts +0 -428
  115. package/src/postgres/postgresDialect.ts +0 -144
  116. package/src/querier/abstractQuerier-test.ts +0 -584
  117. package/src/querier/abstractQuerier.ts +0 -353
  118. package/src/querier/abstractQuerierPool-test.ts +0 -20
  119. package/src/querier/abstractQuerierPool.ts +0 -18
  120. package/src/querier/abstractSqlQuerier-spec.ts +0 -979
  121. package/src/querier/abstractSqlQuerier-test.ts +0 -21
  122. package/src/querier/abstractSqlQuerier.ts +0 -138
  123. package/src/querier/decorator/index.ts +0 -3
  124. package/src/querier/decorator/injectQuerier.spec.ts +0 -74
  125. package/src/querier/decorator/injectQuerier.ts +0 -45
  126. package/src/querier/decorator/serialized.spec.ts +0 -98
  127. package/src/querier/decorator/serialized.ts +0 -13
  128. package/src/querier/decorator/transactional.spec.ts +0 -240
  129. package/src/querier/decorator/transactional.ts +0 -56
  130. package/src/querier/index.ts +0 -4
  131. package/src/repository/genericRepository.spec.ts +0 -111
  132. package/src/repository/genericRepository.ts +0 -74
  133. package/src/repository/index.ts +0 -1
  134. package/src/sqlite/index.ts +0 -3
  135. package/src/sqlite/manual-types.d.ts +0 -4
  136. package/src/sqlite/sqliteDialect.spec.ts +0 -155
  137. package/src/sqlite/sqliteDialect.ts +0 -76
  138. package/src/sqlite/sqliteQuerier.spec.ts +0 -36
  139. package/src/sqlite/sqliteQuerier.test.ts +0 -21
  140. package/src/sqlite/sqliteQuerier.ts +0 -37
  141. package/src/sqlite/sqliteQuerierPool.test.ts +0 -12
  142. package/src/sqlite/sqliteQuerierPool.ts +0 -38
  143. package/src/test/entityMock.ts +0 -375
  144. package/src/test/index.ts +0 -3
  145. package/src/test/it.util.ts +0 -69
  146. package/src/test/spec.util.ts +0 -57
  147. package/src/type/entity.ts +0 -218
  148. package/src/type/index.ts +0 -9
  149. package/src/type/migration.ts +0 -241
  150. package/src/type/namingStrategy.ts +0 -17
  151. package/src/type/querier.ts +0 -143
  152. package/src/type/querierPool.ts +0 -26
  153. package/src/type/query.ts +0 -506
  154. package/src/type/repository.ts +0 -142
  155. package/src/type/universalQuerier.ts +0 -133
  156. package/src/type/utility.ts +0 -21
  157. package/src/util/dialect.util-extra.spec.ts +0 -96
  158. package/src/util/dialect.util.spec.ts +0 -23
  159. package/src/util/dialect.util.ts +0 -134
  160. package/src/util/index.ts +0 -5
  161. package/src/util/object.util.spec.ts +0 -29
  162. package/src/util/object.util.ts +0 -27
  163. package/src/util/raw.ts +0 -11
  164. package/src/util/sql.util-extra.spec.ts +0 -17
  165. package/src/util/sql.util.spec.ts +0 -208
  166. package/src/util/sql.util.ts +0 -104
  167. package/src/util/string.util.spec.ts +0 -46
  168. package/src/util/string.util.ts +0 -35
  169. package/tsconfig.build.json +0 -5
  170. package/tsconfig.json +0 -8
@@ -1,584 +0,0 @@
1
- import { expect } from 'bun:test';
2
- import { getEntities } from '../entity/index.js';
3
- import {
4
- Company,
5
- InventoryAdjustment,
6
- Item,
7
- ItemAdjustment,
8
- LedgerAccount,
9
- MeasureUnit,
10
- type Spec,
11
- Tag,
12
- TaxCategory,
13
- User,
14
- } from '../test/index.js';
15
- import type { Querier, QuerierPool } from '../type/index.js';
16
-
17
- export abstract class AbstractQuerierIt<Q extends Querier> implements Spec {
18
- querier: Q;
19
-
20
- constructor(protected pool: QuerierPool<Q>) {}
21
-
22
- async beforeAll() {
23
- const querier = await this.pool.getQuerier();
24
- try {
25
- this.querier = querier;
26
- await this.dropTables();
27
- await this.createTables();
28
- } finally {
29
- await querier.release();
30
- this.querier = undefined;
31
- }
32
- }
33
-
34
- async beforeEach() {
35
- this.querier = await this.pool.getQuerier();
36
- await this.clearTables();
37
- }
38
-
39
- async afterEach() {
40
- await this.querier.release();
41
- }
42
-
43
- async afterAll() {
44
- await this.pool.end();
45
- }
46
-
47
- shouldGetRepository() {
48
- const repository = this.querier.getRepository(User);
49
- expect(repository).toBeDefined();
50
- }
51
-
52
- async shouldInsertMany() {
53
- const ids = await this.querier.insertMany(User, [
54
- {
55
- name: 'Some Name A',
56
- email: 'someemaila@example.com',
57
- password: '123456789a!',
58
- },
59
- {
60
- name: 'Some Name B',
61
- email: 'someemailb@example.com',
62
- password: '123456789b!',
63
- },
64
- ]);
65
- expect(ids).toHaveLength(2);
66
- for (const id of ids) {
67
- expect(id).toBeDefined();
68
- }
69
- }
70
-
71
- async shouldInsertManyEmpty() {
72
- const ids = await this.querier.insertMany(User, []);
73
- expect(ids).toEqual([]);
74
- }
75
-
76
- async shouldInsertOne() {
77
- const creatorId = await this.querier.insertOne(User, {
78
- name: 'Some Name C',
79
- email: 'someemailc@example.com',
80
- password: '123456789z!',
81
- });
82
- expect(creatorId).toBeDefined();
83
-
84
- const companyId = await this.querier.insertOne(Company, {
85
- name: 'Some Name C',
86
- creatorId,
87
- });
88
- expect(companyId).toBeDefined();
89
-
90
- const taxCategoryId = await this.querier.insertOne(TaxCategory, {
91
- name: 'Some Name C',
92
- description: 'Some Description Z',
93
- creatorId,
94
- companyId,
95
- });
96
- expect(taxCategoryId).toBeDefined();
97
- }
98
-
99
- async shouldInsertOneWithOnInsertId() {
100
- const id1 = await this.querier.insertOne(TaxCategory, {
101
- name: 'Some Name',
102
- });
103
- const id2 = await this.querier.insertOne(TaxCategory, {
104
- pk: '123',
105
- name: 'Some Name',
106
- });
107
- expect(id1).toBeDefined();
108
- expect(id2).toBeDefined();
109
- }
110
-
111
- async shouldInsertManyWithSpecifiedIdsAndOnInsertIdAsDefault() {
112
- const ids = await this.querier.insertMany(TaxCategory, [
113
- {
114
- name: 'Some Name A',
115
- },
116
- {
117
- pk: '50',
118
- name: 'Some Name B',
119
- },
120
- {
121
- name: 'Some Name C',
122
- },
123
- {
124
- pk: '70',
125
- name: 'Some Name D',
126
- },
127
- ]);
128
- expect(ids).toHaveLength(4);
129
- for (const id of ids) {
130
- expect(id).toBeDefined();
131
- }
132
- }
133
-
134
- async shouldInsertManyWithAutoIncrementIdAsDefault() {
135
- const ids = await this.querier.insertMany(LedgerAccount, [
136
- {
137
- name: 'Some Name A',
138
- },
139
- {
140
- name: 'Some Name B',
141
- },
142
- {
143
- name: 'Some Name C',
144
- },
145
- ]);
146
- expect(ids).toHaveLength(3);
147
- for (const id of ids) {
148
- expect(id).toBeDefined();
149
- }
150
- const founds = await this.querier.findMany(LedgerAccount, {});
151
- expect(founds.map(({ id }) => id)).toEqual(ids);
152
- }
153
-
154
- async shouldInsertOneAndCascadeOneToOne() {
155
- const payload = {
156
- name: 'Some Name D',
157
- createdAt: 123,
158
- profile: { picture: 'abc', createdAt: 123 },
159
- } satisfies User;
160
- const id = await this.querier.insertOne(User, payload);
161
- expect(id).toBeDefined();
162
- const found = await this.querier.findOneById(User, id, { $select: { profile: true } });
163
- expect(found).toMatchObject({ id, profile: payload.profile });
164
- }
165
-
166
- async shouldInsertOneAndCascadeManyToOne() {
167
- const payload = {
168
- name: 'Centimeter',
169
- createdAt: 123,
170
- category: { name: 'Metric', createdAt: 123 },
171
- } satisfies MeasureUnit;
172
-
173
- const id = await this.querier.insertOne(MeasureUnit, payload);
174
-
175
- expect(id).toBeDefined();
176
-
177
- const found = await this.querier.findOneById(MeasureUnit, id, { $select: { category: true } });
178
-
179
- expect(found).toMatchObject({ id, category: payload.category });
180
- }
181
-
182
- async shouldInsertSpecialChars() {
183
- const payload: MeasureUnit = {
184
- name: `I'm Cielo! How are you doing today? It's been a while since we last talked`,
185
- createdAt: 123,
186
- };
187
-
188
- const id = await this.querier.insertOne(MeasureUnit, payload);
189
-
190
- expect(id).toBeDefined();
191
-
192
- const found = await this.querier.findOneById(MeasureUnit, id);
193
-
194
- expect(found).toMatchObject(payload);
195
- }
196
-
197
- async shouldInsertOneAndCascadeOneToMany() {
198
- const itemAdjustments: ItemAdjustment[] = [{ buyPrice: 50 }, { buyPrice: 300 }];
199
-
200
- const date = new Date();
201
-
202
- const inventoryAdjustmentId = await this.querier.insertOne(InventoryAdjustment, {
203
- description: 'some description',
204
- date,
205
- itemAdjustments,
206
- });
207
-
208
- expect(inventoryAdjustmentId).toBeDefined();
209
-
210
- const inventoryAdjustmentFound = await this.querier.findOneById(InventoryAdjustment, inventoryAdjustmentId, {
211
- $select: { itemAdjustments: true },
212
- });
213
-
214
- expect(inventoryAdjustmentFound).toMatchObject({
215
- id: inventoryAdjustmentId,
216
- itemAdjustments,
217
- });
218
-
219
- const itemAdjustmentsFound = await this.querier.findMany(ItemAdjustment, { $where: { inventoryAdjustmentId } });
220
-
221
- expect(itemAdjustmentsFound).toMatchObject(itemAdjustments);
222
- }
223
-
224
- async shouldInsertOneAndCascadeOneToManyWithSpecificFields() {
225
- const itemAdjustments: ItemAdjustment[] = [{ buyPrice: 50 }, { buyPrice: 300 }];
226
-
227
- const inventoryAdjustmentId = await this.querier.insertOne(InventoryAdjustment, {
228
- description: 'some description',
229
- itemAdjustments: itemAdjustments.slice(),
230
- });
231
-
232
- expect(inventoryAdjustmentId).toBeDefined();
233
-
234
- const inventoryAdjustmentFound = await this.querier.findOneById(InventoryAdjustment, inventoryAdjustmentId, {
235
- $select: { itemAdjustments: ['buyPrice'] },
236
- });
237
-
238
- expect(inventoryAdjustmentFound).toMatchObject({
239
- id: inventoryAdjustmentId,
240
- itemAdjustments,
241
- });
242
-
243
- const itemAdjustmentsFound = await this.querier.findMany(ItemAdjustment, { $where: { inventoryAdjustmentId } });
244
-
245
- expect(itemAdjustmentsFound).toMatchObject(itemAdjustments);
246
- }
247
-
248
- async shouldUpdateOneAndCascadeOneToMany() {
249
- const itemAdjustments: ItemAdjustment[] = [{ buyPrice: 50 }, { buyPrice: 300 }];
250
-
251
- const inventoryAdjustmentId = await this.querier.insertOne(InventoryAdjustment, {
252
- description: 'some description',
253
- });
254
-
255
- expect(inventoryAdjustmentId).toBeDefined();
256
-
257
- const changes = await this.querier.updateOneById(InventoryAdjustment, inventoryAdjustmentId, {
258
- itemAdjustments,
259
- });
260
-
261
- expect(changes).toBe(1);
262
-
263
- const inventoryAdjustmentFound = await this.querier.findOneById(InventoryAdjustment, inventoryAdjustmentId, {
264
- $select: { itemAdjustments: ['buyPrice'] },
265
- });
266
-
267
- expect(inventoryAdjustmentFound).toMatchObject({
268
- id: inventoryAdjustmentId,
269
- itemAdjustments,
270
- });
271
-
272
- const itemAdjustmentsFound = await this.querier.findMany(ItemAdjustment, { $where: { inventoryAdjustmentId } });
273
-
274
- expect(itemAdjustmentsFound).toMatchObject(itemAdjustments);
275
- }
276
-
277
- async shouldUpdateOneByIdAndCascadeOneToManyNull() {
278
- const id = await this.querier.insertOne(InventoryAdjustment, { itemAdjustments: [{}, {}] });
279
-
280
- await expect(this.querier.count(ItemAdjustment, {})).resolves.toBe(2);
281
-
282
- await this.querier.updateOneById(InventoryAdjustment, id, {
283
- itemAdjustments: null,
284
- });
285
-
286
- await expect(this.querier.count(ItemAdjustment, {})).resolves.toBe(0);
287
- }
288
-
289
- async shouldUpdateManyAndCascadeOneToManyNull() {
290
- await this.querier.insertOne(InventoryAdjustment, { itemAdjustments: [{}, {}] });
291
-
292
- await expect(this.querier.count(ItemAdjustment, {})).resolves.toBe(2);
293
-
294
- await this.querier.updateMany(
295
- InventoryAdjustment,
296
- { $where: {} },
297
- {
298
- itemAdjustments: null,
299
- },
300
- );
301
-
302
- await expect(this.querier.count(ItemAdjustment, {})).resolves.toBe(0);
303
- }
304
-
305
- async shouldInsertOneAndCascadeManyToMany() {
306
- const payload: Item = {
307
- name: 'item one',
308
- createdAt: 1,
309
- tags: [
310
- {
311
- name: 'tag one',
312
- createdAt: 1,
313
- },
314
- {
315
- name: 'tag two',
316
- createdAt: 1,
317
- },
318
- ],
319
- };
320
-
321
- const id = await this.querier.insertOne(Item, payload);
322
-
323
- expect(id).toBeDefined();
324
-
325
- const foundItem = await this.querier.findOneById(Item, id, {
326
- $select: { name: true, createdAt: true, tags: ['name', 'createdAt'] },
327
- });
328
-
329
- expect(foundItem).toMatchObject({
330
- id,
331
- ...payload,
332
- });
333
-
334
- const foundTags = await this.querier.findMany(Tag, {
335
- $select: { name: true, createdAt: true, items: ['name', 'createdAt'] },
336
- });
337
-
338
- delete foundItem.tags;
339
-
340
- expect(foundTags).toMatchObject(payload.tags.map((tag) => ({ ...tag, items: [foundItem] })));
341
- }
342
-
343
- async shouldUpdateOneAndCascadeManyToMany() {
344
- const id = await this.querier.insertOne(Item, { createdAt: 1 });
345
- const payload: Item = {
346
- name: 'item one',
347
- updatedAt: 1,
348
- tags: [
349
- {
350
- name: 'tag one',
351
- createdAt: 1,
352
- },
353
- {
354
- name: 'tag two',
355
- createdAt: 1,
356
- },
357
- ],
358
- };
359
-
360
- await this.querier.updateOneById(Item, id, payload);
361
-
362
- const found = await this.querier.findOneById(Item, id, {
363
- $select: { name: true, updatedAt: true, tags: true },
364
- });
365
-
366
- expect(found).toMatchObject({
367
- id,
368
- ...payload,
369
- });
370
- }
371
-
372
- async shouldUpsertOne() {
373
- const pk = '507f1f77bcf86cd799439011';
374
- const record1 = await this.querier.findOne(TaxCategory, {
375
- $select: ['name'],
376
- $where: { pk },
377
- });
378
- expect(record1).toBeUndefined();
379
- await this.querier.upsertOne(
380
- TaxCategory,
381
- { pk: true },
382
- {
383
- pk,
384
- name: 'Some Name C',
385
- },
386
- );
387
- const record2 = await this.querier.findOne(TaxCategory, {
388
- $select: ['name'],
389
- $where: { pk },
390
- });
391
- expect(record2).toMatchObject({
392
- name: 'Some Name C',
393
- });
394
- await this.querier.upsertOne(
395
- TaxCategory,
396
- { pk: true },
397
- {
398
- pk,
399
- name: 'Some Name D',
400
- },
401
- );
402
- const record3 = await this.querier.findOne(TaxCategory, {
403
- $select: ['name'],
404
- $where: { pk },
405
- });
406
- expect(record3).toMatchObject({
407
- name: 'Some Name D',
408
- });
409
- }
410
-
411
- async shouldFindOne() {
412
- await Promise.all([this.shouldInsertMany(), this.shouldInsertOne()]);
413
-
414
- const found = await this.querier.findOne(User, {
415
- $select: ['id', 'name', 'email', 'password'],
416
- $where: {
417
- email: 'someemaila@example.com',
418
- },
419
- });
420
-
421
- expect(found).toMatchObject({
422
- name: 'Some Name A',
423
- email: 'someemaila@example.com',
424
- password: '123456789a!',
425
- });
426
-
427
- const notFound = await this.querier.findOne(User, {
428
- $where: {
429
- name: 'some name',
430
- },
431
- });
432
-
433
- expect(notFound).toBeUndefined();
434
- }
435
-
436
- async shouldCount() {
437
- await expect(this.querier.count(User, {})).resolves.toBe(0);
438
-
439
- await Promise.all([this.shouldInsertMany(), this.shouldInsertOne()]);
440
-
441
- await expect(this.querier.count(User, {})).resolves.toBe(3);
442
- await expect(this.querier.count(User, { $where: { companyId: null } })).resolves.toBe(3);
443
- await expect(this.querier.count(User, { $where: { companyId: 1 } })).resolves.toBe(0);
444
- }
445
-
446
- async shouldUpdateMany() {
447
- await Promise.all([this.shouldInsertMany(), this.shouldInsertOne()]);
448
-
449
- await expect(this.querier.updateMany(User, { $where: { companyId: 1 } }, { companyId: null })).resolves.toBe(0);
450
- await expect(this.querier.updateMany(User, { $where: { companyId: null } }, { companyId: 1 })).resolves.toBe(3);
451
- await expect(this.querier.updateMany(User, { $where: { companyId: 1 } }, { companyId: null })).resolves.toBe(3);
452
- }
453
-
454
- async shouldThrowIfUnknownComparisonOperator() {
455
- await expect(
456
- this.querier.findMany(User, {
457
- $where: { name: { $someInvalidOperator: 'some' } as any },
458
- }),
459
- ).rejects.toThrow('unknown operator: $someInvalidOperator');
460
- }
461
-
462
- async shouldThrowWhenRollbackTransactionWithoutBeginTransaction() {
463
- await expect(this.querier.rollbackTransaction()).rejects.toThrow('not a pending transaction');
464
- }
465
-
466
- async shouldCommit() {
467
- await expect(this.querier.count(User, {})).resolves.toBe(0);
468
- await this.querier.beginTransaction();
469
- await this.querier.insertOne(User, {});
470
- await expect(this.querier.count(User, {})).resolves.toBe(1);
471
- await this.querier.commitTransaction();
472
- await expect(this.querier.count(User, {})).resolves.toBe(1);
473
- await this.querier.release();
474
- }
475
-
476
- async shouldRollback() {
477
- await expect(this.querier.count(User, {})).resolves.toBe(0);
478
- await this.querier.beginTransaction();
479
- await this.querier.insertOne(User, {});
480
- await expect(this.querier.count(User, {})).resolves.toBe(1);
481
- await this.querier.rollbackTransaction();
482
- await expect(this.querier.count(User, {})).resolves.toBe(0);
483
- await this.querier.release();
484
- }
485
-
486
- async shouldThrowWhenBeginTransactionAfterBeginTransaction() {
487
- expect(this.querier.hasOpenTransaction).toBeFalsy();
488
- await this.querier.beginTransaction();
489
- expect(this.querier.hasOpenTransaction).toBe(true);
490
- await expect(this.querier.beginTransaction()).rejects.toThrow('pending transaction');
491
- await expect(this.querier.release()).rejects.toThrow('pending transaction');
492
- await this.querier.rollbackTransaction();
493
- await this.querier.release();
494
- }
495
-
496
- async shouldReturnTransactionValue() {
497
- const affectedRows = await this.querier.transaction(async () => {
498
- await this.shouldInsertMany();
499
- const count = await this.querier.count(User, {});
500
- await this.querier.deleteMany(User, {});
501
- return count;
502
- });
503
- expect(affectedRows).toBe(2);
504
- }
505
-
506
- async shouldThrowWhenCommitTransactionWithoutBeginTransaction() {
507
- await expect(this.querier.commitTransaction()).rejects.toThrow('not a pending transaction');
508
- }
509
-
510
- async shouldSelectOneToManyEmpty() {
511
- const inventoryAdjustment = await this.querier.findOneById(InventoryAdjustment, -1, {
512
- $select: { itemAdjustments: true, creator: true },
513
- });
514
- expect(inventoryAdjustment).toBeUndefined();
515
-
516
- const inventoryAdjustments = await this.querier.findMany(InventoryAdjustment, {
517
- $select: { itemAdjustments: true },
518
- });
519
- expect(inventoryAdjustments).toHaveLength(0);
520
- }
521
-
522
- async shouldSelectOneToMany() {
523
- await this.shouldInsertOne();
524
-
525
- const [user, company] = await Promise.all([
526
- this.querier.findOne(User, { $select: ['id'] }),
527
- this.querier.findOne(Company, { $select: ['id'] }),
528
- ]);
529
-
530
- const [firstItemId, secondItemId] = await this.querier.insertMany(Item, [
531
- {
532
- name: 'some item name a',
533
- creatorId: user.id,
534
- companyId: company.id,
535
- },
536
- {
537
- name: 'some item name b',
538
- creatorId: user.id,
539
- companyId: company.id,
540
- },
541
- ]);
542
-
543
- const inventoryAdjustmentId = await this.querier.insertOne(InventoryAdjustment, {
544
- description: 'some inventory adjustment',
545
- creatorId: user.id,
546
- companyId: company.id,
547
- itemAdjustments: [
548
- { buyPrice: 1000, itemId: firstItemId },
549
- { buyPrice: 2000, itemId: secondItemId },
550
- ],
551
- });
552
-
553
- const inventoryAdjustmentFound = await this.querier.findOneById(InventoryAdjustment, inventoryAdjustmentId, {
554
- $select: { itemAdjustments: true, creator: true },
555
- });
556
-
557
- expect(inventoryAdjustmentFound).toMatchObject({
558
- id: inventoryAdjustmentId,
559
- itemAdjustments: [
560
- { buyPrice: 1000, itemId: firstItemId },
561
- { buyPrice: 2000, itemId: secondItemId },
562
- ],
563
- creator: {
564
- email: 'someemailc@example.com',
565
- name: 'Some Name C',
566
- },
567
- });
568
- }
569
-
570
- async shouldDeleteMany() {
571
- await Promise.all([this.shouldInsertMany(), this.shouldInsertOne()]);
572
- await expect(this.querier.deleteMany(User, { $where: { companyId: 1 } })).resolves.toBe(0);
573
- await expect(this.querier.deleteMany(User, { $where: { companyId: null } })).resolves.toBe(3);
574
- }
575
-
576
- async clearTables() {
577
- const entities = getEntities();
578
- await Promise.all(entities.map((entity) => this.querier.deleteMany(entity, {})));
579
- }
580
-
581
- abstract createTables(): Promise<void>;
582
-
583
- abstract dropTables(): Promise<void>;
584
- }