pure-orm 4.0.2 → 4.1.4
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/.benchmarks/bench-core-baseline.json +303 -0
- package/.eslintrc.json +20 -10
- package/README.md +0 -7
- package/coverage/clover.xml +1493 -1232
- package/coverage/coverage-final.json +103 -103
- package/coverage/lcov-report/dist/src/core.js.html +590 -383
- package/coverage/lcov-report/dist/src/driver-integrations/index.html +20 -20
- package/coverage/lcov-report/dist/src/driver-integrations/pgp.js.html +52 -52
- package/coverage/lcov-report/dist/src/index.html +28 -28
- package/coverage/lcov-report/dist/src/index.js.html +2 -2
- package/coverage/lcov-report/dist/src/orm.js.html +392 -209
- package/coverage/lcov-report/dist/test-utils/blog/entities.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/blog/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/blog/models/article.js.html +15 -15
- package/coverage/lcov-report/dist/test-utils/blog/models/article_tag.js.html +2 -2
- package/coverage/lcov-report/dist/test-utils/blog/models/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/blog/models/person.js.html +13 -13
- package/coverage/lcov-report/dist/test-utils/blog/models/tag.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/five/entities.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/five/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/five/models/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/five/models/line-item.js.html +4 -4
- package/coverage/lcov-report/dist/test-utils/five/models/order.js.html +3 -3
- package/coverage/lcov-report/dist/test-utils/five/models/parcel-event.js.html +6 -6
- package/coverage/lcov-report/dist/test-utils/five/models/parcel-line-item.js.html +7 -7
- package/coverage/lcov-report/dist/test-utils/five/models/parcel.js.html +2 -2
- package/coverage/lcov-report/dist/test-utils/fourteen/entities.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/fourteen/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/fourteen/models/customer.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/fourteen/models/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/fourteen/models/person.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/nine/entities.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/nine/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/nine/models/feature-switch.js.html +6 -6
- package/coverage/lcov-report/dist/test-utils/nine/models/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order/entities.js.html +9 -9
- package/coverage/lcov-report/dist/test-utils/order/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order/models/index.html +14 -14
- package/coverage/lcov-report/dist/test-utils/order/models/line-item.js.html +11 -11
- package/coverage/lcov-report/dist/test-utils/order/models/order.js.html +41 -41
- package/coverage/lcov-report/dist/test-utils/order/models/product-variant.js.html +18 -18
- package/coverage/lcov-report/dist/test-utils/order/models/product.js.html +17 -17
- package/coverage/lcov-report/dist/test-utils/order/models/utm-source.js.html +12 -12
- package/coverage/lcov-report/dist/test-utils/order-more/entities.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order-more/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order-more/models/actual-product-variant.js.html +3 -3
- package/coverage/lcov-report/dist/test-utils/order-more/models/color.js.html +6 -6
- package/coverage/lcov-report/dist/test-utils/order-more/models/customer.js.html +3 -3
- package/coverage/lcov-report/dist/test-utils/order-more/models/gender.js.html +4 -4
- package/coverage/lcov-report/dist/test-utils/order-more/models/index.html +23 -23
- package/coverage/lcov-report/dist/test-utils/order-more/models/inventory-level.js.html +11 -11
- package/coverage/lcov-report/dist/test-utils/order-more/models/line-item.js.html +15 -15
- package/coverage/lcov-report/dist/test-utils/order-more/models/order.js.html +39 -39
- package/coverage/lcov-report/dist/test-utils/order-more/models/parcel-event.js.html +6 -6
- package/coverage/lcov-report/dist/test-utils/order-more/models/parcel-line-item.js.html +7 -7
- package/coverage/lcov-report/dist/test-utils/order-more/models/parcel.js.html +2 -2
- package/coverage/lcov-report/dist/test-utils/order-more/models/physical-address.js.html +12 -12
- package/coverage/lcov-report/dist/test-utils/order-more/models/product-variant-image.js.html +7 -7
- package/coverage/lcov-report/dist/test-utils/order-more/models/product-variant.js.html +22 -22
- package/coverage/lcov-report/dist/test-utils/order-more/models/product.js.html +11 -11
- package/coverage/lcov-report/dist/test-utils/order-more/models/refund.js.html +11 -11
- package/coverage/lcov-report/dist/test-utils/order-more/models/shipment-actual-product-variant.js.html +9 -9
- package/coverage/lcov-report/dist/test-utils/order-more/models/shipment.js.html +4 -4
- package/coverage/lcov-report/dist/test-utils/order-more/models/size.js.html +4 -4
- package/coverage/lcov-report/dist/test-utils/order-more/models/utm-medium.js.html +15 -15
- package/coverage/lcov-report/dist/test-utils/order-more/models/utm-source.js.html +17 -17
- package/coverage/lcov-report/dist/test-utils/six/entities.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/six/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/six/models/customer.js.html +3 -3
- package/coverage/lcov-report/dist/test-utils/six/models/index.html +21 -21
- package/coverage/lcov-report/dist/test-utils/six/models/line-item.js.html +10 -10
- package/coverage/lcov-report/dist/test-utils/six/models/order.js.html +13 -13
- package/coverage/lcov-report/dist/test-utils/six/models/parcel-line-item.js.html +2 -2
- package/coverage/lcov-report/dist/test-utils/six/models/parcel.js.html +2 -2
- package/coverage/lcov-report/dist/test-utils/thirteen/entities.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/thirteen/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/thirteen/models/audience.js.html +2 -2
- package/coverage/lcov-report/dist/test-utils/thirteen/models/brand.js.html +2 -2
- package/coverage/lcov-report/dist/test-utils/thirteen/models/category.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/thirteen/models/index.html +14 -14
- package/coverage/lcov-report/dist/test-utils/thirteen/models/member.js.html +2 -2
- package/coverage/lcov-report/dist/test-utils/thirteen/models/passion.js.html +2 -2
- package/coverage/lcov-report/dist/test-utils/thirteen/models/product.js.html +10 -10
- package/coverage/lcov-report/dist/test-utils/thirteen/models/recommendation-audience.js.html +2 -2
- package/coverage/lcov-report/dist/test-utils/thirteen/models/recommendation.js.html +2 -2
- package/coverage/lcov-report/dist/test-utils/three/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/three/results.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/twelve/entities.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/twelve/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/twelve/models/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/twelve/models/member.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/twelve/models/prompt.js.html +2 -2
- package/coverage/lcov-report/dist/test-utils/two/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/two/results.js.html +1 -1
- package/coverage/lcov-report/index.html +103 -103
- package/coverage/lcov-report/src/core.ts.html +841 -415
- package/coverage/lcov-report/src/driver-integrations/index.html +20 -20
- package/coverage/lcov-report/src/driver-integrations/pgp.ts.html +63 -63
- package/coverage/lcov-report/src/index.html +28 -28
- package/coverage/lcov-report/src/index.ts.html +1 -1
- package/coverage/lcov-report/src/orm.ts.html +388 -298
- package/coverage/lcov-report/test-utils/blog/entities.ts.html +1 -1
- package/coverage/lcov-report/test-utils/blog/index.html +1 -1
- package/coverage/lcov-report/test-utils/blog/models/article.ts.html +15 -15
- package/coverage/lcov-report/test-utils/blog/models/article_tag.ts.html +2 -2
- package/coverage/lcov-report/test-utils/blog/models/index.html +1 -1
- package/coverage/lcov-report/test-utils/blog/models/person.ts.html +13 -13
- package/coverage/lcov-report/test-utils/blog/models/tag.ts.html +1 -1
- package/coverage/lcov-report/test-utils/five/entities.ts.html +1 -1
- package/coverage/lcov-report/test-utils/five/index.html +1 -1
- package/coverage/lcov-report/test-utils/five/models/index.html +1 -1
- package/coverage/lcov-report/test-utils/five/models/line-item.ts.html +4 -4
- package/coverage/lcov-report/test-utils/five/models/order.ts.html +3 -3
- package/coverage/lcov-report/test-utils/five/models/parcel-event.ts.html +6 -6
- package/coverage/lcov-report/test-utils/five/models/parcel-line-item.ts.html +7 -7
- package/coverage/lcov-report/test-utils/five/models/parcel.ts.html +2 -2
- package/coverage/lcov-report/test-utils/fourteen/entities.ts.html +1 -1
- package/coverage/lcov-report/test-utils/fourteen/index.html +1 -1
- package/coverage/lcov-report/test-utils/fourteen/models/customer.ts.html +1 -1
- package/coverage/lcov-report/test-utils/fourteen/models/index.html +1 -1
- package/coverage/lcov-report/test-utils/fourteen/models/person.ts.html +1 -1
- package/coverage/lcov-report/test-utils/nine/entities.ts.html +1 -1
- package/coverage/lcov-report/test-utils/nine/index.html +1 -1
- package/coverage/lcov-report/test-utils/nine/models/feature-switch.ts.html +8 -8
- package/coverage/lcov-report/test-utils/nine/models/index.html +1 -1
- package/coverage/lcov-report/test-utils/order/entities.ts.html +2 -2
- package/coverage/lcov-report/test-utils/order/index.html +1 -1
- package/coverage/lcov-report/test-utils/order/models/index.html +14 -14
- package/coverage/lcov-report/test-utils/order/models/line-item.ts.html +5 -5
- package/coverage/lcov-report/test-utils/order/models/order.ts.html +36 -36
- package/coverage/lcov-report/test-utils/order/models/product-variant.ts.html +13 -13
- package/coverage/lcov-report/test-utils/order/models/product.ts.html +13 -13
- package/coverage/lcov-report/test-utils/order/models/utm-source.ts.html +8 -8
- package/coverage/lcov-report/test-utils/order-more/entities.ts.html +1 -1
- package/coverage/lcov-report/test-utils/order-more/index.html +1 -1
- package/coverage/lcov-report/test-utils/order-more/models/actual-product-variant.ts.html +3 -3
- package/coverage/lcov-report/test-utils/order-more/models/color.ts.html +6 -6
- package/coverage/lcov-report/test-utils/order-more/models/customer.ts.html +3 -3
- package/coverage/lcov-report/test-utils/order-more/models/gender.ts.html +4 -4
- package/coverage/lcov-report/test-utils/order-more/models/index.html +23 -23
- package/coverage/lcov-report/test-utils/order-more/models/inventory-level.ts.html +11 -11
- package/coverage/lcov-report/test-utils/order-more/models/line-item.ts.html +15 -15
- package/coverage/lcov-report/test-utils/order-more/models/order.ts.html +45 -45
- package/coverage/lcov-report/test-utils/order-more/models/parcel-event.ts.html +6 -6
- package/coverage/lcov-report/test-utils/order-more/models/parcel-line-item.ts.html +7 -7
- package/coverage/lcov-report/test-utils/order-more/models/parcel.ts.html +2 -2
- package/coverage/lcov-report/test-utils/order-more/models/physical-address.ts.html +12 -12
- package/coverage/lcov-report/test-utils/order-more/models/product-variant-image.ts.html +7 -7
- package/coverage/lcov-report/test-utils/order-more/models/product-variant.ts.html +22 -22
- package/coverage/lcov-report/test-utils/order-more/models/product.ts.html +11 -11
- package/coverage/lcov-report/test-utils/order-more/models/refund.ts.html +11 -11
- package/coverage/lcov-report/test-utils/order-more/models/shipment-actual-product-variant.ts.html +9 -9
- package/coverage/lcov-report/test-utils/order-more/models/shipment.ts.html +4 -4
- package/coverage/lcov-report/test-utils/order-more/models/size.ts.html +4 -4
- package/coverage/lcov-report/test-utils/order-more/models/utm-medium.ts.html +15 -15
- package/coverage/lcov-report/test-utils/order-more/models/utm-source.ts.html +17 -17
- package/coverage/lcov-report/test-utils/six/entities.ts.html +1 -1
- package/coverage/lcov-report/test-utils/six/index.html +1 -1
- package/coverage/lcov-report/test-utils/six/models/customer.ts.html +3 -3
- package/coverage/lcov-report/test-utils/six/models/index.html +21 -21
- package/coverage/lcov-report/test-utils/six/models/line-item.ts.html +10 -10
- package/coverage/lcov-report/test-utils/six/models/order.ts.html +13 -13
- package/coverage/lcov-report/test-utils/six/models/parcel-line-item.ts.html +2 -2
- package/coverage/lcov-report/test-utils/six/models/parcel.ts.html +2 -2
- package/coverage/lcov-report/test-utils/thirteen/entities.ts.html +1 -1
- package/coverage/lcov-report/test-utils/thirteen/index.html +1 -1
- package/coverage/lcov-report/test-utils/thirteen/models/audience.ts.html +2 -2
- package/coverage/lcov-report/test-utils/thirteen/models/brand.ts.html +2 -2
- package/coverage/lcov-report/test-utils/thirteen/models/category.ts.html +1 -1
- package/coverage/lcov-report/test-utils/thirteen/models/index.html +14 -14
- package/coverage/lcov-report/test-utils/thirteen/models/member.ts.html +2 -2
- package/coverage/lcov-report/test-utils/thirteen/models/passion.ts.html +2 -2
- package/coverage/lcov-report/test-utils/thirteen/models/product.ts.html +10 -10
- package/coverage/lcov-report/test-utils/thirteen/models/recommendation-audience.ts.html +2 -2
- package/coverage/lcov-report/test-utils/thirteen/models/recommendation.ts.html +2 -2
- package/coverage/lcov-report/test-utils/three/index.html +1 -1
- package/coverage/lcov-report/test-utils/three/results.js.html +1 -1
- package/coverage/lcov-report/test-utils/twelve/entities.ts.html +1 -1
- package/coverage/lcov-report/test-utils/twelve/index.html +1 -1
- package/coverage/lcov-report/test-utils/twelve/models/index.html +1 -1
- package/coverage/lcov-report/test-utils/twelve/models/member.ts.html +1 -1
- package/coverage/lcov-report/test-utils/twelve/models/prompt.ts.html +2 -2
- package/coverage/lcov-report/test-utils/two/index.html +1 -1
- package/coverage/lcov-report/test-utils/two/results.js.html +1 -1
- package/coverage/lcov.info +2136 -1991
- package/dist/example/data-access/person.d.ts +1 -1
- package/dist/src/core.d.ts +13 -7
- package/dist/src/core.js +258 -189
- package/dist/src/core.spec.js +413 -0
- package/dist/src/driver-integrations/index.d.ts +5 -5
- package/dist/src/driver-integrations/pgp.spec.d.ts +1 -0
- package/dist/src/driver-integrations/pgp.spec.js +376 -0
- package/dist/src/orm.d.ts +9 -9
- package/dist/src/orm.js +137 -76
- package/dist/src/orm.spec.js +535 -85
- package/dist/test-utils/nine/models/feature-switch.d.ts +2 -2
- package/dist/test-utils/nine/models/feature-switch.ts +2 -2
- package/example/data-access/person.ts +1 -1
- package/package.json +9 -6
- package/scripts/bench-core.js +636 -0
- package/scripts/check-bench-scenarios.js +47 -0
- package/src/core.spec.ts +485 -2
- package/src/core.ts +369 -227
- package/src/driver-integrations/index.ts +5 -5
- package/src/driver-integrations/pgp.spec.ts +444 -0
- package/src/driver-integrations/pgp.ts +5 -5
- package/src/orm.spec.ts +592 -88
- package/src/orm.ts +173 -143
- package/test-utils/nine/models/feature-switch.ts +2 -2
package/dist/src/orm.spec.js
CHANGED
|
@@ -1,102 +1,552 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
2
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
12
|
/* eslint-disable max-len */
|
|
4
13
|
const index_1 = require("./index");
|
|
5
14
|
const entities_1 = require("../test-utils/order/entities");
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
15
|
+
const order_1 = require("../test-utils/order/models/order");
|
|
16
|
+
const mockPgpDb = (overrides = {}) => (Object.assign({ $config: { pgp: true }, many: jest.fn(), any: jest.fn(), result: jest.fn(), none: jest.fn() }, overrides));
|
|
17
|
+
/* -------------------------------------------------------------------------*/
|
|
18
|
+
/* Helper Utility Functions ------------------------------------------------*/
|
|
19
|
+
/* -------------------------------------------------------------------------*/
|
|
20
|
+
describe('getSqlInsertParts', () => {
|
|
21
|
+
test('generates correct insert parts for a model with defined values', () => {
|
|
22
|
+
const orm = (0, index_1.create)({
|
|
23
|
+
entities: entities_1.entities,
|
|
24
|
+
db: mockPgpDb()
|
|
25
|
+
});
|
|
26
|
+
const order = new order_1.Order({
|
|
27
|
+
id: 1,
|
|
28
|
+
email: 'test@test.com',
|
|
29
|
+
subtotalPrice: 100,
|
|
30
|
+
utmSourceId: 10
|
|
31
|
+
});
|
|
32
|
+
expect(orm.getSqlInsertParts(order)).toEqual({
|
|
33
|
+
columns: '"id", "email", "subtotal_price", "utm_source_id"',
|
|
34
|
+
values: [1, 'test@test.com', 100, 10],
|
|
35
|
+
valuesVar: ['$1', '$2', '$3', '$4']
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
test('filters out undefined properties', () => {
|
|
39
|
+
const orm = (0, index_1.create)({
|
|
40
|
+
entities: entities_1.entities,
|
|
41
|
+
db: mockPgpDb()
|
|
42
|
+
});
|
|
43
|
+
const order = new order_1.Order({ id: 5 });
|
|
44
|
+
const result = orm.getSqlInsertParts(order);
|
|
45
|
+
expect(result.columns).toEqual('"id"');
|
|
46
|
+
expect(result.values).toEqual([5]);
|
|
47
|
+
expect(result.valuesVar).toEqual(['$1']);
|
|
48
|
+
});
|
|
49
|
+
test('includes all defined properties', () => {
|
|
50
|
+
const orm = (0, index_1.create)({
|
|
51
|
+
entities: entities_1.entities,
|
|
52
|
+
db: mockPgpDb()
|
|
53
|
+
});
|
|
54
|
+
const order = new order_1.Order({
|
|
55
|
+
id: 1,
|
|
56
|
+
email: 'a@b.com',
|
|
57
|
+
browserIp: '1.2.3.4',
|
|
58
|
+
subtotalPrice: 50,
|
|
59
|
+
totalPrice: 55
|
|
60
|
+
});
|
|
61
|
+
const result = orm.getSqlInsertParts(order);
|
|
62
|
+
expect(result.values).toContain(1);
|
|
63
|
+
expect(result.values).toContain('a@b.com');
|
|
64
|
+
expect(result.values).toContain(50);
|
|
65
|
+
expect(result.values).toContain(55);
|
|
66
|
+
expect(result.values.length).toEqual(result.valuesVar.length);
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
describe('getSqlUpdateParts', () => {
|
|
70
|
+
test('generates correct update parts', () => {
|
|
71
|
+
const orm = (0, index_1.create)({
|
|
72
|
+
entities: entities_1.entities,
|
|
73
|
+
db: mockPgpDb()
|
|
74
|
+
});
|
|
75
|
+
const order = new order_1.Order({
|
|
76
|
+
id: 1,
|
|
77
|
+
email: 'test@test.com',
|
|
78
|
+
subtotalPrice: 100,
|
|
79
|
+
utmSourceId: 10
|
|
80
|
+
});
|
|
81
|
+
expect(orm.getSqlUpdateParts(order)).toEqual({
|
|
82
|
+
clause: '"id" = $1, "email" = $2, "subtotal_price" = $3, "utm_source_id" = $4',
|
|
83
|
+
idVar: '$5',
|
|
84
|
+
values: [1, 'test@test.com', 100, 10, 1]
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
test('appends the id value at the end of values array', () => {
|
|
88
|
+
const orm = (0, index_1.create)({
|
|
89
|
+
entities: entities_1.entities,
|
|
90
|
+
db: mockPgpDb()
|
|
91
|
+
});
|
|
92
|
+
const order = new order_1.Order({ id: 42, email: 'x@y.com' });
|
|
93
|
+
const result = orm.getSqlUpdateParts(order);
|
|
94
|
+
expect(result.values[result.values.length - 1]).toEqual(42);
|
|
95
|
+
});
|
|
96
|
+
test('custom "on" parameter uses that property for the id value', () => {
|
|
97
|
+
const orm = (0, index_1.create)({
|
|
98
|
+
entities: entities_1.entities,
|
|
99
|
+
db: mockPgpDb()
|
|
100
|
+
});
|
|
101
|
+
const order = new order_1.Order({ id: 1, email: 'x@y.com' });
|
|
102
|
+
const result = orm.getSqlUpdateParts(order, 'email');
|
|
103
|
+
expect(result.values[result.values.length - 1]).toEqual('x@y.com');
|
|
104
|
+
});
|
|
105
|
+
test('filters out undefined properties from clause', () => {
|
|
106
|
+
const orm = (0, index_1.create)({
|
|
107
|
+
entities: entities_1.entities,
|
|
108
|
+
db: mockPgpDb()
|
|
109
|
+
});
|
|
110
|
+
const order = new order_1.Order({ id: 7 });
|
|
111
|
+
const result = orm.getSqlUpdateParts(order);
|
|
112
|
+
expect(result.clause).toEqual('"id" = $1');
|
|
113
|
+
expect(result.idVar).toEqual('$2');
|
|
114
|
+
expect(result.values).toEqual([7, 7]);
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
describe('getMatchingParts', () => {
|
|
118
|
+
test('generates correct WHERE clause and values', () => {
|
|
119
|
+
const orm = (0, index_1.create)({
|
|
120
|
+
entities: entities_1.entities,
|
|
121
|
+
db: mockPgpDb()
|
|
122
|
+
});
|
|
123
|
+
const order = new order_1.Order({
|
|
124
|
+
id: 1,
|
|
125
|
+
email: 'test@test.com',
|
|
126
|
+
subtotalPrice: 100,
|
|
127
|
+
utmSourceId: 10
|
|
128
|
+
});
|
|
129
|
+
expect(orm.getMatchingParts(order)).toEqual({
|
|
130
|
+
values: [1, 'test@test.com', 100, 10],
|
|
131
|
+
whereClause: '"order"."id" = $1 AND "order"."email" = $2 AND "order"."subtotal_price" = $3 AND "order"."utm_source_id" = $4'
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
test('filters out null and undefined values', () => {
|
|
135
|
+
const orm = (0, index_1.create)({
|
|
136
|
+
entities: entities_1.entities,
|
|
137
|
+
db: mockPgpDb()
|
|
138
|
+
});
|
|
139
|
+
const order = new order_1.Order({ id: 1 });
|
|
140
|
+
const result = orm.getMatchingParts(order);
|
|
141
|
+
expect(result.whereClause).toEqual('"order"."id" = $1');
|
|
142
|
+
expect(result.values).toEqual([1]);
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
describe('getMatchingPartsObject', () => {
|
|
146
|
+
test('generates correct WHERE clause and object values', () => {
|
|
147
|
+
const orm = (0, index_1.create)({
|
|
148
|
+
entities: entities_1.entities,
|
|
149
|
+
db: mockPgpDb()
|
|
150
|
+
});
|
|
151
|
+
const order = new order_1.Order({
|
|
152
|
+
id: 1,
|
|
153
|
+
email: 'test@test.com',
|
|
154
|
+
subtotalPrice: 100,
|
|
155
|
+
utmSourceId: 10
|
|
156
|
+
});
|
|
157
|
+
expect(orm.getMatchingPartsObject(order)).toEqual({
|
|
158
|
+
values: {
|
|
159
|
+
1: 1,
|
|
160
|
+
2: 'test@test.com',
|
|
161
|
+
3: 100,
|
|
162
|
+
4: 10
|
|
163
|
+
},
|
|
164
|
+
whereClause: '"order"."id" = $(1) AND "order"."email" = $(2) AND "order"."subtotal_price" = $(3) AND "order"."utm_source_id" = $(4)'
|
|
165
|
+
});
|
|
166
|
+
});
|
|
167
|
+
test('uses $() syntax for parameterized values', () => {
|
|
168
|
+
const orm = (0, index_1.create)({
|
|
169
|
+
entities: entities_1.entities,
|
|
170
|
+
db: mockPgpDb()
|
|
171
|
+
});
|
|
172
|
+
const order = new order_1.Order({ id: 5 });
|
|
173
|
+
const result = orm.getMatchingPartsObject(order);
|
|
174
|
+
expect(result.whereClause).toContain('$(1)');
|
|
175
|
+
expect(result.values).toEqual({ 1: 5 });
|
|
21
176
|
});
|
|
22
177
|
});
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
178
|
+
describe('getValueBySqlColumn', () => {
|
|
179
|
+
test('retrieves values by SQL column name', () => {
|
|
180
|
+
const orm = (0, index_1.create)({
|
|
181
|
+
entities: entities_1.entities,
|
|
182
|
+
db: mockPgpDb()
|
|
183
|
+
});
|
|
184
|
+
const order = new order_1.Order({
|
|
185
|
+
id: 1,
|
|
186
|
+
email: 'test@test.com',
|
|
187
|
+
subtotalPrice: 100,
|
|
188
|
+
utmSourceId: 10
|
|
189
|
+
});
|
|
190
|
+
expect(orm.getValueBySqlColumn(order, 'id')).toEqual(1);
|
|
191
|
+
expect(orm.getValueBySqlColumn(order, 'email')).toEqual('test@test.com');
|
|
192
|
+
expect(orm.getValueBySqlColumn(order, 'subtotal_price')).toEqual(100);
|
|
193
|
+
expect(orm.getValueBySqlColumn(order, 'utm_source_id')).toEqual(10);
|
|
194
|
+
});
|
|
195
|
+
test('returns undefined for columns with no value set', () => {
|
|
196
|
+
const orm = (0, index_1.create)({
|
|
197
|
+
entities: entities_1.entities,
|
|
198
|
+
db: mockPgpDb()
|
|
199
|
+
});
|
|
200
|
+
const order = new order_1.Order({ id: 1 });
|
|
201
|
+
expect(orm.getValueBySqlColumn(order, 'email')).toBeUndefined();
|
|
202
|
+
});
|
|
203
|
+
});
|
|
204
|
+
describe('getSqlColumnForPropertyName', () => {
|
|
205
|
+
test('maps property names to SQL column names', () => {
|
|
206
|
+
const orm = (0, index_1.create)({
|
|
207
|
+
entities: entities_1.entities,
|
|
208
|
+
db: mockPgpDb()
|
|
209
|
+
});
|
|
210
|
+
const order = new order_1.Order({ id: 1 });
|
|
211
|
+
expect(orm.getSqlColumnForPropertyName(order, 'id')).toEqual('id');
|
|
212
|
+
expect(orm.getSqlColumnForPropertyName(order, 'utmSourceId')).toEqual('utm_source_id');
|
|
213
|
+
expect(orm.getSqlColumnForPropertyName(order, 'browserIP')).toEqual('browser_ip');
|
|
214
|
+
});
|
|
215
|
+
test('returns undefined for non-existent property name', () => {
|
|
216
|
+
const orm = (0, index_1.create)({
|
|
217
|
+
entities: entities_1.entities,
|
|
218
|
+
db: mockPgpDb()
|
|
219
|
+
});
|
|
220
|
+
const order = new order_1.Order({ id: 1 });
|
|
221
|
+
expect(orm.getSqlColumnForPropertyName(order, 'nonExistent')).toBeUndefined();
|
|
38
222
|
});
|
|
39
223
|
});
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
224
|
+
describe('getNewWith', () => {
|
|
225
|
+
test('creates a new model instance with specified SQL columns and values', () => {
|
|
226
|
+
const orm = (0, index_1.create)({
|
|
227
|
+
entities: entities_1.entities,
|
|
228
|
+
db: mockPgpDb()
|
|
229
|
+
});
|
|
230
|
+
const order = new order_1.Order({ id: 1 });
|
|
231
|
+
const newOrder = orm.getNewWith(order, ['id', 'email'], [99, 'new@test.com']);
|
|
232
|
+
expect(newOrder).toBeInstanceOf(order_1.Order);
|
|
233
|
+
expect(newOrder.id).toEqual(99);
|
|
234
|
+
expect(newOrder.email).toEqual('new@test.com');
|
|
44
235
|
});
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
236
|
+
test('creates model with single column', () => {
|
|
237
|
+
const orm = (0, index_1.create)({
|
|
238
|
+
entities: entities_1.entities,
|
|
239
|
+
db: mockPgpDb()
|
|
240
|
+
});
|
|
241
|
+
const order = new order_1.Order({ id: 1 });
|
|
242
|
+
const newOrder = orm.getNewWith(order, ['id'], [42]);
|
|
243
|
+
expect(newOrder).toBeInstanceOf(order_1.Order);
|
|
244
|
+
expect(newOrder.id).toEqual(42);
|
|
50
245
|
});
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
246
|
+
test('maps SQL column names to property names', () => {
|
|
247
|
+
const orm = (0, index_1.create)({
|
|
248
|
+
entities: entities_1.entities,
|
|
249
|
+
db: mockPgpDb()
|
|
250
|
+
});
|
|
251
|
+
const order = new order_1.Order({ id: 1 });
|
|
252
|
+
const newOrder = orm.getNewWith(order, ['id', 'subtotal_price', 'utm_source_id'], [1, 200, 5]);
|
|
253
|
+
expect(newOrder.id).toEqual(1);
|
|
254
|
+
expect(newOrder.subtotalPrice).toEqual(200);
|
|
255
|
+
expect(newOrder.utmSourceId).toEqual(5);
|
|
54
256
|
});
|
|
55
257
|
});
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
utmSourceId: 10
|
|
66
|
-
});
|
|
67
|
-
expect(orm.getMatchingPartsObject(order)).toEqual({
|
|
68
|
-
values: {
|
|
69
|
-
1: 1,
|
|
70
|
-
2: 'test@test.com',
|
|
71
|
-
3: 100,
|
|
72
|
-
4: 10
|
|
73
|
-
},
|
|
74
|
-
whereClause: '"order"."id" = $(1) AND "order"."email" = $(2) AND "order"."subtotal_price" = $(3) AND "order"."utm_source_id" = $(4)'
|
|
258
|
+
/* -------------------------------------------------------------------------*/
|
|
259
|
+
/* Unsupported driver error ------------------------------------------------*/
|
|
260
|
+
/* -------------------------------------------------------------------------*/
|
|
261
|
+
describe('unsupported database driver', () => {
|
|
262
|
+
test('throws for an unrecognized driver', () => {
|
|
263
|
+
expect(() => (0, index_1.create)({
|
|
264
|
+
entities: entities_1.entities,
|
|
265
|
+
db: { $config: {} }
|
|
266
|
+
})).toThrow('database driver is not yet supported');
|
|
75
267
|
});
|
|
76
268
|
});
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
const
|
|
83
|
-
id:
|
|
84
|
-
email:
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
269
|
+
/* -------------------------------------------------------------------------*/
|
|
270
|
+
/* CRUD operations (mocked db) ---------------------------------------------*/
|
|
271
|
+
/* -------------------------------------------------------------------------*/
|
|
272
|
+
describe('CRUD operations', () => {
|
|
273
|
+
const orderSelectClause = '"order".id as "order#id", "order".email as "order#email", "order".browser_ip as "order#browser_ip", "order".browser_user_agent as "order#browser_user_agent", "order".kujo_imported_date as "order#kujo_imported_date", "order".created_date as "order#created_date", "order".cancel_reason as "order#cancel_reason", "order".cancelled_date as "order#cancelled_date", "order".closed_date as "order#closed_date", "order".processed_date as "order#processed_date", "order".updated_date as "order#updated_date", "order".note as "order#note", "order".subtotal_price as "order#subtotal_price", "order".taxes_included as "order#taxes_included", "order".total_discounts as "order#total_discounts", "order".total_price as "order#total_price", "order".total_tax as "order#total_tax", "order".total_weight as "order#total_weight", "order".order_status_url as "order#order_status_url", "order".utm_source_id as "order#utm_source_id", "order".utm_medium_id as "order#utm_medium_id", "order".utm_campaign as "order#utm_campaign", "order".utm_content as "order#utm_content", "order".utm_term as "order#utm_term"';
|
|
274
|
+
const makeRow = (id, email) => ({
|
|
275
|
+
'order#id': id,
|
|
276
|
+
'order#email': email,
|
|
277
|
+
'order#browser_ip': null,
|
|
278
|
+
'order#browser_user_agent': null,
|
|
279
|
+
'order#kujo_imported_date': null,
|
|
280
|
+
'order#created_date': null,
|
|
281
|
+
'order#cancel_reason': null,
|
|
282
|
+
'order#cancelled_date': null,
|
|
283
|
+
'order#closed_date': null,
|
|
284
|
+
'order#processed_date': null,
|
|
285
|
+
'order#updated_date': null,
|
|
286
|
+
'order#note': null,
|
|
287
|
+
'order#subtotal_price': null,
|
|
288
|
+
'order#taxes_included': null,
|
|
289
|
+
'order#total_discounts': null,
|
|
290
|
+
'order#total_price': null,
|
|
291
|
+
'order#total_tax': null,
|
|
292
|
+
'order#total_weight': null,
|
|
293
|
+
'order#order_status_url': null,
|
|
294
|
+
'order#utm_source_id': null,
|
|
295
|
+
'order#utm_medium_id': null,
|
|
296
|
+
'order#utm_campaign': null,
|
|
297
|
+
'order#utm_content': null,
|
|
298
|
+
'order#utm_term': null
|
|
299
|
+
});
|
|
300
|
+
describe('create (INSERT)', () => {
|
|
301
|
+
test('builds INSERT query and returns created model', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
302
|
+
const db = mockPgpDb({
|
|
303
|
+
many: jest.fn().mockResolvedValue([makeRow(1, 'new@test.com')])
|
|
304
|
+
});
|
|
305
|
+
const orm = (0, index_1.create)({ entities: entities_1.entities, db });
|
|
306
|
+
const order = new order_1.Order({ id: 1, email: 'new@test.com' });
|
|
307
|
+
const result = yield orm.create(order);
|
|
308
|
+
expect(db.many).toHaveBeenCalledTimes(1);
|
|
309
|
+
const [query, values] = db.many.mock.calls[0];
|
|
310
|
+
expect(query).toContain('INSERT INTO "order"');
|
|
311
|
+
expect(query).toContain('"id", "email"');
|
|
312
|
+
expect(query).toContain('$1,$2');
|
|
313
|
+
expect(query).toContain('RETURNING');
|
|
314
|
+
expect(values).toEqual([1, 'new@test.com']);
|
|
315
|
+
expect(result.id).toEqual(1);
|
|
316
|
+
expect(result.email).toEqual('new@test.com');
|
|
317
|
+
}));
|
|
318
|
+
test('only includes defined columns in INSERT', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
319
|
+
const db = mockPgpDb({
|
|
320
|
+
many: jest.fn().mockResolvedValue([makeRow(5, null)])
|
|
321
|
+
});
|
|
322
|
+
const orm = (0, index_1.create)({ entities: entities_1.entities, db });
|
|
323
|
+
const order = new order_1.Order({ id: 5 });
|
|
324
|
+
yield orm.create(order);
|
|
325
|
+
const [query, values] = db.many.mock.calls[0];
|
|
326
|
+
expect(query).toContain('"id"');
|
|
327
|
+
expect(query).not.toContain('"email"');
|
|
328
|
+
expect(values).toEqual([5]);
|
|
329
|
+
}));
|
|
330
|
+
});
|
|
331
|
+
describe('update (UPDATE)', () => {
|
|
332
|
+
test('builds UPDATE query and returns updated model', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
333
|
+
const db = mockPgpDb({
|
|
334
|
+
many: jest.fn().mockResolvedValue([makeRow(1, 'updated@test.com')])
|
|
335
|
+
});
|
|
336
|
+
const orm = (0, index_1.create)({ entities: entities_1.entities, db });
|
|
337
|
+
const order = new order_1.Order({ id: 1, email: 'updated@test.com' });
|
|
338
|
+
const result = yield orm.update(order);
|
|
339
|
+
expect(db.many).toHaveBeenCalledTimes(1);
|
|
340
|
+
const [query, values] = db.many.mock.calls[0];
|
|
341
|
+
expect(query).toContain('UPDATE "order"');
|
|
342
|
+
expect(query).toContain('SET');
|
|
343
|
+
expect(query).toContain('WHERE');
|
|
344
|
+
expect(query).toContain('RETURNING');
|
|
345
|
+
expect(values).toContain(1);
|
|
346
|
+
expect(values).toContain('updated@test.com');
|
|
347
|
+
expect(result.email).toEqual('updated@test.com');
|
|
348
|
+
}));
|
|
349
|
+
test('uses custom "on" column for WHERE clause', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
350
|
+
const db = mockPgpDb({
|
|
351
|
+
many: jest.fn().mockResolvedValue([makeRow(1, 'x@y.com')])
|
|
352
|
+
});
|
|
353
|
+
const orm = (0, index_1.create)({ entities: entities_1.entities, db });
|
|
354
|
+
const order = new order_1.Order({ id: 1, email: 'x@y.com' });
|
|
355
|
+
yield orm.update(order, { on: 'email' });
|
|
356
|
+
const [query, values] = db.many.mock.calls[0];
|
|
357
|
+
expect(query).toContain('WHERE');
|
|
358
|
+
expect(query).toContain('"order".email');
|
|
359
|
+
expect(values[values.length - 1]).toEqual('x@y.com');
|
|
360
|
+
}));
|
|
361
|
+
});
|
|
362
|
+
describe('delete (DELETE)', () => {
|
|
363
|
+
test('builds DELETE query with id', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
364
|
+
const db = mockPgpDb({
|
|
365
|
+
none: jest.fn().mockResolvedValue(null)
|
|
366
|
+
});
|
|
367
|
+
const orm = (0, index_1.create)({ entities: entities_1.entities, db });
|
|
368
|
+
const order = new order_1.Order({ id: 42 });
|
|
369
|
+
yield orm.delete(order);
|
|
370
|
+
expect(db.none).toHaveBeenCalledTimes(1);
|
|
371
|
+
const [query, values] = db.none.mock.calls[0];
|
|
372
|
+
expect(query).toContain('DELETE FROM "order"');
|
|
373
|
+
expect(query).toContain('"order".id = $(id)');
|
|
374
|
+
expect(values).toEqual({ id: 42 });
|
|
375
|
+
}));
|
|
376
|
+
});
|
|
377
|
+
describe('deleteMatching', () => {
|
|
378
|
+
test('builds DELETE query with WHERE clause from model properties', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
379
|
+
const db = mockPgpDb({
|
|
380
|
+
none: jest.fn().mockResolvedValue(null)
|
|
381
|
+
});
|
|
382
|
+
const orm = (0, index_1.create)({ entities: entities_1.entities, db });
|
|
383
|
+
const order = new order_1.Order({ id: 10, email: 'del@test.com' });
|
|
384
|
+
yield orm.deleteMatching(order);
|
|
385
|
+
expect(db.none).toHaveBeenCalledTimes(1);
|
|
386
|
+
const [query, values] = db.none.mock.calls[0];
|
|
387
|
+
expect(query).toContain('DELETE FROM "order"');
|
|
388
|
+
expect(query).toContain('WHERE');
|
|
389
|
+
expect(query).toContain('"order"."id" = $1');
|
|
390
|
+
expect(query).toContain('"order"."email" = $2');
|
|
391
|
+
expect(values).toEqual([10, 'del@test.com']);
|
|
392
|
+
}));
|
|
393
|
+
});
|
|
394
|
+
describe('getMatching', () => {
|
|
395
|
+
test('builds SELECT query with WHERE clause and returns one model', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
396
|
+
const db = mockPgpDb({
|
|
397
|
+
many: jest.fn().mockResolvedValue([makeRow(1, 'found@test.com')])
|
|
398
|
+
});
|
|
399
|
+
const orm = (0, index_1.create)({ entities: entities_1.entities, db });
|
|
400
|
+
const order = new order_1.Order({ id: 1 });
|
|
401
|
+
const result = yield orm.getMatching(order);
|
|
402
|
+
expect(db.many).toHaveBeenCalledTimes(1);
|
|
403
|
+
const [query, values] = db.many.mock.calls[0];
|
|
404
|
+
expect(query).toContain('SELECT');
|
|
405
|
+
expect(query).toContain('FROM "order"');
|
|
406
|
+
expect(query).toContain('WHERE');
|
|
407
|
+
expect(query).toContain('"order"."id" = $1');
|
|
408
|
+
expect(values).toEqual([1]);
|
|
409
|
+
expect(result.id).toEqual(1);
|
|
410
|
+
expect(result.email).toEqual('found@test.com');
|
|
411
|
+
}));
|
|
412
|
+
});
|
|
413
|
+
describe('getOneOrNoneMatching', () => {
|
|
414
|
+
test('returns a model when one exists', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
415
|
+
const db = mockPgpDb({
|
|
416
|
+
any: jest.fn().mockResolvedValue([makeRow(1, 'one@test.com')])
|
|
417
|
+
});
|
|
418
|
+
const orm = (0, index_1.create)({ entities: entities_1.entities, db });
|
|
419
|
+
const order = new order_1.Order({ id: 1 });
|
|
420
|
+
const result = yield orm.getOneOrNoneMatching(order);
|
|
421
|
+
expect(db.any).toHaveBeenCalledTimes(1);
|
|
422
|
+
expect(result).toBeDefined();
|
|
423
|
+
expect(result.id).toEqual(1);
|
|
424
|
+
}));
|
|
425
|
+
test('returns undefined when none exist', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
426
|
+
const db = mockPgpDb({
|
|
427
|
+
any: jest.fn().mockResolvedValue([])
|
|
428
|
+
});
|
|
429
|
+
const orm = (0, index_1.create)({ entities: entities_1.entities, db });
|
|
430
|
+
const order = new order_1.Order({ id: 999 });
|
|
431
|
+
const result = yield orm.getOneOrNoneMatching(order);
|
|
432
|
+
expect(result).toBeUndefined();
|
|
433
|
+
}));
|
|
434
|
+
});
|
|
435
|
+
describe('getAnyMatching', () => {
|
|
436
|
+
test('returns collection when results exist', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
437
|
+
const db = mockPgpDb({
|
|
438
|
+
result: jest.fn().mockResolvedValue({
|
|
439
|
+
rows: [makeRow(1, 'a@test.com'), makeRow(2, 'b@test.com')],
|
|
440
|
+
fields: [{ name: 'order#id' }]
|
|
441
|
+
})
|
|
442
|
+
});
|
|
443
|
+
const orm = (0, index_1.create)({ entities: entities_1.entities, db });
|
|
444
|
+
const order = new order_1.Order({ id: 1 });
|
|
445
|
+
const result = yield orm.getAnyMatching(order);
|
|
446
|
+
expect(db.result).toHaveBeenCalledTimes(1);
|
|
447
|
+
expect(result.models.length).toEqual(2);
|
|
448
|
+
}));
|
|
449
|
+
test('returns empty collection when no results', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
450
|
+
const db = mockPgpDb({
|
|
451
|
+
result: jest.fn().mockResolvedValue({
|
|
452
|
+
rows: [],
|
|
453
|
+
fields: [{ name: 'order#id' }]
|
|
454
|
+
})
|
|
455
|
+
});
|
|
456
|
+
const orm = (0, index_1.create)({ entities: entities_1.entities, db });
|
|
457
|
+
const order = new order_1.Order({ id: 999 });
|
|
458
|
+
const result = yield orm.getAnyMatching(order);
|
|
459
|
+
expect(result.models.length).toEqual(0);
|
|
460
|
+
}));
|
|
461
|
+
});
|
|
462
|
+
describe('getAllMatching', () => {
|
|
463
|
+
test('returns collection when results exist', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
464
|
+
const db = mockPgpDb({
|
|
465
|
+
any: jest.fn().mockResolvedValue([makeRow(1, 'a@test.com')])
|
|
466
|
+
});
|
|
467
|
+
const orm = (0, index_1.create)({ entities: entities_1.entities, db });
|
|
468
|
+
const order = new order_1.Order({ id: 1 });
|
|
469
|
+
const result = yield orm.getAllMatching(order);
|
|
470
|
+
expect(db.any).toHaveBeenCalledTimes(1);
|
|
471
|
+
expect(result.models.length).toEqual(1);
|
|
472
|
+
}));
|
|
473
|
+
test('throws when no results exist', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
474
|
+
const db = mockPgpDb({
|
|
475
|
+
any: jest.fn().mockResolvedValue([])
|
|
476
|
+
});
|
|
477
|
+
const orm = (0, index_1.create)({ entities: entities_1.entities, db });
|
|
478
|
+
const order = new order_1.Order({ id: 999 });
|
|
479
|
+
yield expect(orm.getAllMatching(order)).rejects.toThrow();
|
|
480
|
+
}));
|
|
481
|
+
});
|
|
92
482
|
});
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
483
|
+
/* -------------------------------------------------------------------------*/
|
|
484
|
+
/* ORM exposes core methods ------------------------------------------------*/
|
|
485
|
+
/* -------------------------------------------------------------------------*/
|
|
486
|
+
describe('ORM exposes core methods', () => {
|
|
487
|
+
test('exposes createFromDatabase', () => {
|
|
488
|
+
const orm = (0, index_1.create)({
|
|
489
|
+
entities: entities_1.entities,
|
|
490
|
+
db: mockPgpDb()
|
|
491
|
+
});
|
|
492
|
+
expect(typeof orm.createFromDatabase).toBe('function');
|
|
493
|
+
});
|
|
494
|
+
test('exposes createOneFromDatabase', () => {
|
|
495
|
+
const orm = (0, index_1.create)({
|
|
496
|
+
entities: entities_1.entities,
|
|
497
|
+
db: mockPgpDb()
|
|
498
|
+
});
|
|
499
|
+
expect(typeof orm.createOneFromDatabase).toBe('function');
|
|
500
|
+
});
|
|
501
|
+
test('exposes createOneOrNoneFromDatabase', () => {
|
|
502
|
+
const orm = (0, index_1.create)({
|
|
503
|
+
entities: entities_1.entities,
|
|
504
|
+
db: mockPgpDb()
|
|
505
|
+
});
|
|
506
|
+
expect(typeof orm.createOneOrNoneFromDatabase).toBe('function');
|
|
507
|
+
});
|
|
508
|
+
test('exposes createManyFromDatabase', () => {
|
|
509
|
+
const orm = (0, index_1.create)({
|
|
510
|
+
entities: entities_1.entities,
|
|
511
|
+
db: mockPgpDb()
|
|
512
|
+
});
|
|
513
|
+
expect(typeof orm.createManyFromDatabase).toBe('function');
|
|
514
|
+
});
|
|
515
|
+
test('exposes createAnyFromDatabase', () => {
|
|
516
|
+
const orm = (0, index_1.create)({
|
|
517
|
+
entities: entities_1.entities,
|
|
518
|
+
db: mockPgpDb()
|
|
519
|
+
});
|
|
520
|
+
expect(typeof orm.createAnyFromDatabase).toBe('function');
|
|
521
|
+
});
|
|
522
|
+
test('exposes tables', () => {
|
|
523
|
+
const orm = (0, index_1.create)({
|
|
524
|
+
entities: entities_1.entities,
|
|
525
|
+
db: mockPgpDb()
|
|
526
|
+
});
|
|
527
|
+
expect(orm.tables).toBeDefined();
|
|
528
|
+
expect(Object.keys(orm.tables).length).toEqual(5);
|
|
529
|
+
});
|
|
530
|
+
test('exposes getEntityByModel', () => {
|
|
531
|
+
const orm = (0, index_1.create)({
|
|
532
|
+
entities: entities_1.entities,
|
|
533
|
+
db: mockPgpDb()
|
|
534
|
+
});
|
|
535
|
+
expect(typeof orm.getEntityByModel).toBe('function');
|
|
536
|
+
const order = new order_1.Order({ id: 1 });
|
|
537
|
+
expect(orm.getEntityByModel(order).tableName).toEqual('order');
|
|
538
|
+
});
|
|
539
|
+
test('exposes getEntityByTableName', () => {
|
|
540
|
+
const orm = (0, index_1.create)({
|
|
541
|
+
entities: entities_1.entities,
|
|
542
|
+
db: mockPgpDb()
|
|
543
|
+
});
|
|
544
|
+
expect(typeof orm.getEntityByTableName).toBe('function');
|
|
545
|
+
expect(orm.getEntityByTableName('order').tableName).toEqual('order');
|
|
546
|
+
});
|
|
547
|
+
test('exposes db reference', () => {
|
|
548
|
+
const db = mockPgpDb();
|
|
549
|
+
const orm = (0, index_1.create)({ entities: entities_1.entities, db });
|
|
550
|
+
expect(orm.db).toBe(db);
|
|
551
|
+
});
|
|
102
552
|
});
|
|
@@ -2,12 +2,12 @@ import { IModel, ICollection, IColumns } from '../../../src/index';
|
|
|
2
2
|
export declare const tableName: string;
|
|
3
3
|
export declare const columns: IColumns;
|
|
4
4
|
interface IFeatureSwitchProps {
|
|
5
|
-
id: number;
|
|
5
|
+
id: string | number;
|
|
6
6
|
label: string;
|
|
7
7
|
on: boolean;
|
|
8
8
|
}
|
|
9
9
|
export declare class FeatureSwitch implements IModel {
|
|
10
|
-
id: number;
|
|
10
|
+
id: string | number;
|
|
11
11
|
label: string;
|
|
12
12
|
on: boolean;
|
|
13
13
|
constructor(props: IFeatureSwitchProps);
|