@expo/entity 0.32.0 → 0.34.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/EnforcingEntityLoader.d.ts +5 -0
- package/build/EnforcingEntityLoader.js +8 -0
- package/build/EnforcingEntityLoader.js.map +1 -1
- package/build/Entity.d.ts +6 -6
- package/build/Entity.js +6 -29
- package/build/Entity.js.map +1 -1
- package/build/EntityAssociationLoader.d.ts +8 -8
- package/build/EntityAssociationLoader.js +4 -20
- package/build/EntityAssociationLoader.js.map +1 -1
- package/build/EntityFields.js +3 -2
- package/build/EntityFields.js.map +1 -1
- package/build/EntityLoader.d.ts +6 -0
- package/build/EntityLoader.js +11 -0
- package/build/EntityLoader.js.map +1 -1
- package/build/EntityMutationTriggerConfiguration.d.ts +5 -7
- package/build/EntityMutationTriggerConfiguration.js +3 -4
- package/build/EntityMutationTriggerConfiguration.js.map +1 -1
- package/build/EntityQueryContextProvider.d.ts +1 -1
- package/build/EntityQueryContextProvider.js +1 -1
- package/build/EntityQueryContextProvider.js.map +1 -1
- package/build/IEntityCacheAdapterProvider.d.ts +1 -1
- package/build/ReadonlyEntity.d.ts +1 -1
- package/build/ReadonlyEntity.js +1 -4
- package/build/ReadonlyEntity.js.map +1 -1
- package/build/ViewerContext.d.ts +2 -2
- package/build/ViewerContext.js +3 -3
- package/build/ViewerContext.js.map +1 -1
- package/build/__tests__/EnforcingEntityLoader-test.js +27 -0
- package/build/__tests__/EnforcingEntityLoader-test.js.map +1 -1
- package/build/__tests__/Entity-test.js +13 -13
- package/build/__tests__/Entity-test.js.map +1 -1
- package/build/__tests__/EntityAssociationLoader-test.js +69 -37
- package/build/__tests__/EntityAssociationLoader-test.js.map +1 -1
- package/build/__tests__/EntityCommonUseCases-test.js +19 -11
- package/build/__tests__/EntityCommonUseCases-test.js.map +1 -1
- package/build/__tests__/EntityEdges-test.js +72 -40
- package/build/__tests__/EntityEdges-test.js.map +1 -1
- package/build/__tests__/EntityFields-test.js +7 -1
- package/build/__tests__/EntityFields-test.js.map +1 -1
- package/build/__tests__/EntityLoader-constructor-test.js +1 -1
- package/build/__tests__/EntityLoader-constructor-test.js.map +1 -1
- package/build/__tests__/EntityLoader-test.js +22 -20
- package/build/__tests__/EntityLoader-test.js.map +1 -1
- package/build/__tests__/EntityMutator-MutationCacheConsistency-test.js +6 -6
- package/build/__tests__/EntityMutator-MutationCacheConsistency-test.js.map +1 -1
- package/build/__tests__/EntityMutator-test.js +20 -20
- package/build/__tests__/EntityMutator-test.js.map +1 -1
- package/build/__tests__/EntitySecondaryCacheLoader-test.js +10 -10
- package/build/__tests__/EntitySecondaryCacheLoader-test.js.map +1 -1
- package/build/__tests__/EntitySelfReferentialEdges-test.js +79 -47
- package/build/__tests__/EntitySelfReferentialEdges-test.js.map +1 -1
- package/build/__tests__/ReadonlyEntity-test.js +13 -13
- package/build/__tests__/ReadonlyEntity-test.js.map +1 -1
- package/build/__tests__/ViewerContext-test.js +2 -2
- package/build/__tests__/ViewerContext-test.js.map +1 -1
- package/build/__tests__/cases/TwoEntitySameTableDisjointRows-test.js +12 -8
- package/build/__tests__/cases/TwoEntitySameTableDisjointRows-test.js.map +1 -1
- package/build/__tests__/cases/TwoEntitySameTableOverlappingRows-test.js +15 -13
- package/build/__tests__/cases/TwoEntitySameTableOverlappingRows-test.js.map +1 -1
- package/build/internal/EntityDataManager.js +1 -1
- package/build/internal/EntityDataManager.js.map +1 -1
- package/build/internal/__tests__/EntityDataManager-test.js +11 -11
- package/build/internal/__tests__/EntityDataManager-test.js.map +1 -1
- package/build/testfixtures/SimpleTestEntity.d.ts +8 -8
- package/build/testfixtures/SimpleTestEntity.js.map +1 -1
- package/build/testfixtures/TestEntity.d.ts +12 -12
- package/build/testfixtures/TestEntity.js.map +1 -1
- package/build/testfixtures/TestEntity2.d.ts +8 -8
- package/build/testfixtures/TestEntity2.js.map +1 -1
- package/build/testfixtures/TestViewerContext.d.ts +3 -0
- package/build/testfixtures/TestViewerContext.js +6 -0
- package/build/testfixtures/TestViewerContext.js.map +1 -1
- package/package.json +2 -2
- package/src/EnforcingEntityLoader.ts +9 -0
- package/src/Entity.ts +6 -29
- package/src/EntityAssociationLoader.ts +9 -25
- package/src/EntityFields.ts +5 -3
- package/src/EntityLoader.ts +17 -0
- package/src/EntityMutationTriggerConfiguration.ts +5 -7
- package/src/EntityQueryContextProvider.ts +1 -1
- package/src/IEntityCacheAdapterProvider.ts +1 -1
- package/src/ReadonlyEntity.ts +1 -4
- package/src/ViewerContext.ts +5 -5
- package/src/__tests__/EnforcingEntityLoader-test.ts +43 -0
- package/src/__tests__/Entity-test.ts +43 -27
- package/src/__tests__/EntityAssociationLoader-test.ts +168 -86
- package/src/__tests__/EntityCommonUseCases-test.ts +36 -18
- package/src/__tests__/EntityEdges-test.ts +102 -40
- package/src/__tests__/EntityFields-test.ts +7 -1
- package/src/__tests__/EntityLoader-constructor-test.ts +1 -1
- package/src/__tests__/EntityLoader-test.ts +24 -20
- package/src/__tests__/EntityMutator-MutationCacheConsistency-test.ts +19 -16
- package/src/__tests__/EntityMutator-test.ts +67 -61
- package/src/__tests__/EntitySecondaryCacheLoader-test.ts +20 -11
- package/src/__tests__/EntitySelfReferentialEdges-test.ts +115 -47
- package/src/__tests__/ReadonlyEntity-test.ts +15 -13
- package/src/__tests__/ViewerContext-test.ts +3 -2
- package/src/__tests__/cases/TwoEntitySameTableDisjointRows-test.ts +33 -22
- package/src/__tests__/cases/TwoEntitySameTableOverlappingRows-test.ts +30 -22
- package/src/internal/EntityDataManager.ts +1 -1
- package/src/internal/__tests__/EntityDataManager-test.ts +11 -11
- package/src/testfixtures/SimpleTestEntity.ts +8 -8
- package/src/testfixtures/TestEntity.ts +15 -12
- package/src/testfixtures/TestEntity2.ts +8 -8
- package/src/testfixtures/TestViewerContext.ts +12 -1
|
@@ -87,34 +87,52 @@ describe('EntityEdgeDeletionBehavior.CASCADE_DELETE', () => {
|
|
|
87
87
|
const companionProvider = createUnitTestEntityCompanionProvider();
|
|
88
88
|
const viewerContext = new TestViewerContext(companionProvider);
|
|
89
89
|
|
|
90
|
-
const parentCategory = await CategoryEntity.creator(
|
|
91
|
-
|
|
90
|
+
const parentCategory = await CategoryEntity.creator(
|
|
91
|
+
viewerContext,
|
|
92
|
+
viewerContext.getQueryContext()
|
|
93
|
+
).enforceCreateAsync();
|
|
94
|
+
const subCategory = await CategoryEntity.creator(viewerContext, viewerContext.getQueryContext())
|
|
92
95
|
.setField('parent_category_id', parentCategory.getID())
|
|
93
96
|
.enforceCreateAsync();
|
|
94
|
-
const subSubCategory = await CategoryEntity.creator(
|
|
97
|
+
const subSubCategory = await CategoryEntity.creator(
|
|
98
|
+
viewerContext,
|
|
99
|
+
viewerContext.getQueryContext()
|
|
100
|
+
)
|
|
95
101
|
.setField('parent_category_id', subCategory.getID())
|
|
96
102
|
.enforceCreateAsync();
|
|
97
103
|
|
|
98
104
|
await expect(
|
|
99
|
-
CategoryEntity.loader(viewerContext
|
|
105
|
+
CategoryEntity.loader(viewerContext, viewerContext.getQueryContext())
|
|
106
|
+
.enforcing()
|
|
107
|
+
.loadByIDNullableAsync(parentCategory.getID())
|
|
100
108
|
).resolves.not.toBeNull();
|
|
101
109
|
await expect(
|
|
102
|
-
CategoryEntity.loader(viewerContext
|
|
110
|
+
CategoryEntity.loader(viewerContext, viewerContext.getQueryContext())
|
|
111
|
+
.enforcing()
|
|
112
|
+
.loadByIDNullableAsync(subCategory.getID())
|
|
103
113
|
).resolves.not.toBeNull();
|
|
104
114
|
await expect(
|
|
105
|
-
CategoryEntity.loader(viewerContext
|
|
115
|
+
CategoryEntity.loader(viewerContext, viewerContext.getQueryContext())
|
|
116
|
+
.enforcing()
|
|
117
|
+
.loadByIDNullableAsync(subSubCategory.getID())
|
|
106
118
|
).resolves.not.toBeNull();
|
|
107
119
|
|
|
108
|
-
await CategoryEntity.enforceDeleteAsync(parentCategory);
|
|
120
|
+
await CategoryEntity.enforceDeleteAsync(parentCategory, viewerContext.getQueryContext());
|
|
109
121
|
|
|
110
122
|
await expect(
|
|
111
|
-
CategoryEntity.loader(viewerContext
|
|
123
|
+
CategoryEntity.loader(viewerContext, viewerContext.getQueryContext())
|
|
124
|
+
.enforcing()
|
|
125
|
+
.loadByIDNullableAsync(parentCategory.getID())
|
|
112
126
|
).resolves.toBeNull();
|
|
113
127
|
await expect(
|
|
114
|
-
CategoryEntity.loader(viewerContext
|
|
128
|
+
CategoryEntity.loader(viewerContext, viewerContext.getQueryContext())
|
|
129
|
+
.enforcing()
|
|
130
|
+
.loadByIDNullableAsync(subCategory.getID())
|
|
115
131
|
).resolves.toBeNull();
|
|
116
132
|
await expect(
|
|
117
|
-
CategoryEntity.loader(viewerContext
|
|
133
|
+
CategoryEntity.loader(viewerContext, viewerContext.getQueryContext())
|
|
134
|
+
.enforcing()
|
|
135
|
+
.loadByIDNullableAsync(subSubCategory.getID())
|
|
118
136
|
).resolves.toBeNull();
|
|
119
137
|
});
|
|
120
138
|
|
|
@@ -124,21 +142,28 @@ describe('EntityEdgeDeletionBehavior.CASCADE_DELETE', () => {
|
|
|
124
142
|
const companionProvider = createUnitTestEntityCompanionProvider();
|
|
125
143
|
const viewerContext = new TestViewerContext(companionProvider);
|
|
126
144
|
|
|
127
|
-
const categoryA = await CategoryEntity.creator(
|
|
128
|
-
|
|
145
|
+
const categoryA = await CategoryEntity.creator(
|
|
146
|
+
viewerContext,
|
|
147
|
+
viewerContext.getQueryContext()
|
|
148
|
+
).enforceCreateAsync();
|
|
149
|
+
const categoryB = await CategoryEntity.creator(viewerContext, viewerContext.getQueryContext())
|
|
129
150
|
.setField('parent_category_id', categoryA.getID())
|
|
130
151
|
.enforceCreateAsync();
|
|
131
|
-
await CategoryEntity.updater(categoryA)
|
|
152
|
+
await CategoryEntity.updater(categoryA, viewerContext.getQueryContext())
|
|
132
153
|
.setField('parent_category_id', categoryB.getID())
|
|
133
154
|
.enforceUpdateAsync();
|
|
134
155
|
|
|
135
|
-
await CategoryEntity.enforceDeleteAsync(categoryA);
|
|
156
|
+
await CategoryEntity.enforceDeleteAsync(categoryA, viewerContext.getQueryContext());
|
|
136
157
|
|
|
137
158
|
await expect(
|
|
138
|
-
CategoryEntity.loader(viewerContext
|
|
159
|
+
CategoryEntity.loader(viewerContext, viewerContext.getQueryContext())
|
|
160
|
+
.enforcing()
|
|
161
|
+
.loadByIDNullableAsync(categoryA.getID())
|
|
139
162
|
).resolves.toBeNull();
|
|
140
163
|
await expect(
|
|
141
|
-
CategoryEntity.loader(viewerContext
|
|
164
|
+
CategoryEntity.loader(viewerContext, viewerContext.getQueryContext())
|
|
165
|
+
.enforcing()
|
|
166
|
+
.loadByIDNullableAsync(categoryB.getID())
|
|
142
167
|
).resolves.toBeNull();
|
|
143
168
|
});
|
|
144
169
|
});
|
|
@@ -150,36 +175,56 @@ describe('EntityEdgeDeletionBehavior.SET_NULL', () => {
|
|
|
150
175
|
const companionProvider = createUnitTestEntityCompanionProvider();
|
|
151
176
|
const viewerContext = new TestViewerContext(companionProvider);
|
|
152
177
|
|
|
153
|
-
const parentCategory = await CategoryEntity.creator(
|
|
154
|
-
|
|
178
|
+
const parentCategory = await CategoryEntity.creator(
|
|
179
|
+
viewerContext,
|
|
180
|
+
viewerContext.getQueryContext()
|
|
181
|
+
).enforceCreateAsync();
|
|
182
|
+
const subCategory = await CategoryEntity.creator(viewerContext, viewerContext.getQueryContext())
|
|
155
183
|
.setField('parent_category_id', parentCategory.getID())
|
|
156
184
|
.enforceCreateAsync();
|
|
157
|
-
const subSubCategory = await CategoryEntity.creator(
|
|
185
|
+
const subSubCategory = await CategoryEntity.creator(
|
|
186
|
+
viewerContext,
|
|
187
|
+
viewerContext.getQueryContext()
|
|
188
|
+
)
|
|
158
189
|
.setField('parent_category_id', subCategory.getID())
|
|
159
190
|
.enforceCreateAsync();
|
|
160
191
|
|
|
161
192
|
await expect(
|
|
162
|
-
CategoryEntity.loader(viewerContext
|
|
193
|
+
CategoryEntity.loader(viewerContext, viewerContext.getQueryContext())
|
|
194
|
+
.enforcing()
|
|
195
|
+
.loadByIDNullableAsync(parentCategory.getID())
|
|
163
196
|
).resolves.not.toBeNull();
|
|
164
197
|
await expect(
|
|
165
|
-
CategoryEntity.loader(viewerContext
|
|
198
|
+
CategoryEntity.loader(viewerContext, viewerContext.getQueryContext())
|
|
199
|
+
.enforcing()
|
|
200
|
+
.loadByIDNullableAsync(subCategory.getID())
|
|
166
201
|
).resolves.not.toBeNull();
|
|
167
202
|
await expect(
|
|
168
|
-
CategoryEntity.loader(viewerContext
|
|
203
|
+
CategoryEntity.loader(viewerContext, viewerContext.getQueryContext())
|
|
204
|
+
.enforcing()
|
|
205
|
+
.loadByIDNullableAsync(subSubCategory.getID())
|
|
169
206
|
).resolves.not.toBeNull();
|
|
170
207
|
|
|
171
|
-
await CategoryEntity.enforceDeleteAsync(parentCategory);
|
|
208
|
+
await CategoryEntity.enforceDeleteAsync(parentCategory, viewerContext.getQueryContext());
|
|
172
209
|
|
|
173
210
|
await expect(
|
|
174
|
-
CategoryEntity.loader(viewerContext
|
|
211
|
+
CategoryEntity.loader(viewerContext, viewerContext.getQueryContext())
|
|
212
|
+
.enforcing()
|
|
213
|
+
.loadByIDNullableAsync(parentCategory.getID())
|
|
175
214
|
).resolves.toBeNull();
|
|
176
215
|
|
|
177
|
-
const loadedSubCategory = await CategoryEntity.loader(
|
|
216
|
+
const loadedSubCategory = await CategoryEntity.loader(
|
|
217
|
+
viewerContext,
|
|
218
|
+
viewerContext.getQueryContext()
|
|
219
|
+
)
|
|
178
220
|
.enforcing()
|
|
179
221
|
.loadByIDAsync(subCategory.getID());
|
|
180
222
|
expect(loadedSubCategory.getField('parent_category_id')).toBeNull();
|
|
181
223
|
|
|
182
|
-
const loadedSubSubCategory = await CategoryEntity.loader(
|
|
224
|
+
const loadedSubSubCategory = await CategoryEntity.loader(
|
|
225
|
+
viewerContext,
|
|
226
|
+
viewerContext.getQueryContext()
|
|
227
|
+
)
|
|
183
228
|
.enforcing()
|
|
184
229
|
.loadByIDAsync(subSubCategory.getID());
|
|
185
230
|
expect(loadedSubSubCategory.getField('parent_category_id')).not.toBeNull();
|
|
@@ -191,17 +236,23 @@ describe('EntityEdgeDeletionBehavior.SET_NULL', () => {
|
|
|
191
236
|
const companionProvider = createUnitTestEntityCompanionProvider();
|
|
192
237
|
const viewerContext = new TestViewerContext(companionProvider);
|
|
193
238
|
|
|
194
|
-
const categoryA = await CategoryEntity.creator(
|
|
195
|
-
|
|
239
|
+
const categoryA = await CategoryEntity.creator(
|
|
240
|
+
viewerContext,
|
|
241
|
+
viewerContext.getQueryContext()
|
|
242
|
+
).enforceCreateAsync();
|
|
243
|
+
const categoryB = await CategoryEntity.creator(viewerContext, viewerContext.getQueryContext())
|
|
196
244
|
.setField('parent_category_id', categoryA.getID())
|
|
197
245
|
.enforceCreateAsync();
|
|
198
|
-
await CategoryEntity.updater(categoryA)
|
|
246
|
+
await CategoryEntity.updater(categoryA, viewerContext.getQueryContext())
|
|
199
247
|
.setField('parent_category_id', categoryB.getID())
|
|
200
248
|
.enforceUpdateAsync();
|
|
201
249
|
|
|
202
|
-
await CategoryEntity.enforceDeleteAsync(categoryA);
|
|
250
|
+
await CategoryEntity.enforceDeleteAsync(categoryA, viewerContext.getQueryContext());
|
|
203
251
|
|
|
204
|
-
const loadedCategoryB = await CategoryEntity.loader(
|
|
252
|
+
const loadedCategoryB = await CategoryEntity.loader(
|
|
253
|
+
viewerContext,
|
|
254
|
+
viewerContext.getQueryContext()
|
|
255
|
+
)
|
|
205
256
|
.enforcing()
|
|
206
257
|
.loadByIDAsync(categoryB.getID());
|
|
207
258
|
expect(loadedCategoryB.getField('parent_category_id')).toBeNull();
|
|
@@ -217,24 +268,32 @@ describe('EntityEdgeDeletionBehavior.CASCADE_DELETE_INVALIDATE_CACHE', () => {
|
|
|
217
268
|
const companionProvider = createUnitTestEntityCompanionProvider();
|
|
218
269
|
const viewerContext = new TestViewerContext(companionProvider);
|
|
219
270
|
|
|
220
|
-
const parentCategory = await CategoryEntity.creator(
|
|
221
|
-
|
|
271
|
+
const parentCategory = await CategoryEntity.creator(
|
|
272
|
+
viewerContext,
|
|
273
|
+
viewerContext.getQueryContext()
|
|
274
|
+
).enforceCreateAsync();
|
|
275
|
+
const subCategory = await CategoryEntity.creator(viewerContext, viewerContext.getQueryContext())
|
|
222
276
|
.setField('parent_category_id', parentCategory.getID())
|
|
223
277
|
.enforceCreateAsync();
|
|
224
|
-
const subSubCategory = await CategoryEntity.creator(
|
|
278
|
+
const subSubCategory = await CategoryEntity.creator(
|
|
279
|
+
viewerContext,
|
|
280
|
+
viewerContext.getQueryContext()
|
|
281
|
+
)
|
|
225
282
|
.setField('parent_category_id', subCategory.getID())
|
|
226
283
|
.enforceCreateAsync();
|
|
227
284
|
|
|
228
285
|
await expect(
|
|
229
|
-
CategoryEntity.loader(viewerContext
|
|
286
|
+
CategoryEntity.loader(viewerContext, viewerContext.getQueryContext())
|
|
287
|
+
.enforcing()
|
|
288
|
+
.loadByIDNullableAsync(parentCategory.getID())
|
|
230
289
|
).resolves.not.toBeNull();
|
|
231
290
|
await expect(
|
|
232
|
-
CategoryEntity.loader(viewerContext)
|
|
291
|
+
CategoryEntity.loader(viewerContext, viewerContext.getQueryContext())
|
|
233
292
|
.enforcing()
|
|
234
293
|
.loadByFieldEqualingAsync('parent_category_id', parentCategory.getID())
|
|
235
294
|
).resolves.not.toBeNull();
|
|
236
295
|
await expect(
|
|
237
|
-
CategoryEntity.loader(viewerContext)
|
|
296
|
+
CategoryEntity.loader(viewerContext, viewerContext.getQueryContext())
|
|
238
297
|
.enforcing()
|
|
239
298
|
.loadByFieldEqualingAsync('parent_category_id', subCategory.getID())
|
|
240
299
|
).resolves.not.toBeNull();
|
|
@@ -255,7 +314,7 @@ describe('EntityEdgeDeletionBehavior.CASCADE_DELETE_INVALIDATE_CACHE', () => {
|
|
|
255
314
|
);
|
|
256
315
|
expect(subSubCategoryCachedBefore.get(subCategory.getID())?.status).toEqual(CacheStatus.HIT);
|
|
257
316
|
|
|
258
|
-
await CategoryEntity.enforceDeleteAsync(parentCategory);
|
|
317
|
+
await CategoryEntity.enforceDeleteAsync(parentCategory, viewerContext.getQueryContext());
|
|
259
318
|
|
|
260
319
|
const subCategoryCachedAfter = await categoryCacheAdapter.loadManyAsync('parent_category_id', [
|
|
261
320
|
parentCategory.getID(),
|
|
@@ -269,13 +328,19 @@ describe('EntityEdgeDeletionBehavior.CASCADE_DELETE_INVALIDATE_CACHE', () => {
|
|
|
269
328
|
expect(subSubCategoryCachedAfter.get(subCategory.getID())?.status).toEqual(CacheStatus.MISS);
|
|
270
329
|
|
|
271
330
|
await expect(
|
|
272
|
-
CategoryEntity.loader(viewerContext
|
|
331
|
+
CategoryEntity.loader(viewerContext, viewerContext.getQueryContext())
|
|
332
|
+
.enforcing()
|
|
333
|
+
.loadByIDNullableAsync(parentCategory.getID())
|
|
273
334
|
).resolves.toBeNull();
|
|
274
335
|
await expect(
|
|
275
|
-
CategoryEntity.loader(viewerContext
|
|
336
|
+
CategoryEntity.loader(viewerContext, viewerContext.getQueryContext())
|
|
337
|
+
.enforcing()
|
|
338
|
+
.loadByIDNullableAsync(subCategory.getID())
|
|
276
339
|
).resolves.not.toBeNull();
|
|
277
340
|
await expect(
|
|
278
|
-
CategoryEntity.loader(viewerContext
|
|
341
|
+
CategoryEntity.loader(viewerContext, viewerContext.getQueryContext())
|
|
342
|
+
.enforcing()
|
|
343
|
+
.loadByIDNullableAsync(subSubCategory.getID())
|
|
279
344
|
).resolves.not.toBeNull();
|
|
280
345
|
});
|
|
281
346
|
|
|
@@ -287,21 +352,24 @@ describe('EntityEdgeDeletionBehavior.CASCADE_DELETE_INVALIDATE_CACHE', () => {
|
|
|
287
352
|
const companionProvider = createUnitTestEntityCompanionProvider();
|
|
288
353
|
const viewerContext = new TestViewerContext(companionProvider);
|
|
289
354
|
|
|
290
|
-
const categoryA = await CategoryEntity.creator(
|
|
291
|
-
|
|
355
|
+
const categoryA = await CategoryEntity.creator(
|
|
356
|
+
viewerContext,
|
|
357
|
+
viewerContext.getQueryContext()
|
|
358
|
+
).enforceCreateAsync();
|
|
359
|
+
const categoryB = await CategoryEntity.creator(viewerContext, viewerContext.getQueryContext())
|
|
292
360
|
.setField('parent_category_id', categoryA.getID())
|
|
293
361
|
.enforceCreateAsync();
|
|
294
|
-
await CategoryEntity.updater(categoryA)
|
|
362
|
+
await CategoryEntity.updater(categoryA, viewerContext.getQueryContext())
|
|
295
363
|
.setField('parent_category_id', categoryB.getID())
|
|
296
364
|
.enforceUpdateAsync();
|
|
297
365
|
|
|
298
366
|
await expect(
|
|
299
|
-
CategoryEntity.loader(viewerContext)
|
|
367
|
+
CategoryEntity.loader(viewerContext, viewerContext.getQueryContext())
|
|
300
368
|
.enforcing()
|
|
301
369
|
.loadByFieldEqualingAsync('parent_category_id', categoryA.getID())
|
|
302
370
|
).resolves.not.toBeNull();
|
|
303
371
|
await expect(
|
|
304
|
-
CategoryEntity.loader(viewerContext)
|
|
372
|
+
CategoryEntity.loader(viewerContext, viewerContext.getQueryContext())
|
|
305
373
|
.enforcing()
|
|
306
374
|
.loadByFieldEqualingAsync('parent_category_id', categoryB.getID())
|
|
307
375
|
).resolves.not.toBeNull();
|
|
@@ -318,7 +386,7 @@ describe('EntityEdgeDeletionBehavior.CASCADE_DELETE_INVALIDATE_CACHE', () => {
|
|
|
318
386
|
expect(categoriesCachedBefore.get(categoryA.getID())?.status).toEqual(CacheStatus.HIT);
|
|
319
387
|
expect(categoriesCachedBefore.get(categoryB.getID())?.status).toEqual(CacheStatus.HIT);
|
|
320
388
|
|
|
321
|
-
await CategoryEntity.enforceDeleteAsync(categoryA);
|
|
389
|
+
await CategoryEntity.enforceDeleteAsync(categoryA, viewerContext.getQueryContext());
|
|
322
390
|
|
|
323
391
|
const categoriesCachedAfter = await categoryCacheAdapter.loadManyAsync('parent_category_id', [
|
|
324
392
|
categoryA.getID(),
|
|
@@ -3,15 +3,15 @@ import { instance, mock } from 'ts-mockito';
|
|
|
3
3
|
import EntityAssociationLoader from '../EntityAssociationLoader';
|
|
4
4
|
import EntityLoader from '../EntityLoader';
|
|
5
5
|
import ReadonlyEntity from '../ReadonlyEntity';
|
|
6
|
-
import ViewerContext from '../ViewerContext';
|
|
7
6
|
import SimpleTestEntity from '../testfixtures/SimpleTestEntity';
|
|
8
7
|
import TestEntity from '../testfixtures/TestEntity';
|
|
8
|
+
import TestViewerContext from '../testfixtures/TestViewerContext';
|
|
9
9
|
import { createUnitTestEntityCompanionProvider } from '../utils/testing/createUnitTestEntityCompanionProvider';
|
|
10
10
|
|
|
11
11
|
describe(ReadonlyEntity, () => {
|
|
12
12
|
describe('getID', () => {
|
|
13
13
|
it('returns correct value', () => {
|
|
14
|
-
const viewerContext = instance(mock(
|
|
14
|
+
const viewerContext = instance(mock(TestViewerContext));
|
|
15
15
|
const data = {
|
|
16
16
|
id: 'what',
|
|
17
17
|
};
|
|
@@ -27,7 +27,7 @@ describe(ReadonlyEntity, () => {
|
|
|
27
27
|
|
|
28
28
|
describe('toString', () => {
|
|
29
29
|
it('returns correct value', () => {
|
|
30
|
-
const viewerContext = instance(mock(
|
|
30
|
+
const viewerContext = instance(mock(TestViewerContext));
|
|
31
31
|
const data = {
|
|
32
32
|
id: 'what',
|
|
33
33
|
};
|
|
@@ -43,7 +43,7 @@ describe(ReadonlyEntity, () => {
|
|
|
43
43
|
|
|
44
44
|
describe('getUniqueIdentifier', () => {
|
|
45
45
|
it('returns a different value for two different entities of the same type', () => {
|
|
46
|
-
const viewerContext = instance(mock(
|
|
46
|
+
const viewerContext = instance(mock(TestViewerContext));
|
|
47
47
|
const testEntity = new SimpleTestEntity({
|
|
48
48
|
viewerContext,
|
|
49
49
|
id: '1',
|
|
@@ -68,8 +68,8 @@ describe(ReadonlyEntity, () => {
|
|
|
68
68
|
});
|
|
69
69
|
|
|
70
70
|
it('returns the same value even if different viewer context', () => {
|
|
71
|
-
const viewerContext = instance(mock(
|
|
72
|
-
const viewerContext2 = instance(mock(
|
|
71
|
+
const viewerContext = instance(mock(TestViewerContext));
|
|
72
|
+
const viewerContext2 = instance(mock(TestViewerContext));
|
|
73
73
|
const data = { id: '1' };
|
|
74
74
|
const testEntity = new SimpleTestEntity({
|
|
75
75
|
viewerContext,
|
|
@@ -87,7 +87,7 @@ describe(ReadonlyEntity, () => {
|
|
|
87
87
|
});
|
|
88
88
|
|
|
89
89
|
it('returns a different value for different entities even if same ID', () => {
|
|
90
|
-
const viewerContext = instance(mock(
|
|
90
|
+
const viewerContext = instance(mock(TestViewerContext));
|
|
91
91
|
const data = { id: '1' };
|
|
92
92
|
const testEntity = new SimpleTestEntity({
|
|
93
93
|
viewerContext,
|
|
@@ -114,7 +114,7 @@ describe(ReadonlyEntity, () => {
|
|
|
114
114
|
});
|
|
115
115
|
|
|
116
116
|
it('cannot be created without an ID', () => {
|
|
117
|
-
const viewerContext = instance(mock(
|
|
117
|
+
const viewerContext = instance(mock(TestViewerContext));
|
|
118
118
|
const dataWithoutID = {};
|
|
119
119
|
expect(() => {
|
|
120
120
|
// eslint-disable-next-line no-new
|
|
@@ -128,7 +128,7 @@ describe(ReadonlyEntity, () => {
|
|
|
128
128
|
});
|
|
129
129
|
|
|
130
130
|
it('returns correct viewerCo}ntext from instantiation', () => {
|
|
131
|
-
const viewerContext = instance(mock(
|
|
131
|
+
const viewerContext = instance(mock(TestViewerContext));
|
|
132
132
|
const data = {
|
|
133
133
|
id: 'what',
|
|
134
134
|
};
|
|
@@ -142,7 +142,7 @@ describe(ReadonlyEntity, () => {
|
|
|
142
142
|
});
|
|
143
143
|
|
|
144
144
|
it('returns correct data for field getters', () => {
|
|
145
|
-
const viewerContext = instance(mock(
|
|
145
|
+
const viewerContext = instance(mock(TestViewerContext));
|
|
146
146
|
const data = {
|
|
147
147
|
id: 'what',
|
|
148
148
|
};
|
|
@@ -159,7 +159,7 @@ describe(ReadonlyEntity, () => {
|
|
|
159
159
|
describe('associationLoader', () => {
|
|
160
160
|
it('returns a new association loader', () => {
|
|
161
161
|
const companionProvider = createUnitTestEntityCompanionProvider();
|
|
162
|
-
const viewerContext = new
|
|
162
|
+
const viewerContext = new TestViewerContext(companionProvider);
|
|
163
163
|
const data = {
|
|
164
164
|
id: 'what',
|
|
165
165
|
};
|
|
@@ -176,8 +176,10 @@ describe(ReadonlyEntity, () => {
|
|
|
176
176
|
describe('loader', () => {
|
|
177
177
|
it('creates a new EntityLoader', async () => {
|
|
178
178
|
const companionProvider = createUnitTestEntityCompanionProvider();
|
|
179
|
-
const viewerContext = new
|
|
180
|
-
expect(
|
|
179
|
+
const viewerContext = new TestViewerContext(companionProvider);
|
|
180
|
+
expect(
|
|
181
|
+
SimpleTestEntity.loader(viewerContext, viewerContext.getQueryContext())
|
|
182
|
+
).toBeInstanceOf(EntityLoader);
|
|
181
183
|
});
|
|
182
184
|
});
|
|
183
185
|
});
|
|
@@ -3,11 +3,12 @@ import ViewerContext from '../ViewerContext';
|
|
|
3
3
|
import { createUnitTestEntityCompanionProvider } from '../utils/testing/createUnitTestEntityCompanionProvider';
|
|
4
4
|
|
|
5
5
|
describe(ViewerContext, () => {
|
|
6
|
-
describe('
|
|
6
|
+
describe('getNonTransactionalQueryContextForDatabaseAdaptorFlavor', () => {
|
|
7
7
|
it('creates a new regular query context', () => {
|
|
8
8
|
const companionProvider = createUnitTestEntityCompanionProvider();
|
|
9
9
|
const viewerContext = new ViewerContext(companionProvider);
|
|
10
|
-
const queryContext =
|
|
10
|
+
const queryContext =
|
|
11
|
+
viewerContext.getNonTransactionalQueryContextForDatabaseAdaptorFlavor('postgres');
|
|
11
12
|
expect(queryContext).toBeInstanceOf(EntityQueryContext);
|
|
12
13
|
expect(queryContext.isInTransaction()).toBe(false);
|
|
13
14
|
});
|
|
@@ -3,22 +3,22 @@ import { EntityCompanionDefinition } from '../../EntityCompanionProvider';
|
|
|
3
3
|
import EntityConfiguration from '../../EntityConfiguration';
|
|
4
4
|
import { UUIDField, EnumField, StringField } from '../../EntityFields';
|
|
5
5
|
import EntityPrivacyPolicy from '../../EntityPrivacyPolicy';
|
|
6
|
-
import ViewerContext from '../../ViewerContext';
|
|
7
6
|
import { successfulResults, failedResults } from '../../entityUtils';
|
|
8
7
|
import AlwaysAllowPrivacyPolicyRule from '../../rules/AlwaysAllowPrivacyPolicyRule';
|
|
8
|
+
import TestViewerContext from '../../testfixtures/TestViewerContext';
|
|
9
9
|
import { createUnitTestEntityCompanionProvider } from '../../utils/testing/createUnitTestEntityCompanionProvider';
|
|
10
10
|
|
|
11
11
|
describe('Two entities backed by the same table', () => {
|
|
12
12
|
test('load by different types', async () => {
|
|
13
13
|
const companionProvider = createUnitTestEntityCompanionProvider();
|
|
14
|
-
const viewerContext = new
|
|
14
|
+
const viewerContext = new TestViewerContext(companionProvider);
|
|
15
15
|
|
|
16
|
-
const one = await OneTestEntity.creator(viewerContext)
|
|
16
|
+
const one = await OneTestEntity.creator(viewerContext, viewerContext.getQueryContext())
|
|
17
17
|
.setField('entity_type', EntityType.ONE)
|
|
18
18
|
.setField('common_other_field', 'wat')
|
|
19
19
|
.enforceCreateAsync();
|
|
20
20
|
|
|
21
|
-
const two = await TwoTestEntity.creator(viewerContext)
|
|
21
|
+
const two = await TwoTestEntity.creator(viewerContext, viewerContext.getQueryContext())
|
|
22
22
|
.setField('entity_type', EntityType.TWO)
|
|
23
23
|
.setField('other_field', 'blah')
|
|
24
24
|
.setField('common_other_field', 'wat')
|
|
@@ -28,17 +28,21 @@ describe('Two entities backed by the same table', () => {
|
|
|
28
28
|
expect(two).toBeInstanceOf(TwoTestEntity);
|
|
29
29
|
|
|
30
30
|
await expect(
|
|
31
|
-
TwoTestEntity.loader(viewerContext
|
|
31
|
+
TwoTestEntity.loader(viewerContext, viewerContext.getQueryContext())
|
|
32
|
+
.enforcing()
|
|
33
|
+
.loadByIDAsync(one.getID())
|
|
32
34
|
).rejects.toThrowError('TwoTestEntity must be instantiated with two data');
|
|
33
35
|
|
|
34
36
|
await expect(
|
|
35
|
-
OneTestEntity.loader(viewerContext
|
|
37
|
+
OneTestEntity.loader(viewerContext, viewerContext.getQueryContext())
|
|
38
|
+
.enforcing()
|
|
39
|
+
.loadByIDAsync(two.getID())
|
|
36
40
|
).rejects.toThrowError('OneTestEntity must be instantiated with one data');
|
|
37
41
|
|
|
38
|
-
const manyResults = await OneTestEntity.loader(
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
);
|
|
42
|
+
const manyResults = await OneTestEntity.loader(
|
|
43
|
+
viewerContext,
|
|
44
|
+
viewerContext.getQueryContext()
|
|
45
|
+
).loadManyByFieldEqualingAsync('common_other_field', 'wat');
|
|
42
46
|
const successfulManyResults = successfulResults(manyResults);
|
|
43
47
|
const failedManyResults = failedResults(manyResults);
|
|
44
48
|
|
|
@@ -51,7 +55,8 @@ describe('Two entities backed by the same table', () => {
|
|
|
51
55
|
);
|
|
52
56
|
|
|
53
57
|
const fieldEqualityConjunctionResults = await OneTestEntity.loader(
|
|
54
|
-
viewerContext
|
|
58
|
+
viewerContext,
|
|
59
|
+
viewerContext.getQueryContext()
|
|
55
60
|
).loadManyByFieldEqualityConjunctionAsync([
|
|
56
61
|
{
|
|
57
62
|
fieldName: 'common_other_field',
|
|
@@ -106,24 +111,30 @@ const testEntityConfiguration = new EntityConfiguration<TestFields>({
|
|
|
106
111
|
cacheAdapterFlavor: 'redis',
|
|
107
112
|
});
|
|
108
113
|
|
|
109
|
-
class TestEntityPrivacyPolicy extends EntityPrivacyPolicy<
|
|
114
|
+
class TestEntityPrivacyPolicy extends EntityPrivacyPolicy<
|
|
115
|
+
any,
|
|
116
|
+
string,
|
|
117
|
+
TestViewerContext,
|
|
118
|
+
any,
|
|
119
|
+
any
|
|
120
|
+
> {
|
|
110
121
|
protected override readonly readRules = [
|
|
111
|
-
new AlwaysAllowPrivacyPolicyRule<any, string,
|
|
122
|
+
new AlwaysAllowPrivacyPolicyRule<any, string, TestViewerContext, any, any>(),
|
|
112
123
|
];
|
|
113
124
|
protected override readonly createRules = [
|
|
114
|
-
new AlwaysAllowPrivacyPolicyRule<any, string,
|
|
125
|
+
new AlwaysAllowPrivacyPolicyRule<any, string, TestViewerContext, any, any>(),
|
|
115
126
|
];
|
|
116
127
|
protected override readonly updateRules = [
|
|
117
|
-
new AlwaysAllowPrivacyPolicyRule<any, string,
|
|
128
|
+
new AlwaysAllowPrivacyPolicyRule<any, string, TestViewerContext, any, any>(),
|
|
118
129
|
];
|
|
119
130
|
protected override readonly deleteRules = [
|
|
120
|
-
new AlwaysAllowPrivacyPolicyRule<any, string,
|
|
131
|
+
new AlwaysAllowPrivacyPolicyRule<any, string, TestViewerContext, any, any>(),
|
|
121
132
|
];
|
|
122
133
|
}
|
|
123
134
|
|
|
124
|
-
class OneTestEntity extends Entity<TestFields, string,
|
|
135
|
+
class OneTestEntity extends Entity<TestFields, string, TestViewerContext, OneTestFields> {
|
|
125
136
|
constructor(constructorParams: {
|
|
126
|
-
viewerContext:
|
|
137
|
+
viewerContext: TestViewerContext;
|
|
127
138
|
id: string;
|
|
128
139
|
databaseFields: Readonly<TestFields>;
|
|
129
140
|
selectedFields: Readonly<Pick<TestFields, OneTestFields>>;
|
|
@@ -137,7 +148,7 @@ class OneTestEntity extends Entity<TestFields, string, ViewerContext, OneTestFie
|
|
|
137
148
|
static defineCompanionDefinition(): EntityCompanionDefinition<
|
|
138
149
|
TestFields,
|
|
139
150
|
string,
|
|
140
|
-
|
|
151
|
+
TestViewerContext,
|
|
141
152
|
OneTestEntity,
|
|
142
153
|
TestEntityPrivacyPolicy,
|
|
143
154
|
OneTestFields
|
|
@@ -151,9 +162,9 @@ class OneTestEntity extends Entity<TestFields, string, ViewerContext, OneTestFie
|
|
|
151
162
|
}
|
|
152
163
|
}
|
|
153
164
|
|
|
154
|
-
class TwoTestEntity extends Entity<TestFields, string,
|
|
165
|
+
class TwoTestEntity extends Entity<TestFields, string, TestViewerContext, TwoTestFields> {
|
|
155
166
|
constructor(constructorParams: {
|
|
156
|
-
viewerContext:
|
|
167
|
+
viewerContext: TestViewerContext;
|
|
157
168
|
id: string;
|
|
158
169
|
databaseFields: Readonly<TestFields>;
|
|
159
170
|
selectedFields: Readonly<Pick<TestFields, TwoTestFields>>;
|
|
@@ -167,7 +178,7 @@ class TwoTestEntity extends Entity<TestFields, string, ViewerContext, TwoTestFie
|
|
|
167
178
|
static defineCompanionDefinition(): EntityCompanionDefinition<
|
|
168
179
|
TestFields,
|
|
169
180
|
string,
|
|
170
|
-
|
|
181
|
+
TestViewerContext,
|
|
171
182
|
TwoTestEntity,
|
|
172
183
|
TestEntityPrivacyPolicy,
|
|
173
184
|
TwoTestFields
|