@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.
Files changed (105) hide show
  1. package/build/EnforcingEntityLoader.d.ts +5 -0
  2. package/build/EnforcingEntityLoader.js +8 -0
  3. package/build/EnforcingEntityLoader.js.map +1 -1
  4. package/build/Entity.d.ts +6 -6
  5. package/build/Entity.js +6 -29
  6. package/build/Entity.js.map +1 -1
  7. package/build/EntityAssociationLoader.d.ts +8 -8
  8. package/build/EntityAssociationLoader.js +4 -20
  9. package/build/EntityAssociationLoader.js.map +1 -1
  10. package/build/EntityFields.js +3 -2
  11. package/build/EntityFields.js.map +1 -1
  12. package/build/EntityLoader.d.ts +6 -0
  13. package/build/EntityLoader.js +11 -0
  14. package/build/EntityLoader.js.map +1 -1
  15. package/build/EntityMutationTriggerConfiguration.d.ts +5 -7
  16. package/build/EntityMutationTriggerConfiguration.js +3 -4
  17. package/build/EntityMutationTriggerConfiguration.js.map +1 -1
  18. package/build/EntityQueryContextProvider.d.ts +1 -1
  19. package/build/EntityQueryContextProvider.js +1 -1
  20. package/build/EntityQueryContextProvider.js.map +1 -1
  21. package/build/IEntityCacheAdapterProvider.d.ts +1 -1
  22. package/build/ReadonlyEntity.d.ts +1 -1
  23. package/build/ReadonlyEntity.js +1 -4
  24. package/build/ReadonlyEntity.js.map +1 -1
  25. package/build/ViewerContext.d.ts +2 -2
  26. package/build/ViewerContext.js +3 -3
  27. package/build/ViewerContext.js.map +1 -1
  28. package/build/__tests__/EnforcingEntityLoader-test.js +27 -0
  29. package/build/__tests__/EnforcingEntityLoader-test.js.map +1 -1
  30. package/build/__tests__/Entity-test.js +13 -13
  31. package/build/__tests__/Entity-test.js.map +1 -1
  32. package/build/__tests__/EntityAssociationLoader-test.js +69 -37
  33. package/build/__tests__/EntityAssociationLoader-test.js.map +1 -1
  34. package/build/__tests__/EntityCommonUseCases-test.js +19 -11
  35. package/build/__tests__/EntityCommonUseCases-test.js.map +1 -1
  36. package/build/__tests__/EntityEdges-test.js +72 -40
  37. package/build/__tests__/EntityEdges-test.js.map +1 -1
  38. package/build/__tests__/EntityFields-test.js +7 -1
  39. package/build/__tests__/EntityFields-test.js.map +1 -1
  40. package/build/__tests__/EntityLoader-constructor-test.js +1 -1
  41. package/build/__tests__/EntityLoader-constructor-test.js.map +1 -1
  42. package/build/__tests__/EntityLoader-test.js +22 -20
  43. package/build/__tests__/EntityLoader-test.js.map +1 -1
  44. package/build/__tests__/EntityMutator-MutationCacheConsistency-test.js +6 -6
  45. package/build/__tests__/EntityMutator-MutationCacheConsistency-test.js.map +1 -1
  46. package/build/__tests__/EntityMutator-test.js +20 -20
  47. package/build/__tests__/EntityMutator-test.js.map +1 -1
  48. package/build/__tests__/EntitySecondaryCacheLoader-test.js +10 -10
  49. package/build/__tests__/EntitySecondaryCacheLoader-test.js.map +1 -1
  50. package/build/__tests__/EntitySelfReferentialEdges-test.js +79 -47
  51. package/build/__tests__/EntitySelfReferentialEdges-test.js.map +1 -1
  52. package/build/__tests__/ReadonlyEntity-test.js +13 -13
  53. package/build/__tests__/ReadonlyEntity-test.js.map +1 -1
  54. package/build/__tests__/ViewerContext-test.js +2 -2
  55. package/build/__tests__/ViewerContext-test.js.map +1 -1
  56. package/build/__tests__/cases/TwoEntitySameTableDisjointRows-test.js +12 -8
  57. package/build/__tests__/cases/TwoEntitySameTableDisjointRows-test.js.map +1 -1
  58. package/build/__tests__/cases/TwoEntitySameTableOverlappingRows-test.js +15 -13
  59. package/build/__tests__/cases/TwoEntitySameTableOverlappingRows-test.js.map +1 -1
  60. package/build/internal/EntityDataManager.js +1 -1
  61. package/build/internal/EntityDataManager.js.map +1 -1
  62. package/build/internal/__tests__/EntityDataManager-test.js +11 -11
  63. package/build/internal/__tests__/EntityDataManager-test.js.map +1 -1
  64. package/build/testfixtures/SimpleTestEntity.d.ts +8 -8
  65. package/build/testfixtures/SimpleTestEntity.js.map +1 -1
  66. package/build/testfixtures/TestEntity.d.ts +12 -12
  67. package/build/testfixtures/TestEntity.js.map +1 -1
  68. package/build/testfixtures/TestEntity2.d.ts +8 -8
  69. package/build/testfixtures/TestEntity2.js.map +1 -1
  70. package/build/testfixtures/TestViewerContext.d.ts +3 -0
  71. package/build/testfixtures/TestViewerContext.js +6 -0
  72. package/build/testfixtures/TestViewerContext.js.map +1 -1
  73. package/package.json +2 -2
  74. package/src/EnforcingEntityLoader.ts +9 -0
  75. package/src/Entity.ts +6 -29
  76. package/src/EntityAssociationLoader.ts +9 -25
  77. package/src/EntityFields.ts +5 -3
  78. package/src/EntityLoader.ts +17 -0
  79. package/src/EntityMutationTriggerConfiguration.ts +5 -7
  80. package/src/EntityQueryContextProvider.ts +1 -1
  81. package/src/IEntityCacheAdapterProvider.ts +1 -1
  82. package/src/ReadonlyEntity.ts +1 -4
  83. package/src/ViewerContext.ts +5 -5
  84. package/src/__tests__/EnforcingEntityLoader-test.ts +43 -0
  85. package/src/__tests__/Entity-test.ts +43 -27
  86. package/src/__tests__/EntityAssociationLoader-test.ts +168 -86
  87. package/src/__tests__/EntityCommonUseCases-test.ts +36 -18
  88. package/src/__tests__/EntityEdges-test.ts +102 -40
  89. package/src/__tests__/EntityFields-test.ts +7 -1
  90. package/src/__tests__/EntityLoader-constructor-test.ts +1 -1
  91. package/src/__tests__/EntityLoader-test.ts +24 -20
  92. package/src/__tests__/EntityMutator-MutationCacheConsistency-test.ts +19 -16
  93. package/src/__tests__/EntityMutator-test.ts +67 -61
  94. package/src/__tests__/EntitySecondaryCacheLoader-test.ts +20 -11
  95. package/src/__tests__/EntitySelfReferentialEdges-test.ts +115 -47
  96. package/src/__tests__/ReadonlyEntity-test.ts +15 -13
  97. package/src/__tests__/ViewerContext-test.ts +3 -2
  98. package/src/__tests__/cases/TwoEntitySameTableDisjointRows-test.ts +33 -22
  99. package/src/__tests__/cases/TwoEntitySameTableOverlappingRows-test.ts +30 -22
  100. package/src/internal/EntityDataManager.ts +1 -1
  101. package/src/internal/__tests__/EntityDataManager-test.ts +11 -11
  102. package/src/testfixtures/SimpleTestEntity.ts +8 -8
  103. package/src/testfixtures/TestEntity.ts +15 -12
  104. package/src/testfixtures/TestEntity2.ts +8 -8
  105. 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(viewerContext).enforceCreateAsync();
91
- const subCategory = await CategoryEntity.creator(viewerContext)
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(viewerContext)
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).enforcing().loadByIDNullableAsync(parentCategory.getID())
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).enforcing().loadByIDNullableAsync(subCategory.getID())
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).enforcing().loadByIDNullableAsync(subSubCategory.getID())
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).enforcing().loadByIDNullableAsync(parentCategory.getID())
123
+ CategoryEntity.loader(viewerContext, viewerContext.getQueryContext())
124
+ .enforcing()
125
+ .loadByIDNullableAsync(parentCategory.getID())
112
126
  ).resolves.toBeNull();
113
127
  await expect(
114
- CategoryEntity.loader(viewerContext).enforcing().loadByIDNullableAsync(subCategory.getID())
128
+ CategoryEntity.loader(viewerContext, viewerContext.getQueryContext())
129
+ .enforcing()
130
+ .loadByIDNullableAsync(subCategory.getID())
115
131
  ).resolves.toBeNull();
116
132
  await expect(
117
- CategoryEntity.loader(viewerContext).enforcing().loadByIDNullableAsync(subSubCategory.getID())
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(viewerContext).enforceCreateAsync();
128
- const categoryB = await CategoryEntity.creator(viewerContext)
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).enforcing().loadByIDNullableAsync(categoryA.getID())
159
+ CategoryEntity.loader(viewerContext, viewerContext.getQueryContext())
160
+ .enforcing()
161
+ .loadByIDNullableAsync(categoryA.getID())
139
162
  ).resolves.toBeNull();
140
163
  await expect(
141
- CategoryEntity.loader(viewerContext).enforcing().loadByIDNullableAsync(categoryB.getID())
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(viewerContext).enforceCreateAsync();
154
- const subCategory = await CategoryEntity.creator(viewerContext)
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(viewerContext)
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).enforcing().loadByIDNullableAsync(parentCategory.getID())
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).enforcing().loadByIDNullableAsync(subCategory.getID())
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).enforcing().loadByIDNullableAsync(subSubCategory.getID())
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).enforcing().loadByIDNullableAsync(parentCategory.getID())
211
+ CategoryEntity.loader(viewerContext, viewerContext.getQueryContext())
212
+ .enforcing()
213
+ .loadByIDNullableAsync(parentCategory.getID())
175
214
  ).resolves.toBeNull();
176
215
 
177
- const loadedSubCategory = await CategoryEntity.loader(viewerContext)
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(viewerContext)
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(viewerContext).enforceCreateAsync();
195
- const categoryB = await CategoryEntity.creator(viewerContext)
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(viewerContext)
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(viewerContext).enforceCreateAsync();
221
- const subCategory = await CategoryEntity.creator(viewerContext)
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(viewerContext)
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).enforcing().loadByIDNullableAsync(parentCategory.getID())
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).enforcing().loadByIDNullableAsync(parentCategory.getID())
331
+ CategoryEntity.loader(viewerContext, viewerContext.getQueryContext())
332
+ .enforcing()
333
+ .loadByIDNullableAsync(parentCategory.getID())
273
334
  ).resolves.toBeNull();
274
335
  await expect(
275
- CategoryEntity.loader(viewerContext).enforcing().loadByIDNullableAsync(subCategory.getID())
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).enforcing().loadByIDNullableAsync(subSubCategory.getID())
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(viewerContext).enforceCreateAsync();
291
- const categoryB = await CategoryEntity.creator(viewerContext)
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(ViewerContext));
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(ViewerContext));
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(ViewerContext));
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(ViewerContext));
72
- const viewerContext2 = instance(mock(ViewerContext));
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(ViewerContext));
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(ViewerContext));
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(ViewerContext));
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(ViewerContext));
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 ViewerContext(companionProvider);
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 ViewerContext(companionProvider);
180
- expect(SimpleTestEntity.loader(viewerContext)).toBeInstanceOf(EntityLoader);
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('getQueryContextForDatabaseAdaptorFlavor', () => {
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 = viewerContext.getQueryContextForDatabaseAdaptorFlavor('postgres');
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 ViewerContext(companionProvider);
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).enforcing().loadByIDAsync(one.getID())
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).enforcing().loadByIDAsync(two.getID())
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(viewerContext).loadManyByFieldEqualingAsync(
39
- 'common_other_field',
40
- 'wat'
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<any, string, ViewerContext, any, any> {
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, ViewerContext, any, any>(),
122
+ new AlwaysAllowPrivacyPolicyRule<any, string, TestViewerContext, any, any>(),
112
123
  ];
113
124
  protected override readonly createRules = [
114
- new AlwaysAllowPrivacyPolicyRule<any, string, ViewerContext, any, any>(),
125
+ new AlwaysAllowPrivacyPolicyRule<any, string, TestViewerContext, any, any>(),
115
126
  ];
116
127
  protected override readonly updateRules = [
117
- new AlwaysAllowPrivacyPolicyRule<any, string, ViewerContext, any, any>(),
128
+ new AlwaysAllowPrivacyPolicyRule<any, string, TestViewerContext, any, any>(),
118
129
  ];
119
130
  protected override readonly deleteRules = [
120
- new AlwaysAllowPrivacyPolicyRule<any, string, ViewerContext, any, any>(),
131
+ new AlwaysAllowPrivacyPolicyRule<any, string, TestViewerContext, any, any>(),
121
132
  ];
122
133
  }
123
134
 
124
- class OneTestEntity extends Entity<TestFields, string, ViewerContext, OneTestFields> {
135
+ class OneTestEntity extends Entity<TestFields, string, TestViewerContext, OneTestFields> {
125
136
  constructor(constructorParams: {
126
- viewerContext: 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
- ViewerContext,
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, ViewerContext, TwoTestFields> {
165
+ class TwoTestEntity extends Entity<TestFields, string, TestViewerContext, TwoTestFields> {
155
166
  constructor(constructorParams: {
156
- viewerContext: 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
- ViewerContext,
181
+ TestViewerContext,
171
182
  TwoTestEntity,
172
183
  TestEntityPrivacyPolicy,
173
184
  TwoTestFields