@expo/entity-database-adapter-knex 0.34.0 → 0.36.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/build/PostgresEntityDatabaseAdapter.d.ts +1 -1
- package/build/PostgresEntityDatabaseAdapter.js.map +1 -1
- package/build/PostgresEntityDatabaseAdapterProvider.d.ts +1 -1
- package/build/PostgresEntityQueryContextProvider.js +1 -0
- package/build/PostgresEntityQueryContextProvider.js.map +1 -1
- package/build/__integration-tests__/PostgresEntityIntegration-test.js +118 -135
- package/build/__integration-tests__/PostgresEntityIntegration-test.js.map +1 -1
- package/build/__integration-tests__/PostgresEntityQueryContextProvider-test.js +5 -15
- package/build/__integration-tests__/PostgresEntityQueryContextProvider-test.js.map +1 -1
- package/build/__integration-tests__/PostgresInvalidSetup-test.js +9 -28
- package/build/__integration-tests__/PostgresInvalidSetup-test.js.map +1 -1
- package/build/__integration-tests__/errors-test.js +13 -15
- package/build/__integration-tests__/errors-test.js.map +1 -1
- package/build/errors/__tests__/wrapNativePostgresCallAsync-test.js.map +1 -1
- package/build/errors/wrapNativePostgresCallAsync.js.map +1 -1
- package/build/testfixtures/ErrorsTestEntity.js +12 -15
- package/build/testfixtures/ErrorsTestEntity.js.map +1 -1
- package/build/testfixtures/InvalidTestEntity.js +12 -15
- package/build/testfixtures/InvalidTestEntity.js.map +1 -1
- package/build/testfixtures/PostgresTestEntity.js +12 -15
- package/build/testfixtures/PostgresTestEntity.js.map +1 -1
- package/build/testfixtures/PostgresTriggerTestEntity.js +16 -15
- package/build/testfixtures/PostgresTriggerTestEntity.js.map +1 -1
- package/build/testfixtures/PostgresUniqueTestEntity.js +12 -15
- package/build/testfixtures/PostgresUniqueTestEntity.js.map +1 -1
- package/build/testfixtures/PostgresValidatorTestEntity.js +14 -15
- package/build/testfixtures/PostgresValidatorTestEntity.js.map +1 -1
- package/package.json +5 -5
- package/src/PostgresEntityDatabaseAdapter.ts +15 -13
- package/src/PostgresEntityDatabaseAdapterProvider.ts +2 -2
- package/src/PostgresEntityQueryContextProvider.ts +5 -5
- package/src/__integration-tests__/PostgresEntityIntegration-test.ts +195 -456
- package/src/__integration-tests__/PostgresEntityQueryContextProvider-test.ts +5 -30
- package/src/__integration-tests__/PostgresInvalidSetup-test.ts +11 -57
- package/src/__integration-tests__/errors-test.ts +25 -66
- package/src/__tests__/EntityFields-test.ts +3 -3
- package/src/errors/wrapNativePostgresCallAsync.ts +2 -2
- package/src/testfixtures/ErrorsTestEntity.ts +2 -2
- package/src/testfixtures/PostgresTriggerTestEntity.ts +10 -4
- package/src/testfixtures/PostgresValidatorTestEntity.ts +2 -2
- package/src/testfixtures/createKnexIntegrationTestEntityCompanionProvider.ts +2 -2
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { EntityDatabaseAdapter, FieldTransformerMap, TableQuerySelectionModifiers, TableFieldSingleValueEqualityCondition, TableFieldMultiValueEqualityCondition, TableQuerySelectionModifiersWithOrderByRaw } from '@expo/entity';
|
|
2
2
|
import { Knex } from 'knex';
|
|
3
|
-
export default class PostgresEntityDatabaseAdapter<TFields
|
|
3
|
+
export default class PostgresEntityDatabaseAdapter<TFields extends Record<string, any>> extends EntityDatabaseAdapter<TFields> {
|
|
4
4
|
protected getFieldTransformerMap(): FieldTransformerMap;
|
|
5
5
|
protected fetchManyWhereInternalAsync(queryInterface: Knex, tableName: string, tableField: string, tableValues: readonly any[]): Promise<object[]>;
|
|
6
6
|
private applyQueryModifiersToQueryOrderByRaw;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PostgresEntityDatabaseAdapter.js","sourceRoot":"","sources":["../src/PostgresEntityDatabaseAdapter.ts"],"names":[],"mappings":";;;;;AAAA,yCAQsB;AAGtB,iDAAqE;AACrE,uGAA+E;AAE/E,MAAqB,
|
|
1
|
+
{"version":3,"file":"PostgresEntityDatabaseAdapter.js","sourceRoot":"","sources":["../src/PostgresEntityDatabaseAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { IEntityDatabaseAdapterProvider, EntityConfiguration, EntityDatabaseAdapter } from '@expo/entity';
|
|
2
2
|
export default class PostgresEntityDatabaseAdapterProvider implements IEntityDatabaseAdapterProvider {
|
|
3
|
-
getDatabaseAdapter<TFields
|
|
3
|
+
getDatabaseAdapter<TFields extends Record<string, any>>(entityConfiguration: EntityConfiguration<TFields>): EntityDatabaseAdapter<TFields>;
|
|
4
4
|
}
|
|
@@ -5,6 +5,7 @@ const entity_1 = require("@expo/entity");
|
|
|
5
5
|
* Query context provider for knex (postgres).
|
|
6
6
|
*/
|
|
7
7
|
class PostgresEntityQueryContextProvider extends entity_1.EntityQueryContextProvider {
|
|
8
|
+
knexInstance;
|
|
8
9
|
constructor(knexInstance) {
|
|
9
10
|
super();
|
|
10
11
|
this.knexInstance = knexInstance;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PostgresEntityQueryContextProvider.js","sourceRoot":"","sources":["../src/PostgresEntityQueryContextProvider.ts"],"names":[],"mappings":";;AAAA,yCAIsB;AAGtB;;GAEG;AACH,MAAqB,kCAAmC,SAAQ,mCAA0B;
|
|
1
|
+
{"version":3,"file":"PostgresEntityQueryContextProvider.js","sourceRoot":"","sources":["../src/PostgresEntityQueryContextProvider.ts"],"names":[],"mappings":";;AAAA,yCAIsB;AAGtB;;GAEG;AACH,MAAqB,kCAAmC,SAAQ,mCAA0B;IAC3D;IAA7B,YAA6B,YAAkB;QAC7C,KAAK,EAAE,CAAC;QADmB,iBAAY,GAAZ,YAAY,CAAM;IAE/C,CAAC;IAES,iBAAiB;QACzB,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAES,uBAAuB,CAC/B,iBAAqC;QAErC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAC1B,IAAI,CAAC,YAAY,CAAC,WAAW,CAC3B,gBAAgB,EAChB,iBAAiB;YACf,CAAC,CAAC,kCAAkC,CAAC,wBAAwB,CAAC,iBAAiB,CAAC;YAChF,CAAC,CAAC,SAAS,CACd,CAAC;IACN,CAAC;IAES,6BAA6B,CACrC,mBAAwB;QAExB,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAE,mBAA4B,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC;IAC3F,CAAC;IAEO,MAAM,CAAC,wBAAwB,CACrC,iBAAoC;QAEpC,MAAM,qBAAqB,GAAG,CAC5B,cAAyC,EACnB,EAAE;YACxB,QAAQ,cAAc,EAAE,CAAC;gBACvB,KAAK,kCAAyB,CAAC,cAAc;oBAC3C,OAAO,gBAAgB,CAAC;gBAC1B,KAAK,kCAAyB,CAAC,eAAe;oBAC5C,OAAO,iBAAiB,CAAC;gBAC3B,KAAK,kCAAyB,CAAC,YAAY;oBACzC,OAAO,cAAc,CAAC;YAC1B,CAAC;QACH,CAAC,CAAC;QAEF,OAAO;YACL,GAAG,CAAC,iBAAiB,CAAC,cAAc;gBAClC,CAAC,CAAC,EAAE,cAAc,EAAE,qBAAqB,CAAC,iBAAiB,CAAC,cAAc,CAAC,EAAE;gBAC7E,CAAC,CAAC,EAAE,CAAC;SACR,CAAC;IACJ,CAAC;CACF;AAjDD,qDAiDC"}
|
|
@@ -7,6 +7,7 @@ const entity_1 = require("@expo/entity");
|
|
|
7
7
|
const results_1 = require("@expo/results");
|
|
8
8
|
const knex_1 = require("knex");
|
|
9
9
|
const nullthrows_1 = __importDefault(require("nullthrows"));
|
|
10
|
+
const promises_1 = require("timers/promises");
|
|
10
11
|
const PostgresTestEntity_1 = __importDefault(require("../testfixtures/PostgresTestEntity"));
|
|
11
12
|
const PostgresTriggerTestEntity_1 = __importDefault(require("../testfixtures/PostgresTriggerTestEntity"));
|
|
12
13
|
const PostgresValidatorTestEntity_1 = __importDefault(require("../testfixtures/PostgresValidatorTestEntity"));
|
|
@@ -34,19 +35,13 @@ describe('postgres entity integration', () => {
|
|
|
34
35
|
});
|
|
35
36
|
it('supports parallel partial updates', async () => {
|
|
36
37
|
const vc = new entity_1.ViewerContext((0, createKnexIntegrationTestEntityCompanionProvider_1.createKnexIntegrationTestEntityCompanionProvider)(knexInstance));
|
|
37
|
-
const entity = await (0, results_1.enforceAsyncResult)(PostgresTestEntity_1.default.creator(vc
|
|
38
|
-
.setField('name', 'hello')
|
|
39
|
-
.createAsync());
|
|
38
|
+
const entity = await (0, results_1.enforceAsyncResult)(PostgresTestEntity_1.default.creator(vc).setField('name', 'hello').createAsync());
|
|
40
39
|
// update two different fields at the same time (from the same entity)
|
|
41
40
|
await Promise.all([
|
|
42
|
-
PostgresTestEntity_1.default.updater(entity
|
|
43
|
-
|
|
44
|
-
.updateAsync(),
|
|
45
|
-
PostgresTestEntity_1.default.updater(entity, vc.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres'))
|
|
46
|
-
.setField('hasADog', false)
|
|
47
|
-
.updateAsync(),
|
|
41
|
+
PostgresTestEntity_1.default.updater(entity).setField('hasACat', true).updateAsync(),
|
|
42
|
+
PostgresTestEntity_1.default.updater(entity).setField('hasADog', false).updateAsync(),
|
|
48
43
|
]);
|
|
49
|
-
const loadedEntity = await PostgresTestEntity_1.default.loader(vc
|
|
44
|
+
const loadedEntity = await PostgresTestEntity_1.default.loader(vc)
|
|
50
45
|
.enforcing()
|
|
51
46
|
.loadByIDAsync(entity.getID());
|
|
52
47
|
expect(loadedEntity.getField('hasACat')).toBe(true);
|
|
@@ -55,74 +50,78 @@ describe('postgres entity integration', () => {
|
|
|
55
50
|
describe('empty creates and updates', () => {
|
|
56
51
|
it('allows empty create', async () => {
|
|
57
52
|
const vc = new entity_1.ViewerContext((0, createKnexIntegrationTestEntityCompanionProvider_1.createKnexIntegrationTestEntityCompanionProvider)(knexInstance));
|
|
58
|
-
const entity = await (0, results_1.enforceAsyncResult)(PostgresTestEntity_1.default.creator(vc
|
|
53
|
+
const entity = await (0, results_1.enforceAsyncResult)(PostgresTestEntity_1.default.creator(vc).createAsync());
|
|
59
54
|
expect(entity.getID()).toBeTruthy();
|
|
60
55
|
});
|
|
61
56
|
it('throws knex error upon empty update', async () => {
|
|
62
57
|
const vc = new entity_1.ViewerContext((0, createKnexIntegrationTestEntityCompanionProvider_1.createKnexIntegrationTestEntityCompanionProvider)(knexInstance));
|
|
63
|
-
const entity = await (0, results_1.enforceAsyncResult)(PostgresTestEntity_1.default.creator(vc
|
|
64
|
-
|
|
65
|
-
.createAsync());
|
|
66
|
-
await expect(PostgresTestEntity_1.default.updater(entity, vc.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')).updateAsync()).rejects.toThrow();
|
|
58
|
+
const entity = await (0, results_1.enforceAsyncResult)(PostgresTestEntity_1.default.creator(vc).setField('name', 'hello').createAsync());
|
|
59
|
+
await expect(PostgresTestEntity_1.default.updater(entity).updateAsync()).rejects.toThrow();
|
|
67
60
|
});
|
|
68
61
|
it('throws error upon empty update for stub database adapter to match behavior', async () => {
|
|
69
62
|
const vc = new entity_1.ViewerContext((0, entity_1.createUnitTestEntityCompanionProvider)());
|
|
70
|
-
const entity = await (0, results_1.enforceAsyncResult)(PostgresTestEntity_1.default.creator(vc
|
|
71
|
-
|
|
72
|
-
.createAsync());
|
|
73
|
-
await expect(PostgresTestEntity_1.default.updater(entity, vc.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')).updateAsync()).rejects.toThrow();
|
|
63
|
+
const entity = await (0, results_1.enforceAsyncResult)(PostgresTestEntity_1.default.creator(vc).setField('name', 'hello').createAsync());
|
|
64
|
+
await expect(PostgresTestEntity_1.default.updater(entity).updateAsync()).rejects.toThrow();
|
|
74
65
|
});
|
|
75
66
|
});
|
|
76
67
|
it('supports transactions', async () => {
|
|
77
68
|
const vc1 = new entity_1.ViewerContext((0, createKnexIntegrationTestEntityCompanionProvider_1.createKnexIntegrationTestEntityCompanionProvider)(knexInstance));
|
|
78
69
|
// put one in the DB
|
|
79
|
-
const firstEntity = await (0, results_1.enforceAsyncResult)(PostgresTestEntity_1.default.creator(vc1
|
|
80
|
-
|
|
81
|
-
.createAsync());
|
|
82
|
-
await (0, results_1.enforceAsyncResult)(PostgresTestEntity_1.default.loader(vc1, vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')).loadByIDAsync(firstEntity.getID()));
|
|
70
|
+
const firstEntity = await (0, results_1.enforceAsyncResult)(PostgresTestEntity_1.default.creator(vc1).setField('name', 'hello').createAsync());
|
|
71
|
+
await PostgresTestEntity_1.default.loader(vc1).enforcing().loadByIDAsync(firstEntity.getID());
|
|
83
72
|
const errorToThrow = new Error('Intentional error');
|
|
84
73
|
await expect(vc1.runInTransactionForDatabaseAdaptorFlavorAsync('postgres', async (queryContext) => {
|
|
85
74
|
// put another in the DB that will be rolled back due to error thrown
|
|
86
75
|
await (0, results_1.enforceAsyncResult)(PostgresTestEntity_1.default.creator(vc1, queryContext).setField('name', 'hello').createAsync());
|
|
87
76
|
throw errorToThrow;
|
|
88
|
-
})).rejects.toEqual(errorToThrow);
|
|
89
|
-
const entities = await
|
|
77
|
+
}, {})).rejects.toEqual(errorToThrow);
|
|
78
|
+
const entities = await PostgresTestEntity_1.default.loader(vc1)
|
|
79
|
+
.enforcing()
|
|
80
|
+
.loadManyByFieldEqualingAsync('name', 'hello');
|
|
90
81
|
expect(entities).toHaveLength(1);
|
|
91
82
|
});
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
.setField('name', 'hello')
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
83
|
+
describe('isolation levels', () => {
|
|
84
|
+
test.each(Object.values(entity_1.TransactionIsolationLevel))('isolation level: %p', async (isolationLevel) => {
|
|
85
|
+
const vc1 = new entity_1.ViewerContext((0, createKnexIntegrationTestEntityCompanionProvider_1.createKnexIntegrationTestEntityCompanionProvider)(knexInstance));
|
|
86
|
+
const firstEntity = await (0, results_1.enforceAsyncResult)(PostgresTestEntity_1.default.creator(vc1).setField('name', 'hello').createAsync());
|
|
87
|
+
const loadAndUpdateAsync = async (newName, delay) => {
|
|
88
|
+
try {
|
|
89
|
+
await vc1.runInTransactionForDatabaseAdaptorFlavorAsync('postgres', async (queryContext) => {
|
|
90
|
+
const entity = await PostgresTestEntity_1.default.loader(vc1, queryContext)
|
|
91
|
+
.enforcing()
|
|
92
|
+
.loadByIDAsync(firstEntity.getID());
|
|
93
|
+
await (0, promises_1.setTimeout)(delay);
|
|
94
|
+
await PostgresTestEntity_1.default.updater(entity, queryContext)
|
|
95
|
+
.setField('name', entity.getField('name') + ',' + newName)
|
|
96
|
+
.enforceUpdateAsync();
|
|
97
|
+
}, { isolationLevel });
|
|
98
|
+
return {};
|
|
99
|
+
}
|
|
100
|
+
catch (e) {
|
|
101
|
+
return { error: e };
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
// do some parallel updates to trigger serializable error in at least some of them
|
|
105
|
+
const results = await Promise.all([
|
|
106
|
+
loadAndUpdateAsync('hello2', 0),
|
|
107
|
+
loadAndUpdateAsync('hello3', 100),
|
|
108
|
+
loadAndUpdateAsync('hello4', 200),
|
|
109
|
+
loadAndUpdateAsync('hello5', 300),
|
|
110
|
+
]);
|
|
111
|
+
if (isolationLevel === entity_1.TransactionIsolationLevel.READ_COMMITTED) {
|
|
112
|
+
// read committed seems executes the transactions and doesn't produce a consistent result, but doesn't throw
|
|
113
|
+
expect(results.filter((r) => !!r.error).length > 0).toBe(false);
|
|
108
114
|
}
|
|
109
|
-
|
|
110
|
-
|
|
115
|
+
else {
|
|
116
|
+
// all other isolation levels throw since they're doing nonrepeatable reads
|
|
117
|
+
expect(results.filter((r) => r.error?.cause?.code === '40001').length > 0).toBe(true);
|
|
111
118
|
}
|
|
112
|
-
};
|
|
113
|
-
// do some parallel updates to trigger serializable error in at least some of them
|
|
114
|
-
const results = await Promise.all([
|
|
115
|
-
loadAndUpdateAsync('hello2'),
|
|
116
|
-
loadAndUpdateAsync('hello3'),
|
|
117
|
-
loadAndUpdateAsync('hello4'),
|
|
118
|
-
loadAndUpdateAsync('hello5'),
|
|
119
|
-
]);
|
|
120
|
-
expect(results.filter((r) => r.error?.cause?.code === '40001').length > 0).toBe(true);
|
|
119
|
+
});
|
|
121
120
|
});
|
|
122
121
|
describe('JSON fields', () => {
|
|
123
122
|
it('supports both types of array fields', async () => {
|
|
124
123
|
const vc1 = new entity_1.ViewerContext((0, createKnexIntegrationTestEntityCompanionProvider_1.createKnexIntegrationTestEntityCompanionProvider)(knexInstance));
|
|
125
|
-
const entity = await (0, results_1.enforceAsyncResult)(PostgresTestEntity_1.default.creator(vc1
|
|
124
|
+
const entity = await (0, results_1.enforceAsyncResult)(PostgresTestEntity_1.default.creator(vc1)
|
|
126
125
|
.setField('stringArray', ['hello', 'world'])
|
|
127
126
|
.setField('jsonArrayField', ['hello', 'world'])
|
|
128
127
|
.createAsync());
|
|
@@ -131,17 +130,17 @@ describe('postgres entity integration', () => {
|
|
|
131
130
|
});
|
|
132
131
|
it('supports object field', async () => {
|
|
133
132
|
const vc1 = new entity_1.ViewerContext((0, createKnexIntegrationTestEntityCompanionProvider_1.createKnexIntegrationTestEntityCompanionProvider)(knexInstance));
|
|
134
|
-
const entity = await (0, results_1.enforceAsyncResult)(PostgresTestEntity_1.default.creator(vc1
|
|
133
|
+
const entity = await (0, results_1.enforceAsyncResult)(PostgresTestEntity_1.default.creator(vc1)
|
|
135
134
|
.setField('jsonObjectField', { hello: 'world' })
|
|
136
135
|
.createAsync());
|
|
137
136
|
expect(entity.getField('jsonObjectField')).toEqual({ hello: 'world' });
|
|
138
137
|
});
|
|
139
138
|
it('supports MaybeJSONArray field', async () => {
|
|
140
139
|
const vc1 = new entity_1.ViewerContext((0, createKnexIntegrationTestEntityCompanionProvider_1.createKnexIntegrationTestEntityCompanionProvider)(knexInstance));
|
|
141
|
-
const entity1 = await (0, results_1.enforceAsyncResult)(PostgresTestEntity_1.default.creator(vc1
|
|
140
|
+
const entity1 = await (0, results_1.enforceAsyncResult)(PostgresTestEntity_1.default.creator(vc1)
|
|
142
141
|
.setField('maybeJsonArrayField', ['hello', 'world'])
|
|
143
142
|
.createAsync());
|
|
144
|
-
const entity2 = await (0, results_1.enforceAsyncResult)(PostgresTestEntity_1.default.creator(vc1
|
|
143
|
+
const entity2 = await (0, results_1.enforceAsyncResult)(PostgresTestEntity_1.default.creator(vc1)
|
|
145
144
|
.setField('maybeJsonArrayField', { hello: 'world' })
|
|
146
145
|
.createAsync());
|
|
147
146
|
expect(entity1.getField('maybeJsonArrayField')).toEqual(['hello', 'world']);
|
|
@@ -151,39 +150,33 @@ describe('postgres entity integration', () => {
|
|
|
151
150
|
describe('BIGINT fields', () => {
|
|
152
151
|
it('supports BIGINT fields', async () => {
|
|
153
152
|
const vc1 = new entity_1.ViewerContext((0, createKnexIntegrationTestEntityCompanionProvider_1.createKnexIntegrationTestEntityCompanionProvider)(knexInstance));
|
|
154
|
-
let entity = await (0, results_1.enforceAsyncResult)(PostgresTestEntity_1.default.creator(vc1
|
|
155
|
-
.setField('bigintField', '72057594037928038')
|
|
156
|
-
.createAsync());
|
|
153
|
+
let entity = await (0, results_1.enforceAsyncResult)(PostgresTestEntity_1.default.creator(vc1).setField('bigintField', '72057594037928038').createAsync());
|
|
157
154
|
expect(entity.getField('bigintField')).toEqual('72057594037928038');
|
|
158
|
-
entity = await (0, results_1.enforceAsyncResult)(PostgresTestEntity_1.default.updater(entity
|
|
159
|
-
.setField('bigintField', '10')
|
|
160
|
-
.updateAsync());
|
|
155
|
+
entity = await (0, results_1.enforceAsyncResult)(PostgresTestEntity_1.default.updater(entity).setField('bigintField', '10').updateAsync());
|
|
161
156
|
expect(entity.getField('bigintField')).toEqual('10');
|
|
162
|
-
entity = await (0, results_1.enforceAsyncResult)(PostgresTestEntity_1.default.updater(entity
|
|
163
|
-
.setField('bigintField', '-10')
|
|
164
|
-
.updateAsync());
|
|
157
|
+
entity = await (0, results_1.enforceAsyncResult)(PostgresTestEntity_1.default.updater(entity).setField('bigintField', '-10').updateAsync());
|
|
165
158
|
expect(entity.getField('bigintField')).toEqual('-10');
|
|
166
159
|
});
|
|
167
160
|
});
|
|
168
161
|
describe('conjunction field equality loading', () => {
|
|
169
162
|
it('supports single fieldValue and multiple fieldValues', async () => {
|
|
170
163
|
const vc1 = new entity_1.ViewerContext((0, createKnexIntegrationTestEntityCompanionProvider_1.createKnexIntegrationTestEntityCompanionProvider)(knexInstance));
|
|
171
|
-
await (0, results_1.enforceAsyncResult)(PostgresTestEntity_1.default.creator(vc1
|
|
164
|
+
await (0, results_1.enforceAsyncResult)(PostgresTestEntity_1.default.creator(vc1)
|
|
172
165
|
.setField('name', 'hello')
|
|
173
166
|
.setField('hasACat', false)
|
|
174
167
|
.setField('hasADog', true)
|
|
175
168
|
.createAsync());
|
|
176
|
-
await (0, results_1.enforceAsyncResult)(PostgresTestEntity_1.default.creator(vc1
|
|
169
|
+
await (0, results_1.enforceAsyncResult)(PostgresTestEntity_1.default.creator(vc1)
|
|
177
170
|
.setField('name', 'world')
|
|
178
171
|
.setField('hasACat', false)
|
|
179
172
|
.setField('hasADog', true)
|
|
180
173
|
.createAsync());
|
|
181
|
-
await (0, results_1.enforceAsyncResult)(PostgresTestEntity_1.default.creator(vc1
|
|
174
|
+
await (0, results_1.enforceAsyncResult)(PostgresTestEntity_1.default.creator(vc1)
|
|
182
175
|
.setField('name', 'wat')
|
|
183
176
|
.setField('hasACat', false)
|
|
184
177
|
.setField('hasADog', false)
|
|
185
178
|
.createAsync());
|
|
186
|
-
const results = await PostgresTestEntity_1.default.loader(vc1
|
|
179
|
+
const results = await PostgresTestEntity_1.default.loader(vc1)
|
|
187
180
|
.enforcing()
|
|
188
181
|
.loadManyByFieldEqualityConjunctionAsync([
|
|
189
182
|
{
|
|
@@ -196,7 +189,7 @@ describe('postgres entity integration', () => {
|
|
|
196
189
|
},
|
|
197
190
|
]);
|
|
198
191
|
expect(results).toHaveLength(2);
|
|
199
|
-
const results2 = await PostgresTestEntity_1.default.loader(vc1
|
|
192
|
+
const results2 = await PostgresTestEntity_1.default.loader(vc1)
|
|
200
193
|
.enforcing()
|
|
201
194
|
.loadManyByFieldEqualityConjunctionAsync([
|
|
202
195
|
{ fieldName: 'hasADog', fieldValues: [true, false] },
|
|
@@ -205,16 +198,10 @@ describe('postgres entity integration', () => {
|
|
|
205
198
|
});
|
|
206
199
|
it('supports query modifiers', async () => {
|
|
207
200
|
const vc1 = new entity_1.ViewerContext((0, createKnexIntegrationTestEntityCompanionProvider_1.createKnexIntegrationTestEntityCompanionProvider)(knexInstance));
|
|
208
|
-
await (0, results_1.enforceAsyncResult)(PostgresTestEntity_1.default.creator(vc1
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
await
|
|
212
|
-
.setField('name', 'b')
|
|
213
|
-
.createAsync());
|
|
214
|
-
await (0, results_1.enforceAsyncResult)(PostgresTestEntity_1.default.creator(vc1, vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres'))
|
|
215
|
-
.setField('name', 'c')
|
|
216
|
-
.createAsync());
|
|
217
|
-
const results = await PostgresTestEntity_1.default.loader(vc1, vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres'))
|
|
201
|
+
await (0, results_1.enforceAsyncResult)(PostgresTestEntity_1.default.creator(vc1).setField('name', 'a').createAsync());
|
|
202
|
+
await (0, results_1.enforceAsyncResult)(PostgresTestEntity_1.default.creator(vc1).setField('name', 'b').createAsync());
|
|
203
|
+
await (0, results_1.enforceAsyncResult)(PostgresTestEntity_1.default.creator(vc1).setField('name', 'c').createAsync());
|
|
204
|
+
const results = await PostgresTestEntity_1.default.loader(vc1)
|
|
218
205
|
.enforcing()
|
|
219
206
|
.loadManyByFieldEqualityConjunctionAsync([], {
|
|
220
207
|
limit: 2,
|
|
@@ -231,28 +218,28 @@ describe('postgres entity integration', () => {
|
|
|
231
218
|
});
|
|
232
219
|
it('supports null field values', async () => {
|
|
233
220
|
const vc1 = new entity_1.ViewerContext((0, createKnexIntegrationTestEntityCompanionProvider_1.createKnexIntegrationTestEntityCompanionProvider)(knexInstance));
|
|
234
|
-
await (0, results_1.enforceAsyncResult)(PostgresTestEntity_1.default.creator(vc1
|
|
221
|
+
await (0, results_1.enforceAsyncResult)(PostgresTestEntity_1.default.creator(vc1)
|
|
235
222
|
.setField('name', 'a')
|
|
236
223
|
.setField('hasADog', true)
|
|
237
224
|
.createAsync());
|
|
238
|
-
await (0, results_1.enforceAsyncResult)(PostgresTestEntity_1.default.creator(vc1
|
|
225
|
+
await (0, results_1.enforceAsyncResult)(PostgresTestEntity_1.default.creator(vc1)
|
|
239
226
|
.setField('name', 'b')
|
|
240
227
|
.setField('hasADog', true)
|
|
241
228
|
.createAsync());
|
|
242
|
-
await (0, results_1.enforceAsyncResult)(PostgresTestEntity_1.default.creator(vc1
|
|
229
|
+
await (0, results_1.enforceAsyncResult)(PostgresTestEntity_1.default.creator(vc1)
|
|
243
230
|
.setField('name', null)
|
|
244
231
|
.setField('hasADog', true)
|
|
245
232
|
.createAsync());
|
|
246
|
-
await (0, results_1.enforceAsyncResult)(PostgresTestEntity_1.default.creator(vc1
|
|
233
|
+
await (0, results_1.enforceAsyncResult)(PostgresTestEntity_1.default.creator(vc1)
|
|
247
234
|
.setField('name', null)
|
|
248
235
|
.setField('hasADog', false)
|
|
249
236
|
.createAsync());
|
|
250
|
-
const results = await PostgresTestEntity_1.default.loader(vc1
|
|
237
|
+
const results = await PostgresTestEntity_1.default.loader(vc1)
|
|
251
238
|
.enforcing()
|
|
252
239
|
.loadManyByFieldEqualityConjunctionAsync([{ fieldName: 'name', fieldValue: null }]);
|
|
253
240
|
expect(results).toHaveLength(2);
|
|
254
241
|
expect(results[0].getField('name')).toBeNull();
|
|
255
|
-
const results2 = await PostgresTestEntity_1.default.loader(vc1
|
|
242
|
+
const results2 = await PostgresTestEntity_1.default.loader(vc1)
|
|
256
243
|
.enforcing()
|
|
257
244
|
.loadManyByFieldEqualityConjunctionAsync([
|
|
258
245
|
{ fieldName: 'name', fieldValues: ['a', null] },
|
|
@@ -272,42 +259,42 @@ describe('postgres entity integration', () => {
|
|
|
272
259
|
describe('raw where clause loading', () => {
|
|
273
260
|
it('loads by raw where clause', async () => {
|
|
274
261
|
const vc1 = new entity_1.ViewerContext((0, createKnexIntegrationTestEntityCompanionProvider_1.createKnexIntegrationTestEntityCompanionProvider)(knexInstance));
|
|
275
|
-
await (0, results_1.enforceAsyncResult)(PostgresTestEntity_1.default.creator(vc1
|
|
262
|
+
await (0, results_1.enforceAsyncResult)(PostgresTestEntity_1.default.creator(vc1)
|
|
276
263
|
.setField('name', 'hello')
|
|
277
264
|
.setField('hasACat', false)
|
|
278
265
|
.setField('hasADog', true)
|
|
279
266
|
.createAsync());
|
|
280
|
-
const results = await PostgresTestEntity_1.default.loader(vc1
|
|
267
|
+
const results = await PostgresTestEntity_1.default.loader(vc1)
|
|
281
268
|
.enforcing()
|
|
282
269
|
.loadManyByRawWhereClauseAsync('name = ?', ['hello']);
|
|
283
270
|
expect(results).toHaveLength(1);
|
|
284
271
|
});
|
|
285
272
|
it('throws with invalid where clause', async () => {
|
|
286
273
|
const vc1 = new entity_1.ViewerContext((0, createKnexIntegrationTestEntityCompanionProvider_1.createKnexIntegrationTestEntityCompanionProvider)(knexInstance));
|
|
287
|
-
await (0, results_1.enforceAsyncResult)(PostgresTestEntity_1.default.creator(vc1
|
|
274
|
+
await (0, results_1.enforceAsyncResult)(PostgresTestEntity_1.default.creator(vc1)
|
|
288
275
|
.setField('name', 'hello')
|
|
289
276
|
.setField('hasACat', false)
|
|
290
277
|
.setField('hasADog', true)
|
|
291
278
|
.createAsync());
|
|
292
|
-
await expect(PostgresTestEntity_1.default.loader(vc1
|
|
279
|
+
await expect(PostgresTestEntity_1.default.loader(vc1)
|
|
293
280
|
.enforcing()
|
|
294
281
|
.loadManyByRawWhereClauseAsync('invalid_column = ?', ['hello'])).rejects.toThrow();
|
|
295
282
|
});
|
|
296
283
|
it('supports query modifiers', async () => {
|
|
297
284
|
const vc1 = new entity_1.ViewerContext((0, createKnexIntegrationTestEntityCompanionProvider_1.createKnexIntegrationTestEntityCompanionProvider)(knexInstance));
|
|
298
|
-
await (0, results_1.enforceAsyncResult)(PostgresTestEntity_1.default.creator(vc1
|
|
285
|
+
await (0, results_1.enforceAsyncResult)(PostgresTestEntity_1.default.creator(vc1)
|
|
299
286
|
.setField('name', 'a')
|
|
300
287
|
.setField('hasADog', true)
|
|
301
288
|
.createAsync());
|
|
302
|
-
await (0, results_1.enforceAsyncResult)(PostgresTestEntity_1.default.creator(vc1
|
|
289
|
+
await (0, results_1.enforceAsyncResult)(PostgresTestEntity_1.default.creator(vc1)
|
|
303
290
|
.setField('name', 'b')
|
|
304
291
|
.setField('hasADog', true)
|
|
305
292
|
.createAsync());
|
|
306
|
-
await (0, results_1.enforceAsyncResult)(PostgresTestEntity_1.default.creator(vc1
|
|
293
|
+
await (0, results_1.enforceAsyncResult)(PostgresTestEntity_1.default.creator(vc1)
|
|
307
294
|
.setField('name', 'c')
|
|
308
295
|
.setField('hasADog', true)
|
|
309
296
|
.createAsync());
|
|
310
|
-
const results = await PostgresTestEntity_1.default.loader(vc1
|
|
297
|
+
const results = await PostgresTestEntity_1.default.loader(vc1)
|
|
311
298
|
.enforcing()
|
|
312
299
|
.loadManyByRawWhereClauseAsync('has_a_dog = ?', [true], {
|
|
313
300
|
limit: 2,
|
|
@@ -321,7 +308,7 @@ describe('postgres entity integration', () => {
|
|
|
321
308
|
});
|
|
322
309
|
expect(results).toHaveLength(2);
|
|
323
310
|
expect(results.map((e) => e.getField('name'))).toEqual(['b', 'c']);
|
|
324
|
-
const resultsMultipleOrderBy = await PostgresTestEntity_1.default.loader(vc1
|
|
311
|
+
const resultsMultipleOrderBy = await PostgresTestEntity_1.default.loader(vc1)
|
|
325
312
|
.enforcing()
|
|
326
313
|
.loadManyByRawWhereClauseAsync('has_a_dog = ?', [true], {
|
|
327
314
|
orderBy: [
|
|
@@ -337,7 +324,7 @@ describe('postgres entity integration', () => {
|
|
|
337
324
|
});
|
|
338
325
|
expect(resultsMultipleOrderBy).toHaveLength(3);
|
|
339
326
|
expect(resultsMultipleOrderBy.map((e) => e.getField('name'))).toEqual(['c', 'b', 'a']);
|
|
340
|
-
const resultsOrderByRaw = await PostgresTestEntity_1.default.loader(vc1
|
|
327
|
+
const resultsOrderByRaw = await PostgresTestEntity_1.default.loader(vc1)
|
|
341
328
|
.enforcing()
|
|
342
329
|
.loadManyByRawWhereClauseAsync('has_a_dog = ?', [true], {
|
|
343
330
|
orderByRaw: 'has_a_dog ASC, name DESC',
|
|
@@ -350,34 +337,30 @@ describe('postgres entity integration', () => {
|
|
|
350
337
|
describe('create', () => {
|
|
351
338
|
it('rolls back transaction when trigger throws except afterCommit', async () => {
|
|
352
339
|
const vc1 = new entity_1.ViewerContext((0, createKnexIntegrationTestEntityCompanionProvider_1.createKnexIntegrationTestEntityCompanionProvider)(knexInstance));
|
|
353
|
-
await expect(PostgresTriggerTestEntity_1.default.creator(vc1
|
|
340
|
+
await expect(PostgresTriggerTestEntity_1.default.creator(vc1)
|
|
354
341
|
.setField('name', 'beforeCreate')
|
|
355
342
|
.enforceCreateAsync()).rejects.toThrowError('name cannot have value beforeCreate');
|
|
356
|
-
await expect(PostgresTriggerTestEntity_1.default.loader(vc1
|
|
343
|
+
await expect(PostgresTriggerTestEntity_1.default.loader(vc1)
|
|
357
344
|
.enforcing()
|
|
358
345
|
.loadByFieldEqualingAsync('name', 'beforeCreate')).resolves.toBeNull();
|
|
359
|
-
await expect(PostgresTriggerTestEntity_1.default.creator(vc1
|
|
346
|
+
await expect(PostgresTriggerTestEntity_1.default.creator(vc1)
|
|
360
347
|
.setField('name', 'afterCreate')
|
|
361
348
|
.enforceCreateAsync()).rejects.toThrowError('name cannot have value afterCreate');
|
|
362
|
-
await expect(PostgresTriggerTestEntity_1.default.loader(vc1
|
|
349
|
+
await expect(PostgresTriggerTestEntity_1.default.loader(vc1)
|
|
363
350
|
.enforcing()
|
|
364
351
|
.loadByFieldEqualingAsync('name', 'afterCreate')).resolves.toBeNull();
|
|
365
|
-
await expect(PostgresTriggerTestEntity_1.default.creator(vc1,
|
|
366
|
-
|
|
367
|
-
.enforceCreateAsync()).rejects.toThrowError('name cannot have value beforeAll');
|
|
368
|
-
await expect(PostgresTriggerTestEntity_1.default.loader(vc1, vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres'))
|
|
352
|
+
await expect(PostgresTriggerTestEntity_1.default.creator(vc1).setField('name', 'beforeAll').enforceCreateAsync()).rejects.toThrowError('name cannot have value beforeAll');
|
|
353
|
+
await expect(PostgresTriggerTestEntity_1.default.loader(vc1)
|
|
369
354
|
.enforcing()
|
|
370
355
|
.loadByFieldEqualingAsync('name', 'beforeAll')).resolves.toBeNull();
|
|
371
|
-
await expect(PostgresTriggerTestEntity_1.default.creator(vc1,
|
|
372
|
-
|
|
373
|
-
.enforceCreateAsync()).rejects.toThrowError('name cannot have value afterAll');
|
|
374
|
-
await expect(PostgresTriggerTestEntity_1.default.loader(vc1, vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres'))
|
|
356
|
+
await expect(PostgresTriggerTestEntity_1.default.creator(vc1).setField('name', 'afterAll').enforceCreateAsync()).rejects.toThrowError('name cannot have value afterAll');
|
|
357
|
+
await expect(PostgresTriggerTestEntity_1.default.loader(vc1)
|
|
375
358
|
.enforcing()
|
|
376
359
|
.loadByFieldEqualingAsync('name', 'afterAll')).resolves.toBeNull();
|
|
377
|
-
await expect(PostgresTriggerTestEntity_1.default.creator(vc1
|
|
360
|
+
await expect(PostgresTriggerTestEntity_1.default.creator(vc1)
|
|
378
361
|
.setField('name', 'afterCommit')
|
|
379
362
|
.enforceCreateAsync()).rejects.toThrowError('name cannot have value afterCommit');
|
|
380
|
-
await expect(PostgresTriggerTestEntity_1.default.loader(vc1
|
|
363
|
+
await expect(PostgresTriggerTestEntity_1.default.loader(vc1)
|
|
381
364
|
.enforcing()
|
|
382
365
|
.loadByFieldEqualingAsync('name', 'afterCommit')).resolves.not.toBeNull();
|
|
383
366
|
});
|
|
@@ -385,37 +368,37 @@ describe('postgres entity integration', () => {
|
|
|
385
368
|
describe('update', () => {
|
|
386
369
|
it('rolls back transaction when trigger throws except afterCommit', async () => {
|
|
387
370
|
const vc1 = new entity_1.ViewerContext((0, createKnexIntegrationTestEntityCompanionProvider_1.createKnexIntegrationTestEntityCompanionProvider)(knexInstance));
|
|
388
|
-
const entity = await PostgresTriggerTestEntity_1.default.creator(vc1
|
|
371
|
+
const entity = await PostgresTriggerTestEntity_1.default.creator(vc1)
|
|
389
372
|
.setField('name', 'blah')
|
|
390
373
|
.enforceCreateAsync();
|
|
391
|
-
await expect(PostgresTriggerTestEntity_1.default.updater(entity
|
|
374
|
+
await expect(PostgresTriggerTestEntity_1.default.updater(entity)
|
|
392
375
|
.setField('name', 'beforeUpdate')
|
|
393
376
|
.enforceUpdateAsync()).rejects.toThrowError('name cannot have value beforeUpdate');
|
|
394
|
-
await expect(PostgresTriggerTestEntity_1.default.loader(vc1
|
|
377
|
+
await expect(PostgresTriggerTestEntity_1.default.loader(vc1)
|
|
395
378
|
.enforcing()
|
|
396
379
|
.loadByFieldEqualingAsync('name', 'beforeUpdate')).resolves.toBeNull();
|
|
397
|
-
await expect(PostgresTriggerTestEntity_1.default.updater(entity
|
|
380
|
+
await expect(PostgresTriggerTestEntity_1.default.updater(entity)
|
|
398
381
|
.setField('name', 'afterUpdate')
|
|
399
382
|
.enforceUpdateAsync()).rejects.toThrowError('name cannot have value afterUpdate');
|
|
400
|
-
await expect(PostgresTriggerTestEntity_1.default.loader(vc1
|
|
383
|
+
await expect(PostgresTriggerTestEntity_1.default.loader(vc1)
|
|
401
384
|
.enforcing()
|
|
402
385
|
.loadByFieldEqualingAsync('name', 'afterUpdate')).resolves.toBeNull();
|
|
403
|
-
await expect(PostgresTriggerTestEntity_1.default.updater(entity
|
|
386
|
+
await expect(PostgresTriggerTestEntity_1.default.updater(entity)
|
|
404
387
|
.setField('name', 'beforeAll')
|
|
405
388
|
.enforceUpdateAsync()).rejects.toThrowError('name cannot have value beforeAll');
|
|
406
|
-
await expect(PostgresTriggerTestEntity_1.default.loader(vc1
|
|
389
|
+
await expect(PostgresTriggerTestEntity_1.default.loader(vc1)
|
|
407
390
|
.enforcing()
|
|
408
391
|
.loadByFieldEqualingAsync('name', 'beforeAll')).resolves.toBeNull();
|
|
409
|
-
await expect(PostgresTriggerTestEntity_1.default.updater(entity
|
|
392
|
+
await expect(PostgresTriggerTestEntity_1.default.updater(entity)
|
|
410
393
|
.setField('name', 'afterAll')
|
|
411
394
|
.enforceUpdateAsync()).rejects.toThrowError('name cannot have value afterAll');
|
|
412
|
-
await expect(PostgresTriggerTestEntity_1.default.loader(vc1
|
|
395
|
+
await expect(PostgresTriggerTestEntity_1.default.loader(vc1)
|
|
413
396
|
.enforcing()
|
|
414
397
|
.loadByFieldEqualingAsync('name', 'afterAll')).resolves.toBeNull();
|
|
415
|
-
await expect(PostgresTriggerTestEntity_1.default.updater(entity
|
|
398
|
+
await expect(PostgresTriggerTestEntity_1.default.updater(entity)
|
|
416
399
|
.setField('name', 'afterCommit')
|
|
417
400
|
.enforceUpdateAsync()).rejects.toThrowError('name cannot have value afterCommit');
|
|
418
|
-
await expect(PostgresTriggerTestEntity_1.default.loader(vc1
|
|
401
|
+
await expect(PostgresTriggerTestEntity_1.default.loader(vc1)
|
|
419
402
|
.enforcing()
|
|
420
403
|
.loadByFieldEqualingAsync('name', 'afterCommit')).resolves.not.toBeNull();
|
|
421
404
|
});
|
|
@@ -423,18 +406,18 @@ describe('postgres entity integration', () => {
|
|
|
423
406
|
describe('delete', () => {
|
|
424
407
|
it('rolls back transaction when trigger throws except afterCommit', async () => {
|
|
425
408
|
const vc1 = new entity_1.ViewerContext((0, createKnexIntegrationTestEntityCompanionProvider_1.createKnexIntegrationTestEntityCompanionProvider)(knexInstance));
|
|
426
|
-
const entityBeforeDelete = await PostgresTriggerTestEntity_1.default.creator(vc1
|
|
409
|
+
const entityBeforeDelete = await PostgresTriggerTestEntity_1.default.creator(vc1)
|
|
427
410
|
.setField('name', 'beforeDelete')
|
|
428
411
|
.enforceCreateAsync();
|
|
429
|
-
await expect(PostgresTriggerTestEntity_1.default.enforceDeleteAsync(entityBeforeDelete
|
|
430
|
-
await expect(PostgresTriggerTestEntity_1.default.loader(vc1
|
|
412
|
+
await expect(PostgresTriggerTestEntity_1.default.enforceDeleteAsync(entityBeforeDelete)).rejects.toThrowError('name cannot have value beforeDelete');
|
|
413
|
+
await expect(PostgresTriggerTestEntity_1.default.loader(vc1)
|
|
431
414
|
.enforcing()
|
|
432
415
|
.loadByFieldEqualingAsync('name', 'beforeDelete')).resolves.not.toBeNull();
|
|
433
|
-
const entityAfterDelete = await PostgresTriggerTestEntity_1.default.creator(vc1
|
|
416
|
+
const entityAfterDelete = await PostgresTriggerTestEntity_1.default.creator(vc1)
|
|
434
417
|
.setField('name', 'afterDelete')
|
|
435
418
|
.enforceCreateAsync();
|
|
436
|
-
await expect(PostgresTriggerTestEntity_1.default.enforceDeleteAsync(entityAfterDelete
|
|
437
|
-
await expect(PostgresTriggerTestEntity_1.default.loader(vc1
|
|
419
|
+
await expect(PostgresTriggerTestEntity_1.default.enforceDeleteAsync(entityAfterDelete)).rejects.toThrowError('name cannot have value afterDelete');
|
|
420
|
+
await expect(PostgresTriggerTestEntity_1.default.loader(vc1)
|
|
438
421
|
.enforcing()
|
|
439
422
|
.loadByFieldEqualingAsync('name', 'afterDelete')).resolves.not.toBeNull();
|
|
440
423
|
});
|
|
@@ -443,10 +426,10 @@ describe('postgres entity integration', () => {
|
|
|
443
426
|
describe('create', () => {
|
|
444
427
|
it('rolls back transaction when trigger throws ', async () => {
|
|
445
428
|
const vc1 = new entity_1.ViewerContext((0, createKnexIntegrationTestEntityCompanionProvider_1.createKnexIntegrationTestEntityCompanionProvider)(knexInstance));
|
|
446
|
-
await expect(PostgresValidatorTestEntity_1.default.creator(vc1
|
|
429
|
+
await expect(PostgresValidatorTestEntity_1.default.creator(vc1)
|
|
447
430
|
.setField('name', 'beforeCreateAndBeforeUpdate')
|
|
448
431
|
.enforceCreateAsync()).rejects.toThrowError('name cannot have value beforeCreateAndBeforeUpdate');
|
|
449
|
-
await expect(PostgresValidatorTestEntity_1.default.loader(vc1
|
|
432
|
+
await expect(PostgresValidatorTestEntity_1.default.loader(vc1)
|
|
450
433
|
.enforcing()
|
|
451
434
|
.loadByFieldEqualingAsync('name', 'beforeCreateAndBeforeUpdate')).resolves.toBeNull();
|
|
452
435
|
});
|
|
@@ -454,13 +437,13 @@ describe('postgres entity integration', () => {
|
|
|
454
437
|
describe('update', () => {
|
|
455
438
|
it('rolls back transaction when trigger throws ', async () => {
|
|
456
439
|
const vc1 = new entity_1.ViewerContext((0, createKnexIntegrationTestEntityCompanionProvider_1.createKnexIntegrationTestEntityCompanionProvider)(knexInstance));
|
|
457
|
-
const entity = await PostgresValidatorTestEntity_1.default.creator(vc1
|
|
440
|
+
const entity = await PostgresValidatorTestEntity_1.default.creator(vc1)
|
|
458
441
|
.setField('name', 'blah')
|
|
459
442
|
.enforceCreateAsync();
|
|
460
|
-
await expect(PostgresValidatorTestEntity_1.default.updater(entity
|
|
443
|
+
await expect(PostgresValidatorTestEntity_1.default.updater(entity)
|
|
461
444
|
.setField('name', 'beforeCreateAndBeforeUpdate')
|
|
462
445
|
.enforceUpdateAsync()).rejects.toThrowError('name cannot have value beforeCreateAndBeforeUpdate');
|
|
463
|
-
await expect(PostgresValidatorTestEntity_1.default.loader(vc1
|
|
446
|
+
await expect(PostgresValidatorTestEntity_1.default.loader(vc1)
|
|
464
447
|
.enforcing()
|
|
465
448
|
.loadByFieldEqualingAsync('name', 'beforeCreateAndBeforeUpdate')).resolves.toBeNull();
|
|
466
449
|
});
|
|
@@ -468,11 +451,11 @@ describe('postgres entity integration', () => {
|
|
|
468
451
|
describe('delete', () => {
|
|
469
452
|
it('validation should not run on a delete mutation', async () => {
|
|
470
453
|
const vc1 = new entity_1.ViewerContext((0, createKnexIntegrationTestEntityCompanionProvider_1.createKnexIntegrationTestEntityCompanionProvider)(knexInstance));
|
|
471
|
-
const entityToDelete = await PostgresValidatorTestEntity_1.default.creator(vc1
|
|
454
|
+
const entityToDelete = await PostgresValidatorTestEntity_1.default.creator(vc1)
|
|
472
455
|
.setField('name', 'shouldBeDeleted')
|
|
473
456
|
.enforceCreateAsync();
|
|
474
|
-
await PostgresValidatorTestEntity_1.default.enforceDeleteAsync(entityToDelete
|
|
475
|
-
await expect(PostgresValidatorTestEntity_1.default.loader(vc1
|
|
457
|
+
await PostgresValidatorTestEntity_1.default.enforceDeleteAsync(entityToDelete);
|
|
458
|
+
await expect(PostgresValidatorTestEntity_1.default.loader(vc1)
|
|
476
459
|
.enforcing()
|
|
477
460
|
.loadByFieldEqualingAsync('name', 'shouldBeDeleted')).resolves.toBeNull();
|
|
478
461
|
});
|