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