@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,13 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
2
|
OrderByOrdering,
|
|
3
3
|
createUnitTestEntityCompanionProvider,
|
|
4
|
-
enforceResultsAsync,
|
|
5
4
|
ViewerContext,
|
|
6
5
|
TransactionIsolationLevel,
|
|
7
6
|
} from '@expo/entity';
|
|
8
7
|
import { enforceAsyncResult } from '@expo/results';
|
|
9
8
|
import { knex, Knex } from 'knex';
|
|
10
9
|
import nullthrows from 'nullthrows';
|
|
10
|
+
import { setTimeout } from 'timers/promises';
|
|
11
11
|
|
|
12
12
|
import PostgresTestEntity from '../testfixtures/PostgresTestEntity';
|
|
13
13
|
import PostgresTriggerTestEntity from '../testfixtures/PostgresTriggerTestEntity';
|
|
@@ -42,34 +42,16 @@ describe('postgres entity integration', () => {
|
|
|
42
42
|
it('supports parallel partial updates', async () => {
|
|
43
43
|
const vc = new ViewerContext(createKnexIntegrationTestEntityCompanionProvider(knexInstance));
|
|
44
44
|
const entity = await enforceAsyncResult(
|
|
45
|
-
PostgresTestEntity.creator(
|
|
46
|
-
vc,
|
|
47
|
-
vc.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
48
|
-
)
|
|
49
|
-
.setField('name', 'hello')
|
|
50
|
-
.createAsync()
|
|
45
|
+
PostgresTestEntity.creator(vc).setField('name', 'hello').createAsync(),
|
|
51
46
|
);
|
|
52
47
|
|
|
53
48
|
// update two different fields at the same time (from the same entity)
|
|
54
49
|
await Promise.all([
|
|
55
|
-
PostgresTestEntity.updater(
|
|
56
|
-
|
|
57
|
-
vc.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
58
|
-
)
|
|
59
|
-
.setField('hasACat', true)
|
|
60
|
-
.updateAsync(),
|
|
61
|
-
PostgresTestEntity.updater(
|
|
62
|
-
entity,
|
|
63
|
-
vc.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
64
|
-
)
|
|
65
|
-
.setField('hasADog', false)
|
|
66
|
-
.updateAsync(),
|
|
50
|
+
PostgresTestEntity.updater(entity).setField('hasACat', true).updateAsync(),
|
|
51
|
+
PostgresTestEntity.updater(entity).setField('hasADog', false).updateAsync(),
|
|
67
52
|
]);
|
|
68
53
|
|
|
69
|
-
const loadedEntity = await PostgresTestEntity.loader(
|
|
70
|
-
vc,
|
|
71
|
-
vc.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
72
|
-
)
|
|
54
|
+
const loadedEntity = await PostgresTestEntity.loader(vc)
|
|
73
55
|
.enforcing()
|
|
74
56
|
.loadByIDAsync(entity.getID());
|
|
75
57
|
|
|
@@ -80,49 +62,24 @@ describe('postgres entity integration', () => {
|
|
|
80
62
|
describe('empty creates and updates', () => {
|
|
81
63
|
it('allows empty create', async () => {
|
|
82
64
|
const vc = new ViewerContext(createKnexIntegrationTestEntityCompanionProvider(knexInstance));
|
|
83
|
-
const entity = await enforceAsyncResult(
|
|
84
|
-
PostgresTestEntity.creator(
|
|
85
|
-
vc,
|
|
86
|
-
vc.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
87
|
-
).createAsync()
|
|
88
|
-
);
|
|
65
|
+
const entity = await enforceAsyncResult(PostgresTestEntity.creator(vc).createAsync());
|
|
89
66
|
expect(entity.getID()).toBeTruthy();
|
|
90
67
|
});
|
|
91
68
|
|
|
92
69
|
it('throws knex error upon empty update', async () => {
|
|
93
70
|
const vc = new ViewerContext(createKnexIntegrationTestEntityCompanionProvider(knexInstance));
|
|
94
71
|
const entity = await enforceAsyncResult(
|
|
95
|
-
PostgresTestEntity.creator(
|
|
96
|
-
vc,
|
|
97
|
-
vc.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
98
|
-
)
|
|
99
|
-
.setField('name', 'hello')
|
|
100
|
-
.createAsync()
|
|
72
|
+
PostgresTestEntity.creator(vc).setField('name', 'hello').createAsync(),
|
|
101
73
|
);
|
|
102
|
-
await expect(
|
|
103
|
-
PostgresTestEntity.updater(
|
|
104
|
-
entity,
|
|
105
|
-
vc.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
106
|
-
).updateAsync()
|
|
107
|
-
).rejects.toThrow();
|
|
74
|
+
await expect(PostgresTestEntity.updater(entity).updateAsync()).rejects.toThrow();
|
|
108
75
|
});
|
|
109
76
|
|
|
110
77
|
it('throws error upon empty update for stub database adapter to match behavior', async () => {
|
|
111
78
|
const vc = new ViewerContext(createUnitTestEntityCompanionProvider());
|
|
112
79
|
const entity = await enforceAsyncResult(
|
|
113
|
-
PostgresTestEntity.creator(
|
|
114
|
-
vc,
|
|
115
|
-
vc.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
116
|
-
)
|
|
117
|
-
.setField('name', 'hello')
|
|
118
|
-
.createAsync()
|
|
80
|
+
PostgresTestEntity.creator(vc).setField('name', 'hello').createAsync(),
|
|
119
81
|
);
|
|
120
|
-
await expect(
|
|
121
|
-
PostgresTestEntity.updater(
|
|
122
|
-
entity,
|
|
123
|
-
vc.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
124
|
-
).updateAsync()
|
|
125
|
-
).rejects.toThrow();
|
|
82
|
+
await expect(PostgresTestEntity.updater(entity).updateAsync()).rejects.toThrow();
|
|
126
83
|
});
|
|
127
84
|
});
|
|
128
85
|
|
|
@@ -131,84 +88,89 @@ describe('postgres entity integration', () => {
|
|
|
131
88
|
|
|
132
89
|
// put one in the DB
|
|
133
90
|
const firstEntity = await enforceAsyncResult(
|
|
134
|
-
PostgresTestEntity.creator(
|
|
135
|
-
vc1,
|
|
136
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
137
|
-
)
|
|
138
|
-
.setField('name', 'hello')
|
|
139
|
-
.createAsync()
|
|
91
|
+
PostgresTestEntity.creator(vc1).setField('name', 'hello').createAsync(),
|
|
140
92
|
);
|
|
141
93
|
|
|
142
|
-
await
|
|
143
|
-
PostgresTestEntity.loader(
|
|
144
|
-
vc1,
|
|
145
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
146
|
-
).loadByIDAsync(firstEntity.getID())
|
|
147
|
-
);
|
|
94
|
+
await PostgresTestEntity.loader(vc1).enforcing().loadByIDAsync(firstEntity.getID());
|
|
148
95
|
|
|
149
96
|
const errorToThrow = new Error('Intentional error');
|
|
150
97
|
|
|
151
98
|
await expect(
|
|
152
|
-
vc1.runInTransactionForDatabaseAdaptorFlavorAsync(
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
99
|
+
vc1.runInTransactionForDatabaseAdaptorFlavorAsync(
|
|
100
|
+
'postgres',
|
|
101
|
+
async (queryContext) => {
|
|
102
|
+
// put another in the DB that will be rolled back due to error thrown
|
|
103
|
+
await enforceAsyncResult(
|
|
104
|
+
PostgresTestEntity.creator(vc1, queryContext).setField('name', 'hello').createAsync(),
|
|
105
|
+
);
|
|
157
106
|
|
|
158
|
-
|
|
159
|
-
|
|
107
|
+
throw errorToThrow;
|
|
108
|
+
},
|
|
109
|
+
{}, // test empty transaction config
|
|
110
|
+
),
|
|
160
111
|
).rejects.toEqual(errorToThrow);
|
|
161
112
|
|
|
162
|
-
const entities = await
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
166
|
-
).loadManyByFieldEqualingAsync('name', 'hello')
|
|
167
|
-
);
|
|
113
|
+
const entities = await PostgresTestEntity.loader(vc1)
|
|
114
|
+
.enforcing()
|
|
115
|
+
.loadManyByFieldEqualingAsync('name', 'hello');
|
|
168
116
|
expect(entities).toHaveLength(1);
|
|
169
117
|
});
|
|
170
118
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
)
|
|
179
|
-
.setField('name', 'hello')
|
|
180
|
-
.createAsync()
|
|
181
|
-
);
|
|
119
|
+
describe('isolation levels', () => {
|
|
120
|
+
test.each(Object.values(TransactionIsolationLevel))(
|
|
121
|
+
'isolation level: %p',
|
|
122
|
+
async (isolationLevel: TransactionIsolationLevel) => {
|
|
123
|
+
const vc1 = new ViewerContext(
|
|
124
|
+
createKnexIntegrationTestEntityCompanionProvider(knexInstance),
|
|
125
|
+
);
|
|
182
126
|
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
await vc1.runInTransactionForDatabaseAdaptorFlavorAsync(
|
|
186
|
-
'postgres',
|
|
187
|
-
async (queryContext) => {
|
|
188
|
-
const entity = await PostgresTestEntity.loader(vc1, queryContext)
|
|
189
|
-
.enforcing()
|
|
190
|
-
.loadByIDAsync(firstEntity.getID());
|
|
191
|
-
await PostgresTestEntity.updater(entity, queryContext)
|
|
192
|
-
.setField('name', newName)
|
|
193
|
-
.enforceUpdateAsync();
|
|
194
|
-
},
|
|
195
|
-
{ isolationLevel: TransactionIsolationLevel.SERIALIZABLE }
|
|
127
|
+
const firstEntity = await enforceAsyncResult(
|
|
128
|
+
PostgresTestEntity.creator(vc1).setField('name', 'hello').createAsync(),
|
|
196
129
|
);
|
|
197
|
-
return {};
|
|
198
|
-
} catch (e) {
|
|
199
|
-
return { error: e as Error };
|
|
200
|
-
}
|
|
201
|
-
};
|
|
202
|
-
|
|
203
|
-
// do some parallel updates to trigger serializable error in at least some of them
|
|
204
|
-
const results = await Promise.all([
|
|
205
|
-
loadAndUpdateAsync('hello2'),
|
|
206
|
-
loadAndUpdateAsync('hello3'),
|
|
207
|
-
loadAndUpdateAsync('hello4'),
|
|
208
|
-
loadAndUpdateAsync('hello5'),
|
|
209
|
-
]);
|
|
210
130
|
|
|
211
|
-
|
|
131
|
+
const loadAndUpdateAsync = async (
|
|
132
|
+
newName: string,
|
|
133
|
+
delay: number,
|
|
134
|
+
): Promise<{ error?: Error }> => {
|
|
135
|
+
try {
|
|
136
|
+
await vc1.runInTransactionForDatabaseAdaptorFlavorAsync(
|
|
137
|
+
'postgres',
|
|
138
|
+
async (queryContext) => {
|
|
139
|
+
const entity = await PostgresTestEntity.loader(vc1, queryContext)
|
|
140
|
+
.enforcing()
|
|
141
|
+
.loadByIDAsync(firstEntity.getID());
|
|
142
|
+
await setTimeout(delay);
|
|
143
|
+
await PostgresTestEntity.updater(entity, queryContext)
|
|
144
|
+
.setField('name', entity.getField('name') + ',' + newName)
|
|
145
|
+
.enforceUpdateAsync();
|
|
146
|
+
},
|
|
147
|
+
{ isolationLevel },
|
|
148
|
+
);
|
|
149
|
+
return {};
|
|
150
|
+
} catch (e) {
|
|
151
|
+
return { error: e as Error };
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
|
|
155
|
+
// do some parallel updates to trigger serializable error in at least some of them
|
|
156
|
+
const results = await Promise.all([
|
|
157
|
+
loadAndUpdateAsync('hello2', 0),
|
|
158
|
+
loadAndUpdateAsync('hello3', 100),
|
|
159
|
+
loadAndUpdateAsync('hello4', 200),
|
|
160
|
+
loadAndUpdateAsync('hello5', 300),
|
|
161
|
+
]);
|
|
162
|
+
|
|
163
|
+
if (isolationLevel === TransactionIsolationLevel.READ_COMMITTED) {
|
|
164
|
+
// read committed seems executes the transactions and doesn't produce a consistent result, but doesn't throw
|
|
165
|
+
expect(results.filter((r) => !!r.error).length > 0).toBe(false);
|
|
166
|
+
} else {
|
|
167
|
+
// all other isolation levels throw since they're doing nonrepeatable reads
|
|
168
|
+
expect(results.filter((r) => (r.error as any)?.cause?.code === '40001').length > 0).toBe(
|
|
169
|
+
true,
|
|
170
|
+
);
|
|
171
|
+
}
|
|
172
|
+
},
|
|
173
|
+
);
|
|
212
174
|
});
|
|
213
175
|
|
|
214
176
|
describe('JSON fields', () => {
|
|
@@ -216,13 +178,10 @@ describe('postgres entity integration', () => {
|
|
|
216
178
|
const vc1 = new ViewerContext(createKnexIntegrationTestEntityCompanionProvider(knexInstance));
|
|
217
179
|
|
|
218
180
|
const entity = await enforceAsyncResult(
|
|
219
|
-
PostgresTestEntity.creator(
|
|
220
|
-
vc1,
|
|
221
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
222
|
-
)
|
|
181
|
+
PostgresTestEntity.creator(vc1)
|
|
223
182
|
.setField('stringArray', ['hello', 'world'])
|
|
224
183
|
.setField('jsonArrayField', ['hello', 'world'])
|
|
225
|
-
.createAsync()
|
|
184
|
+
.createAsync(),
|
|
226
185
|
);
|
|
227
186
|
|
|
228
187
|
expect(entity.getField('stringArray')).toEqual(['hello', 'world']);
|
|
@@ -233,12 +192,9 @@ describe('postgres entity integration', () => {
|
|
|
233
192
|
const vc1 = new ViewerContext(createKnexIntegrationTestEntityCompanionProvider(knexInstance));
|
|
234
193
|
|
|
235
194
|
const entity = await enforceAsyncResult(
|
|
236
|
-
PostgresTestEntity.creator(
|
|
237
|
-
vc1,
|
|
238
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
239
|
-
)
|
|
195
|
+
PostgresTestEntity.creator(vc1)
|
|
240
196
|
.setField('jsonObjectField', { hello: 'world' })
|
|
241
|
-
.createAsync()
|
|
197
|
+
.createAsync(),
|
|
242
198
|
);
|
|
243
199
|
|
|
244
200
|
expect(entity.getField('jsonObjectField')).toEqual({ hello: 'world' });
|
|
@@ -248,20 +204,14 @@ describe('postgres entity integration', () => {
|
|
|
248
204
|
const vc1 = new ViewerContext(createKnexIntegrationTestEntityCompanionProvider(knexInstance));
|
|
249
205
|
|
|
250
206
|
const entity1 = await enforceAsyncResult(
|
|
251
|
-
PostgresTestEntity.creator(
|
|
252
|
-
vc1,
|
|
253
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
254
|
-
)
|
|
207
|
+
PostgresTestEntity.creator(vc1)
|
|
255
208
|
.setField('maybeJsonArrayField', ['hello', 'world'])
|
|
256
|
-
.createAsync()
|
|
209
|
+
.createAsync(),
|
|
257
210
|
);
|
|
258
211
|
const entity2 = await enforceAsyncResult(
|
|
259
|
-
PostgresTestEntity.creator(
|
|
260
|
-
vc1,
|
|
261
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
262
|
-
)
|
|
212
|
+
PostgresTestEntity.creator(vc1)
|
|
263
213
|
.setField('maybeJsonArrayField', { hello: 'world' })
|
|
264
|
-
.createAsync()
|
|
214
|
+
.createAsync(),
|
|
265
215
|
);
|
|
266
216
|
|
|
267
217
|
expect(entity1.getField('maybeJsonArrayField')).toEqual(['hello', 'world']);
|
|
@@ -274,32 +224,17 @@ describe('postgres entity integration', () => {
|
|
|
274
224
|
const vc1 = new ViewerContext(createKnexIntegrationTestEntityCompanionProvider(knexInstance));
|
|
275
225
|
|
|
276
226
|
let entity = await enforceAsyncResult(
|
|
277
|
-
PostgresTestEntity.creator(
|
|
278
|
-
vc1,
|
|
279
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
280
|
-
)
|
|
281
|
-
.setField('bigintField', '72057594037928038')
|
|
282
|
-
.createAsync()
|
|
227
|
+
PostgresTestEntity.creator(vc1).setField('bigintField', '72057594037928038').createAsync(),
|
|
283
228
|
);
|
|
284
229
|
expect(entity.getField('bigintField')).toEqual('72057594037928038');
|
|
285
230
|
|
|
286
231
|
entity = await enforceAsyncResult(
|
|
287
|
-
PostgresTestEntity.updater(
|
|
288
|
-
entity,
|
|
289
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
290
|
-
)
|
|
291
|
-
.setField('bigintField', '10')
|
|
292
|
-
.updateAsync()
|
|
232
|
+
PostgresTestEntity.updater(entity).setField('bigintField', '10').updateAsync(),
|
|
293
233
|
);
|
|
294
234
|
expect(entity.getField('bigintField')).toEqual('10');
|
|
295
235
|
|
|
296
236
|
entity = await enforceAsyncResult(
|
|
297
|
-
PostgresTestEntity.updater(
|
|
298
|
-
entity,
|
|
299
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
300
|
-
)
|
|
301
|
-
.setField('bigintField', '-10')
|
|
302
|
-
.updateAsync()
|
|
237
|
+
PostgresTestEntity.updater(entity).setField('bigintField', '-10').updateAsync(),
|
|
303
238
|
);
|
|
304
239
|
expect(entity.getField('bigintField')).toEqual('-10');
|
|
305
240
|
});
|
|
@@ -310,42 +245,30 @@ describe('postgres entity integration', () => {
|
|
|
310
245
|
const vc1 = new ViewerContext(createKnexIntegrationTestEntityCompanionProvider(knexInstance));
|
|
311
246
|
|
|
312
247
|
await enforceAsyncResult(
|
|
313
|
-
PostgresTestEntity.creator(
|
|
314
|
-
vc1,
|
|
315
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
316
|
-
)
|
|
248
|
+
PostgresTestEntity.creator(vc1)
|
|
317
249
|
.setField('name', 'hello')
|
|
318
250
|
.setField('hasACat', false)
|
|
319
251
|
.setField('hasADog', true)
|
|
320
|
-
.createAsync()
|
|
252
|
+
.createAsync(),
|
|
321
253
|
);
|
|
322
254
|
|
|
323
255
|
await enforceAsyncResult(
|
|
324
|
-
PostgresTestEntity.creator(
|
|
325
|
-
vc1,
|
|
326
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
327
|
-
)
|
|
256
|
+
PostgresTestEntity.creator(vc1)
|
|
328
257
|
.setField('name', 'world')
|
|
329
258
|
.setField('hasACat', false)
|
|
330
259
|
.setField('hasADog', true)
|
|
331
|
-
.createAsync()
|
|
260
|
+
.createAsync(),
|
|
332
261
|
);
|
|
333
262
|
|
|
334
263
|
await enforceAsyncResult(
|
|
335
|
-
PostgresTestEntity.creator(
|
|
336
|
-
vc1,
|
|
337
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
338
|
-
)
|
|
264
|
+
PostgresTestEntity.creator(vc1)
|
|
339
265
|
.setField('name', 'wat')
|
|
340
266
|
.setField('hasACat', false)
|
|
341
267
|
.setField('hasADog', false)
|
|
342
|
-
.createAsync()
|
|
268
|
+
.createAsync(),
|
|
343
269
|
);
|
|
344
270
|
|
|
345
|
-
const results = await PostgresTestEntity.loader(
|
|
346
|
-
vc1,
|
|
347
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
348
|
-
)
|
|
271
|
+
const results = await PostgresTestEntity.loader(vc1)
|
|
349
272
|
.enforcing()
|
|
350
273
|
.loadManyByFieldEqualityConjunctionAsync([
|
|
351
274
|
{
|
|
@@ -360,10 +283,7 @@ describe('postgres entity integration', () => {
|
|
|
360
283
|
|
|
361
284
|
expect(results).toHaveLength(2);
|
|
362
285
|
|
|
363
|
-
const results2 = await PostgresTestEntity.loader(
|
|
364
|
-
vc1,
|
|
365
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
366
|
-
)
|
|
286
|
+
const results2 = await PostgresTestEntity.loader(vc1)
|
|
367
287
|
.enforcing()
|
|
368
288
|
.loadManyByFieldEqualityConjunctionAsync([
|
|
369
289
|
{ fieldName: 'hasADog', fieldValues: [true, false] },
|
|
@@ -374,37 +294,13 @@ describe('postgres entity integration', () => {
|
|
|
374
294
|
it('supports query modifiers', async () => {
|
|
375
295
|
const vc1 = new ViewerContext(createKnexIntegrationTestEntityCompanionProvider(knexInstance));
|
|
376
296
|
|
|
377
|
-
await enforceAsyncResult(
|
|
378
|
-
PostgresTestEntity.creator(
|
|
379
|
-
vc1,
|
|
380
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
381
|
-
)
|
|
382
|
-
.setField('name', 'a')
|
|
383
|
-
.createAsync()
|
|
384
|
-
);
|
|
297
|
+
await enforceAsyncResult(PostgresTestEntity.creator(vc1).setField('name', 'a').createAsync());
|
|
385
298
|
|
|
386
|
-
await enforceAsyncResult(
|
|
387
|
-
PostgresTestEntity.creator(
|
|
388
|
-
vc1,
|
|
389
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
390
|
-
)
|
|
391
|
-
.setField('name', 'b')
|
|
392
|
-
.createAsync()
|
|
393
|
-
);
|
|
299
|
+
await enforceAsyncResult(PostgresTestEntity.creator(vc1).setField('name', 'b').createAsync());
|
|
394
300
|
|
|
395
|
-
await enforceAsyncResult(
|
|
396
|
-
PostgresTestEntity.creator(
|
|
397
|
-
vc1,
|
|
398
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
399
|
-
)
|
|
400
|
-
.setField('name', 'c')
|
|
401
|
-
.createAsync()
|
|
402
|
-
);
|
|
301
|
+
await enforceAsyncResult(PostgresTestEntity.creator(vc1).setField('name', 'c').createAsync());
|
|
403
302
|
|
|
404
|
-
const results = await PostgresTestEntity.loader(
|
|
405
|
-
vc1,
|
|
406
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
407
|
-
)
|
|
303
|
+
const results = await PostgresTestEntity.loader(vc1)
|
|
408
304
|
.enforcing()
|
|
409
305
|
.loadManyByFieldEqualityConjunctionAsync([], {
|
|
410
306
|
limit: 2,
|
|
@@ -423,55 +319,37 @@ describe('postgres entity integration', () => {
|
|
|
423
319
|
it('supports null field values', async () => {
|
|
424
320
|
const vc1 = new ViewerContext(createKnexIntegrationTestEntityCompanionProvider(knexInstance));
|
|
425
321
|
await enforceAsyncResult(
|
|
426
|
-
PostgresTestEntity.creator(
|
|
427
|
-
vc1,
|
|
428
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
429
|
-
)
|
|
322
|
+
PostgresTestEntity.creator(vc1)
|
|
430
323
|
.setField('name', 'a')
|
|
431
324
|
.setField('hasADog', true)
|
|
432
|
-
.createAsync()
|
|
325
|
+
.createAsync(),
|
|
433
326
|
);
|
|
434
327
|
await enforceAsyncResult(
|
|
435
|
-
PostgresTestEntity.creator(
|
|
436
|
-
vc1,
|
|
437
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
438
|
-
)
|
|
328
|
+
PostgresTestEntity.creator(vc1)
|
|
439
329
|
.setField('name', 'b')
|
|
440
330
|
.setField('hasADog', true)
|
|
441
|
-
.createAsync()
|
|
331
|
+
.createAsync(),
|
|
442
332
|
);
|
|
443
333
|
await enforceAsyncResult(
|
|
444
|
-
PostgresTestEntity.creator(
|
|
445
|
-
vc1,
|
|
446
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
447
|
-
)
|
|
334
|
+
PostgresTestEntity.creator(vc1)
|
|
448
335
|
.setField('name', null)
|
|
449
336
|
.setField('hasADog', true)
|
|
450
|
-
.createAsync()
|
|
337
|
+
.createAsync(),
|
|
451
338
|
);
|
|
452
339
|
await enforceAsyncResult(
|
|
453
|
-
PostgresTestEntity.creator(
|
|
454
|
-
vc1,
|
|
455
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
456
|
-
)
|
|
340
|
+
PostgresTestEntity.creator(vc1)
|
|
457
341
|
.setField('name', null)
|
|
458
342
|
.setField('hasADog', false)
|
|
459
|
-
.createAsync()
|
|
343
|
+
.createAsync(),
|
|
460
344
|
);
|
|
461
345
|
|
|
462
|
-
const results = await PostgresTestEntity.loader(
|
|
463
|
-
vc1,
|
|
464
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
465
|
-
)
|
|
346
|
+
const results = await PostgresTestEntity.loader(vc1)
|
|
466
347
|
.enforcing()
|
|
467
348
|
.loadManyByFieldEqualityConjunctionAsync([{ fieldName: 'name', fieldValue: null }]);
|
|
468
349
|
expect(results).toHaveLength(2);
|
|
469
350
|
expect(results[0]!.getField('name')).toBeNull();
|
|
470
351
|
|
|
471
|
-
const results2 = await PostgresTestEntity.loader(
|
|
472
|
-
vc1,
|
|
473
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
474
|
-
)
|
|
352
|
+
const results2 = await PostgresTestEntity.loader(vc1)
|
|
475
353
|
.enforcing()
|
|
476
354
|
.loadManyByFieldEqualityConjunctionAsync(
|
|
477
355
|
[
|
|
@@ -485,7 +363,7 @@ describe('postgres entity integration', () => {
|
|
|
485
363
|
order: OrderByOrdering.DESCENDING,
|
|
486
364
|
},
|
|
487
365
|
],
|
|
488
|
-
}
|
|
366
|
+
},
|
|
489
367
|
);
|
|
490
368
|
expect(results2).toHaveLength(2);
|
|
491
369
|
expect(results2.map((e) => e.getField('name'))).toEqual([null, 'a']);
|
|
@@ -496,20 +374,14 @@ describe('postgres entity integration', () => {
|
|
|
496
374
|
it('loads by raw where clause', async () => {
|
|
497
375
|
const vc1 = new ViewerContext(createKnexIntegrationTestEntityCompanionProvider(knexInstance));
|
|
498
376
|
await enforceAsyncResult(
|
|
499
|
-
PostgresTestEntity.creator(
|
|
500
|
-
vc1,
|
|
501
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
502
|
-
)
|
|
377
|
+
PostgresTestEntity.creator(vc1)
|
|
503
378
|
.setField('name', 'hello')
|
|
504
379
|
.setField('hasACat', false)
|
|
505
380
|
.setField('hasADog', true)
|
|
506
|
-
.createAsync()
|
|
381
|
+
.createAsync(),
|
|
507
382
|
);
|
|
508
383
|
|
|
509
|
-
const results = await PostgresTestEntity.loader(
|
|
510
|
-
vc1,
|
|
511
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
512
|
-
)
|
|
384
|
+
const results = await PostgresTestEntity.loader(vc1)
|
|
513
385
|
.enforcing()
|
|
514
386
|
.loadManyByRawWhereClauseAsync('name = ?', ['hello']);
|
|
515
387
|
|
|
@@ -519,23 +391,17 @@ describe('postgres entity integration', () => {
|
|
|
519
391
|
it('throws with invalid where clause', async () => {
|
|
520
392
|
const vc1 = new ViewerContext(createKnexIntegrationTestEntityCompanionProvider(knexInstance));
|
|
521
393
|
await enforceAsyncResult(
|
|
522
|
-
PostgresTestEntity.creator(
|
|
523
|
-
vc1,
|
|
524
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
525
|
-
)
|
|
394
|
+
PostgresTestEntity.creator(vc1)
|
|
526
395
|
.setField('name', 'hello')
|
|
527
396
|
.setField('hasACat', false)
|
|
528
397
|
.setField('hasADog', true)
|
|
529
|
-
.createAsync()
|
|
398
|
+
.createAsync(),
|
|
530
399
|
);
|
|
531
400
|
|
|
532
401
|
await expect(
|
|
533
|
-
PostgresTestEntity.loader(
|
|
534
|
-
vc1,
|
|
535
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
536
|
-
)
|
|
402
|
+
PostgresTestEntity.loader(vc1)
|
|
537
403
|
.enforcing()
|
|
538
|
-
.loadManyByRawWhereClauseAsync('invalid_column = ?', ['hello'])
|
|
404
|
+
.loadManyByRawWhereClauseAsync('invalid_column = ?', ['hello']),
|
|
539
405
|
).rejects.toThrow();
|
|
540
406
|
});
|
|
541
407
|
|
|
@@ -543,39 +409,27 @@ describe('postgres entity integration', () => {
|
|
|
543
409
|
const vc1 = new ViewerContext(createKnexIntegrationTestEntityCompanionProvider(knexInstance));
|
|
544
410
|
|
|
545
411
|
await enforceAsyncResult(
|
|
546
|
-
PostgresTestEntity.creator(
|
|
547
|
-
vc1,
|
|
548
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
549
|
-
)
|
|
412
|
+
PostgresTestEntity.creator(vc1)
|
|
550
413
|
.setField('name', 'a')
|
|
551
414
|
.setField('hasADog', true)
|
|
552
|
-
.createAsync()
|
|
415
|
+
.createAsync(),
|
|
553
416
|
);
|
|
554
417
|
|
|
555
418
|
await enforceAsyncResult(
|
|
556
|
-
PostgresTestEntity.creator(
|
|
557
|
-
vc1,
|
|
558
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
559
|
-
)
|
|
419
|
+
PostgresTestEntity.creator(vc1)
|
|
560
420
|
.setField('name', 'b')
|
|
561
421
|
.setField('hasADog', true)
|
|
562
|
-
.createAsync()
|
|
422
|
+
.createAsync(),
|
|
563
423
|
);
|
|
564
424
|
|
|
565
425
|
await enforceAsyncResult(
|
|
566
|
-
PostgresTestEntity.creator(
|
|
567
|
-
vc1,
|
|
568
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
569
|
-
)
|
|
426
|
+
PostgresTestEntity.creator(vc1)
|
|
570
427
|
.setField('name', 'c')
|
|
571
428
|
.setField('hasADog', true)
|
|
572
|
-
.createAsync()
|
|
429
|
+
.createAsync(),
|
|
573
430
|
);
|
|
574
431
|
|
|
575
|
-
const results = await PostgresTestEntity.loader(
|
|
576
|
-
vc1,
|
|
577
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
578
|
-
)
|
|
432
|
+
const results = await PostgresTestEntity.loader(vc1)
|
|
579
433
|
.enforcing()
|
|
580
434
|
.loadManyByRawWhereClauseAsync('has_a_dog = ?', [true], {
|
|
581
435
|
limit: 2,
|
|
@@ -591,10 +445,7 @@ describe('postgres entity integration', () => {
|
|
|
591
445
|
expect(results).toHaveLength(2);
|
|
592
446
|
expect(results.map((e) => e.getField('name'))).toEqual(['b', 'c']);
|
|
593
447
|
|
|
594
|
-
const resultsMultipleOrderBy = await PostgresTestEntity.loader(
|
|
595
|
-
vc1,
|
|
596
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
597
|
-
)
|
|
448
|
+
const resultsMultipleOrderBy = await PostgresTestEntity.loader(vc1)
|
|
598
449
|
.enforcing()
|
|
599
450
|
.loadManyByRawWhereClauseAsync('has_a_dog = ?', [true], {
|
|
600
451
|
orderBy: [
|
|
@@ -612,10 +463,7 @@ describe('postgres entity integration', () => {
|
|
|
612
463
|
expect(resultsMultipleOrderBy).toHaveLength(3);
|
|
613
464
|
expect(resultsMultipleOrderBy.map((e) => e.getField('name'))).toEqual(['c', 'b', 'a']);
|
|
614
465
|
|
|
615
|
-
const resultsOrderByRaw = await PostgresTestEntity.loader(
|
|
616
|
-
vc1,
|
|
617
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
618
|
-
)
|
|
466
|
+
const resultsOrderByRaw = await PostgresTestEntity.loader(vc1)
|
|
619
467
|
.enforcing()
|
|
620
468
|
.loadManyByRawWhereClauseAsync('has_a_dog = ?', [true], {
|
|
621
469
|
orderByRaw: 'has_a_dog ASC, name DESC',
|
|
@@ -630,92 +478,58 @@ describe('postgres entity integration', () => {
|
|
|
630
478
|
describe('create', () => {
|
|
631
479
|
it('rolls back transaction when trigger throws except afterCommit', async () => {
|
|
632
480
|
const vc1 = new ViewerContext(
|
|
633
|
-
createKnexIntegrationTestEntityCompanionProvider(knexInstance)
|
|
481
|
+
createKnexIntegrationTestEntityCompanionProvider(knexInstance),
|
|
634
482
|
);
|
|
635
483
|
|
|
636
484
|
await expect(
|
|
637
|
-
PostgresTriggerTestEntity.creator(
|
|
638
|
-
vc1,
|
|
639
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
640
|
-
)
|
|
485
|
+
PostgresTriggerTestEntity.creator(vc1)
|
|
641
486
|
.setField('name', 'beforeCreate')
|
|
642
|
-
.enforceCreateAsync()
|
|
487
|
+
.enforceCreateAsync(),
|
|
643
488
|
).rejects.toThrowError('name cannot have value beforeCreate');
|
|
644
489
|
await expect(
|
|
645
|
-
PostgresTriggerTestEntity.loader(
|
|
646
|
-
vc1,
|
|
647
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
648
|
-
)
|
|
490
|
+
PostgresTriggerTestEntity.loader(vc1)
|
|
649
491
|
.enforcing()
|
|
650
|
-
.loadByFieldEqualingAsync('name', 'beforeCreate')
|
|
492
|
+
.loadByFieldEqualingAsync('name', 'beforeCreate'),
|
|
651
493
|
).resolves.toBeNull();
|
|
652
494
|
|
|
653
495
|
await expect(
|
|
654
|
-
PostgresTriggerTestEntity.creator(
|
|
655
|
-
vc1,
|
|
656
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
657
|
-
)
|
|
496
|
+
PostgresTriggerTestEntity.creator(vc1)
|
|
658
497
|
.setField('name', 'afterCreate')
|
|
659
|
-
.enforceCreateAsync()
|
|
498
|
+
.enforceCreateAsync(),
|
|
660
499
|
).rejects.toThrowError('name cannot have value afterCreate');
|
|
661
500
|
await expect(
|
|
662
|
-
PostgresTriggerTestEntity.loader(
|
|
663
|
-
vc1,
|
|
664
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
665
|
-
)
|
|
501
|
+
PostgresTriggerTestEntity.loader(vc1)
|
|
666
502
|
.enforcing()
|
|
667
|
-
.loadByFieldEqualingAsync('name', 'afterCreate')
|
|
503
|
+
.loadByFieldEqualingAsync('name', 'afterCreate'),
|
|
668
504
|
).resolves.toBeNull();
|
|
669
505
|
|
|
670
506
|
await expect(
|
|
671
|
-
PostgresTriggerTestEntity.creator(
|
|
672
|
-
vc1,
|
|
673
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
674
|
-
)
|
|
675
|
-
.setField('name', 'beforeAll')
|
|
676
|
-
.enforceCreateAsync()
|
|
507
|
+
PostgresTriggerTestEntity.creator(vc1).setField('name', 'beforeAll').enforceCreateAsync(),
|
|
677
508
|
).rejects.toThrowError('name cannot have value beforeAll');
|
|
678
509
|
await expect(
|
|
679
|
-
PostgresTriggerTestEntity.loader(
|
|
680
|
-
vc1,
|
|
681
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
682
|
-
)
|
|
510
|
+
PostgresTriggerTestEntity.loader(vc1)
|
|
683
511
|
.enforcing()
|
|
684
|
-
.loadByFieldEqualingAsync('name', 'beforeAll')
|
|
512
|
+
.loadByFieldEqualingAsync('name', 'beforeAll'),
|
|
685
513
|
).resolves.toBeNull();
|
|
686
514
|
|
|
687
515
|
await expect(
|
|
688
|
-
PostgresTriggerTestEntity.creator(
|
|
689
|
-
vc1,
|
|
690
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
691
|
-
)
|
|
692
|
-
.setField('name', 'afterAll')
|
|
693
|
-
.enforceCreateAsync()
|
|
516
|
+
PostgresTriggerTestEntity.creator(vc1).setField('name', 'afterAll').enforceCreateAsync(),
|
|
694
517
|
).rejects.toThrowError('name cannot have value afterAll');
|
|
695
518
|
await expect(
|
|
696
|
-
PostgresTriggerTestEntity.loader(
|
|
697
|
-
vc1,
|
|
698
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
699
|
-
)
|
|
519
|
+
PostgresTriggerTestEntity.loader(vc1)
|
|
700
520
|
.enforcing()
|
|
701
|
-
.loadByFieldEqualingAsync('name', 'afterAll')
|
|
521
|
+
.loadByFieldEqualingAsync('name', 'afterAll'),
|
|
702
522
|
).resolves.toBeNull();
|
|
703
523
|
|
|
704
524
|
await expect(
|
|
705
|
-
PostgresTriggerTestEntity.creator(
|
|
706
|
-
vc1,
|
|
707
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
708
|
-
)
|
|
525
|
+
PostgresTriggerTestEntity.creator(vc1)
|
|
709
526
|
.setField('name', 'afterCommit')
|
|
710
|
-
.enforceCreateAsync()
|
|
527
|
+
.enforceCreateAsync(),
|
|
711
528
|
).rejects.toThrowError('name cannot have value afterCommit');
|
|
712
529
|
await expect(
|
|
713
|
-
PostgresTriggerTestEntity.loader(
|
|
714
|
-
vc1,
|
|
715
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
716
|
-
)
|
|
530
|
+
PostgresTriggerTestEntity.loader(vc1)
|
|
717
531
|
.enforcing()
|
|
718
|
-
.loadByFieldEqualingAsync('name', 'afterCommit')
|
|
532
|
+
.loadByFieldEqualingAsync('name', 'afterCommit'),
|
|
719
533
|
).resolves.not.toBeNull();
|
|
720
534
|
});
|
|
721
535
|
});
|
|
@@ -723,99 +537,66 @@ describe('postgres entity integration', () => {
|
|
|
723
537
|
describe('update', () => {
|
|
724
538
|
it('rolls back transaction when trigger throws except afterCommit', async () => {
|
|
725
539
|
const vc1 = new ViewerContext(
|
|
726
|
-
createKnexIntegrationTestEntityCompanionProvider(knexInstance)
|
|
540
|
+
createKnexIntegrationTestEntityCompanionProvider(knexInstance),
|
|
727
541
|
);
|
|
728
542
|
|
|
729
|
-
const entity = await PostgresTriggerTestEntity.creator(
|
|
730
|
-
vc1,
|
|
731
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
732
|
-
)
|
|
543
|
+
const entity = await PostgresTriggerTestEntity.creator(vc1)
|
|
733
544
|
.setField('name', 'blah')
|
|
734
545
|
.enforceCreateAsync();
|
|
735
546
|
|
|
736
547
|
await expect(
|
|
737
|
-
PostgresTriggerTestEntity.updater(
|
|
738
|
-
entity,
|
|
739
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
740
|
-
)
|
|
548
|
+
PostgresTriggerTestEntity.updater(entity)
|
|
741
549
|
.setField('name', 'beforeUpdate')
|
|
742
|
-
.enforceUpdateAsync()
|
|
550
|
+
.enforceUpdateAsync(),
|
|
743
551
|
).rejects.toThrowError('name cannot have value beforeUpdate');
|
|
744
552
|
await expect(
|
|
745
|
-
PostgresTriggerTestEntity.loader(
|
|
746
|
-
vc1,
|
|
747
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
748
|
-
)
|
|
553
|
+
PostgresTriggerTestEntity.loader(vc1)
|
|
749
554
|
.enforcing()
|
|
750
|
-
.loadByFieldEqualingAsync('name', 'beforeUpdate')
|
|
555
|
+
.loadByFieldEqualingAsync('name', 'beforeUpdate'),
|
|
751
556
|
).resolves.toBeNull();
|
|
752
557
|
|
|
753
558
|
await expect(
|
|
754
|
-
PostgresTriggerTestEntity.updater(
|
|
755
|
-
entity,
|
|
756
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
757
|
-
)
|
|
559
|
+
PostgresTriggerTestEntity.updater(entity)
|
|
758
560
|
.setField('name', 'afterUpdate')
|
|
759
|
-
.enforceUpdateAsync()
|
|
561
|
+
.enforceUpdateAsync(),
|
|
760
562
|
).rejects.toThrowError('name cannot have value afterUpdate');
|
|
761
563
|
await expect(
|
|
762
|
-
PostgresTriggerTestEntity.loader(
|
|
763
|
-
vc1,
|
|
764
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
765
|
-
)
|
|
564
|
+
PostgresTriggerTestEntity.loader(vc1)
|
|
766
565
|
.enforcing()
|
|
767
|
-
.loadByFieldEqualingAsync('name', 'afterUpdate')
|
|
566
|
+
.loadByFieldEqualingAsync('name', 'afterUpdate'),
|
|
768
567
|
).resolves.toBeNull();
|
|
769
568
|
|
|
770
569
|
await expect(
|
|
771
|
-
PostgresTriggerTestEntity.updater(
|
|
772
|
-
entity,
|
|
773
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
774
|
-
)
|
|
570
|
+
PostgresTriggerTestEntity.updater(entity)
|
|
775
571
|
.setField('name', 'beforeAll')
|
|
776
|
-
.enforceUpdateAsync()
|
|
572
|
+
.enforceUpdateAsync(),
|
|
777
573
|
).rejects.toThrowError('name cannot have value beforeAll');
|
|
778
574
|
await expect(
|
|
779
|
-
PostgresTriggerTestEntity.loader(
|
|
780
|
-
vc1,
|
|
781
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
782
|
-
)
|
|
575
|
+
PostgresTriggerTestEntity.loader(vc1)
|
|
783
576
|
.enforcing()
|
|
784
|
-
.loadByFieldEqualingAsync('name', 'beforeAll')
|
|
577
|
+
.loadByFieldEqualingAsync('name', 'beforeAll'),
|
|
785
578
|
).resolves.toBeNull();
|
|
786
579
|
|
|
787
580
|
await expect(
|
|
788
|
-
PostgresTriggerTestEntity.updater(
|
|
789
|
-
entity,
|
|
790
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
791
|
-
)
|
|
581
|
+
PostgresTriggerTestEntity.updater(entity)
|
|
792
582
|
.setField('name', 'afterAll')
|
|
793
|
-
.enforceUpdateAsync()
|
|
583
|
+
.enforceUpdateAsync(),
|
|
794
584
|
).rejects.toThrowError('name cannot have value afterAll');
|
|
795
585
|
await expect(
|
|
796
|
-
PostgresTriggerTestEntity.loader(
|
|
797
|
-
vc1,
|
|
798
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
799
|
-
)
|
|
586
|
+
PostgresTriggerTestEntity.loader(vc1)
|
|
800
587
|
.enforcing()
|
|
801
|
-
.loadByFieldEqualingAsync('name', 'afterAll')
|
|
588
|
+
.loadByFieldEqualingAsync('name', 'afterAll'),
|
|
802
589
|
).resolves.toBeNull();
|
|
803
590
|
|
|
804
591
|
await expect(
|
|
805
|
-
PostgresTriggerTestEntity.updater(
|
|
806
|
-
entity,
|
|
807
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
808
|
-
)
|
|
592
|
+
PostgresTriggerTestEntity.updater(entity)
|
|
809
593
|
.setField('name', 'afterCommit')
|
|
810
|
-
.enforceUpdateAsync()
|
|
594
|
+
.enforceUpdateAsync(),
|
|
811
595
|
).rejects.toThrowError('name cannot have value afterCommit');
|
|
812
596
|
await expect(
|
|
813
|
-
PostgresTriggerTestEntity.loader(
|
|
814
|
-
vc1,
|
|
815
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
816
|
-
)
|
|
597
|
+
PostgresTriggerTestEntity.loader(vc1)
|
|
817
598
|
.enforcing()
|
|
818
|
-
.loadByFieldEqualingAsync('name', 'afterCommit')
|
|
599
|
+
.loadByFieldEqualingAsync('name', 'afterCommit'),
|
|
819
600
|
).resolves.not.toBeNull();
|
|
820
601
|
});
|
|
821
602
|
});
|
|
@@ -823,49 +604,31 @@ describe('postgres entity integration', () => {
|
|
|
823
604
|
describe('delete', () => {
|
|
824
605
|
it('rolls back transaction when trigger throws except afterCommit', async () => {
|
|
825
606
|
const vc1 = new ViewerContext(
|
|
826
|
-
createKnexIntegrationTestEntityCompanionProvider(knexInstance)
|
|
607
|
+
createKnexIntegrationTestEntityCompanionProvider(knexInstance),
|
|
827
608
|
);
|
|
828
609
|
|
|
829
|
-
const entityBeforeDelete = await PostgresTriggerTestEntity.creator(
|
|
830
|
-
vc1,
|
|
831
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
832
|
-
)
|
|
610
|
+
const entityBeforeDelete = await PostgresTriggerTestEntity.creator(vc1)
|
|
833
611
|
.setField('name', 'beforeDelete')
|
|
834
612
|
.enforceCreateAsync();
|
|
835
613
|
await expect(
|
|
836
|
-
PostgresTriggerTestEntity.enforceDeleteAsync(
|
|
837
|
-
entityBeforeDelete,
|
|
838
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
839
|
-
)
|
|
614
|
+
PostgresTriggerTestEntity.enforceDeleteAsync(entityBeforeDelete),
|
|
840
615
|
).rejects.toThrowError('name cannot have value beforeDelete');
|
|
841
616
|
await expect(
|
|
842
|
-
PostgresTriggerTestEntity.loader(
|
|
843
|
-
vc1,
|
|
844
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
845
|
-
)
|
|
617
|
+
PostgresTriggerTestEntity.loader(vc1)
|
|
846
618
|
.enforcing()
|
|
847
|
-
.loadByFieldEqualingAsync('name', 'beforeDelete')
|
|
619
|
+
.loadByFieldEqualingAsync('name', 'beforeDelete'),
|
|
848
620
|
).resolves.not.toBeNull();
|
|
849
621
|
|
|
850
|
-
const entityAfterDelete = await PostgresTriggerTestEntity.creator(
|
|
851
|
-
vc1,
|
|
852
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
853
|
-
)
|
|
622
|
+
const entityAfterDelete = await PostgresTriggerTestEntity.creator(vc1)
|
|
854
623
|
.setField('name', 'afterDelete')
|
|
855
624
|
.enforceCreateAsync();
|
|
856
625
|
await expect(
|
|
857
|
-
PostgresTriggerTestEntity.enforceDeleteAsync(
|
|
858
|
-
entityAfterDelete,
|
|
859
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
860
|
-
)
|
|
626
|
+
PostgresTriggerTestEntity.enforceDeleteAsync(entityAfterDelete),
|
|
861
627
|
).rejects.toThrowError('name cannot have value afterDelete');
|
|
862
628
|
await expect(
|
|
863
|
-
PostgresTriggerTestEntity.loader(
|
|
864
|
-
vc1,
|
|
865
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
866
|
-
)
|
|
629
|
+
PostgresTriggerTestEntity.loader(vc1)
|
|
867
630
|
.enforcing()
|
|
868
|
-
.loadByFieldEqualingAsync('name', 'afterDelete')
|
|
631
|
+
.loadByFieldEqualingAsync('name', 'afterDelete'),
|
|
869
632
|
).resolves.not.toBeNull();
|
|
870
633
|
});
|
|
871
634
|
});
|
|
@@ -873,81 +636,57 @@ describe('postgres entity integration', () => {
|
|
|
873
636
|
describe('create', () => {
|
|
874
637
|
it('rolls back transaction when trigger throws ', async () => {
|
|
875
638
|
const vc1 = new ViewerContext(
|
|
876
|
-
createKnexIntegrationTestEntityCompanionProvider(knexInstance)
|
|
639
|
+
createKnexIntegrationTestEntityCompanionProvider(knexInstance),
|
|
877
640
|
);
|
|
878
641
|
|
|
879
642
|
await expect(
|
|
880
|
-
PostgresValidatorTestEntity.creator(
|
|
881
|
-
vc1,
|
|
882
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
883
|
-
)
|
|
643
|
+
PostgresValidatorTestEntity.creator(vc1)
|
|
884
644
|
.setField('name', 'beforeCreateAndBeforeUpdate')
|
|
885
|
-
.enforceCreateAsync()
|
|
645
|
+
.enforceCreateAsync(),
|
|
886
646
|
).rejects.toThrowError('name cannot have value beforeCreateAndBeforeUpdate');
|
|
887
647
|
await expect(
|
|
888
|
-
PostgresValidatorTestEntity.loader(
|
|
889
|
-
vc1,
|
|
890
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
891
|
-
)
|
|
648
|
+
PostgresValidatorTestEntity.loader(vc1)
|
|
892
649
|
.enforcing()
|
|
893
|
-
.loadByFieldEqualingAsync('name', 'beforeCreateAndBeforeUpdate')
|
|
650
|
+
.loadByFieldEqualingAsync('name', 'beforeCreateAndBeforeUpdate'),
|
|
894
651
|
).resolves.toBeNull();
|
|
895
652
|
});
|
|
896
653
|
});
|
|
897
654
|
describe('update', () => {
|
|
898
655
|
it('rolls back transaction when trigger throws ', async () => {
|
|
899
656
|
const vc1 = new ViewerContext(
|
|
900
|
-
createKnexIntegrationTestEntityCompanionProvider(knexInstance)
|
|
657
|
+
createKnexIntegrationTestEntityCompanionProvider(knexInstance),
|
|
901
658
|
);
|
|
902
659
|
|
|
903
|
-
const entity = await PostgresValidatorTestEntity.creator(
|
|
904
|
-
vc1,
|
|
905
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
906
|
-
)
|
|
660
|
+
const entity = await PostgresValidatorTestEntity.creator(vc1)
|
|
907
661
|
.setField('name', 'blah')
|
|
908
662
|
.enforceCreateAsync();
|
|
909
663
|
|
|
910
664
|
await expect(
|
|
911
|
-
PostgresValidatorTestEntity.updater(
|
|
912
|
-
entity,
|
|
913
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
914
|
-
)
|
|
665
|
+
PostgresValidatorTestEntity.updater(entity)
|
|
915
666
|
.setField('name', 'beforeCreateAndBeforeUpdate')
|
|
916
|
-
.enforceUpdateAsync()
|
|
667
|
+
.enforceUpdateAsync(),
|
|
917
668
|
).rejects.toThrowError('name cannot have value beforeCreateAndBeforeUpdate');
|
|
918
669
|
await expect(
|
|
919
|
-
PostgresValidatorTestEntity.loader(
|
|
920
|
-
vc1,
|
|
921
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
922
|
-
)
|
|
670
|
+
PostgresValidatorTestEntity.loader(vc1)
|
|
923
671
|
.enforcing()
|
|
924
|
-
.loadByFieldEqualingAsync('name', 'beforeCreateAndBeforeUpdate')
|
|
672
|
+
.loadByFieldEqualingAsync('name', 'beforeCreateAndBeforeUpdate'),
|
|
925
673
|
).resolves.toBeNull();
|
|
926
674
|
});
|
|
927
675
|
});
|
|
928
676
|
describe('delete', () => {
|
|
929
677
|
it('validation should not run on a delete mutation', async () => {
|
|
930
678
|
const vc1 = new ViewerContext(
|
|
931
|
-
createKnexIntegrationTestEntityCompanionProvider(knexInstance)
|
|
679
|
+
createKnexIntegrationTestEntityCompanionProvider(knexInstance),
|
|
932
680
|
);
|
|
933
681
|
|
|
934
|
-
const entityToDelete = await PostgresValidatorTestEntity.creator(
|
|
935
|
-
vc1,
|
|
936
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
937
|
-
)
|
|
682
|
+
const entityToDelete = await PostgresValidatorTestEntity.creator(vc1)
|
|
938
683
|
.setField('name', 'shouldBeDeleted')
|
|
939
684
|
.enforceCreateAsync();
|
|
940
|
-
await PostgresValidatorTestEntity.enforceDeleteAsync(
|
|
941
|
-
entityToDelete,
|
|
942
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
943
|
-
);
|
|
685
|
+
await PostgresValidatorTestEntity.enforceDeleteAsync(entityToDelete);
|
|
944
686
|
await expect(
|
|
945
|
-
PostgresValidatorTestEntity.loader(
|
|
946
|
-
vc1,
|
|
947
|
-
vc1.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres')
|
|
948
|
-
)
|
|
687
|
+
PostgresValidatorTestEntity.loader(vc1)
|
|
949
688
|
.enforcing()
|
|
950
|
-
.loadByFieldEqualingAsync('name', 'shouldBeDeleted')
|
|
689
|
+
.loadByFieldEqualingAsync('name', 'shouldBeDeleted'),
|
|
951
690
|
).resolves.toBeNull();
|
|
952
691
|
});
|
|
953
692
|
});
|
|
@@ -1002,7 +741,7 @@ describe('postgres entity integration', () => {
|
|
|
1002
741
|
preCommitCallCount++;
|
|
1003
742
|
throw Error('wat');
|
|
1004
743
|
}, 0);
|
|
1005
|
-
})
|
|
744
|
+
}),
|
|
1006
745
|
).rejects.toThrowError('wat');
|
|
1007
746
|
|
|
1008
747
|
expect(preCommitCallCount).toBe(2);
|