@expo/entity 0.31.1 → 0.33.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 (257) hide show
  1. package/build/ComposedEntityCacheAdapter.d.ts +4 -6
  2. package/build/ComposedEntityCacheAdapter.js +3 -6
  3. package/build/ComposedEntityCacheAdapter.js.map +1 -1
  4. package/build/EnforcingEntityLoader.d.ts +6 -1
  5. package/build/EnforcingEntityLoader.js +8 -0
  6. package/build/EnforcingEntityLoader.js.map +1 -1
  7. package/build/Entity.d.ts +20 -10
  8. package/build/Entity.js +2 -2
  9. package/build/Entity.js.map +1 -1
  10. package/build/EntityAssociationLoader.d.ts +9 -9
  11. package/build/EntityCompanion.d.ts +6 -5
  12. package/build/EntityCompanion.js +6 -4
  13. package/build/EntityCompanion.js.map +1 -1
  14. package/build/EntityCompanionProvider.d.ts +28 -36
  15. package/build/EntityCompanionProvider.js +4 -19
  16. package/build/EntityCompanionProvider.js.map +1 -1
  17. package/build/EntityConfiguration.d.ts +3 -3
  18. package/build/EntityConfiguration.js +2 -2
  19. package/build/EntityConfiguration.js.map +1 -1
  20. package/build/EntityDatabaseAdapter.d.ts +1 -1
  21. package/build/EntityDatabaseAdapter.js +1 -1
  22. package/build/EntityDatabaseAdapter.js.map +1 -1
  23. package/build/EntityFieldDefinition.d.ts +2 -2
  24. package/build/EntityFieldDefinition.js +1 -1
  25. package/build/EntityFieldDefinition.js.map +1 -1
  26. package/build/EntityLoader.d.ts +10 -2
  27. package/build/EntityLoader.js +32 -7
  28. package/build/EntityLoader.js.map +1 -1
  29. package/build/EntityLoaderFactory.d.ts +4 -7
  30. package/build/EntityLoaderFactory.js +3 -5
  31. package/build/EntityLoaderFactory.js.map +1 -1
  32. package/build/EntityMutationInfo.d.ts +3 -3
  33. package/build/EntityMutationInfo.js +1 -1
  34. package/build/EntityMutationInfo.js.map +1 -1
  35. package/build/EntityMutationTriggerConfiguration.d.ts +3 -3
  36. package/build/EntityMutationValidator.d.ts +1 -1
  37. package/build/EntityMutator.d.ts +9 -7
  38. package/build/EntityMutator.js +21 -21
  39. package/build/EntityMutator.js.map +1 -1
  40. package/build/EntityMutatorFactory.d.ts +4 -2
  41. package/build/EntityMutatorFactory.js +5 -4
  42. package/build/EntityMutatorFactory.js.map +1 -1
  43. package/build/EntityPrivacyPolicy.d.ts +3 -3
  44. package/build/EntityPrivacyPolicy.js +2 -2
  45. package/build/EntityPrivacyPolicy.js.map +1 -1
  46. package/build/EntityQueryContext.d.ts +13 -5
  47. package/build/EntityQueryContext.js +11 -4
  48. package/build/EntityQueryContext.js.map +1 -1
  49. package/build/EntityQueryContextProvider.d.ts +3 -3
  50. package/build/EntityQueryContextProvider.js +2 -2
  51. package/build/EntityQueryContextProvider.js.map +1 -1
  52. package/build/EntitySecondaryCacheLoader.d.ts +1 -1
  53. package/build/EntitySecondaryCacheLoader.js +1 -1
  54. package/build/EntitySecondaryCacheLoader.js.map +1 -1
  55. package/build/GenericEntityCacheAdapter.d.ts +14 -0
  56. package/build/GenericEntityCacheAdapter.js +38 -0
  57. package/build/GenericEntityCacheAdapter.js.map +1 -0
  58. package/build/{EntityCacheAdapter.d.ts → IEntityCacheAdapter.d.ts} +5 -8
  59. package/build/IEntityCacheAdapter.js +3 -0
  60. package/build/IEntityCacheAdapter.js.map +1 -0
  61. package/build/IEntityCacheAdapterProvider.d.ts +2 -2
  62. package/build/IEntityGenericCacher.d.ts +31 -2
  63. package/build/ReadonlyEntity.d.ts +19 -7
  64. package/build/ReadonlyEntity.js +15 -13
  65. package/build/ReadonlyEntity.js.map +1 -1
  66. package/build/ViewerContext.d.ts +3 -3
  67. package/build/ViewerContext.js +3 -3
  68. package/build/ViewerContext.js.map +1 -1
  69. package/build/ViewerScopedEntityCompanion.d.ts +2 -2
  70. package/build/ViewerScopedEntityCompanion.js.map +1 -1
  71. package/build/ViewerScopedEntityCompanionProvider.d.ts +3 -3
  72. package/build/ViewerScopedEntityCompanionProvider.js +3 -3
  73. package/build/ViewerScopedEntityCompanionProvider.js.map +1 -1
  74. package/build/ViewerScopedEntityLoaderFactory.d.ts +1 -1
  75. package/build/ViewerScopedEntityMutatorFactory.d.ts +1 -1
  76. package/build/__tests__/ComposedCacheAdapter-test.js +4 -8
  77. package/build/__tests__/ComposedCacheAdapter-test.js.map +1 -1
  78. package/build/__tests__/EnforcingEntityLoader-test.js +28 -0
  79. package/build/__tests__/EnforcingEntityLoader-test.js.map +1 -1
  80. package/build/__tests__/Entity-test.js +42 -20
  81. package/build/__tests__/Entity-test.js.map +1 -1
  82. package/build/__tests__/EntityAssociationLoader-test.js +6 -6
  83. package/build/__tests__/EntityAssociationLoader-test.js.map +1 -1
  84. package/build/__tests__/EntityCommonUseCases-test.js +20 -22
  85. package/build/__tests__/EntityCommonUseCases-test.js.map +1 -1
  86. package/build/__tests__/EntityCompanion-test.js +2 -1
  87. package/build/__tests__/EntityCompanion-test.js.map +1 -1
  88. package/build/__tests__/EntityCompanionProvider-test.js +15 -40
  89. package/build/__tests__/EntityCompanionProvider-test.js.map +1 -1
  90. package/build/__tests__/EntityEdges-test.js +48 -54
  91. package/build/__tests__/EntityEdges-test.js.map +1 -1
  92. package/build/__tests__/EntityLoader-constructor-test.d.ts +9 -5
  93. package/build/__tests__/EntityLoader-constructor-test.js +13 -14
  94. package/build/__tests__/EntityLoader-constructor-test.js.map +1 -1
  95. package/build/__tests__/EntityLoader-test.js +22 -12
  96. package/build/__tests__/EntityLoader-test.js.map +1 -1
  97. package/build/__tests__/EntityMutator-MutationCacheConsistency-test.js +20 -22
  98. package/build/__tests__/EntityMutator-MutationCacheConsistency-test.js.map +1 -1
  99. package/build/__tests__/EntityMutator-test.js +67 -14
  100. package/build/__tests__/EntityMutator-test.js.map +1 -1
  101. package/build/__tests__/EntityPrivacyPolicy-test.js +82 -29
  102. package/build/__tests__/EntityPrivacyPolicy-test.js.map +1 -1
  103. package/build/__tests__/EntityQueryContext-test.js +12 -0
  104. package/build/__tests__/EntityQueryContext-test.js.map +1 -1
  105. package/build/__tests__/EntitySecondaryCacheLoader-test.js +1 -2
  106. package/build/__tests__/EntitySecondaryCacheLoader-test.js.map +1 -1
  107. package/build/__tests__/EntitySelfReferentialEdges-test.js +16 -20
  108. package/build/__tests__/EntitySelfReferentialEdges-test.js.map +1 -1
  109. package/build/__tests__/GenericEntityCacheAdapter-test.d.ts +1 -0
  110. package/build/__tests__/GenericEntityCacheAdapter-test.js +80 -0
  111. package/build/__tests__/GenericEntityCacheAdapter-test.js.map +1 -0
  112. package/build/__tests__/ReadonlyEntity-test.js +79 -13
  113. package/build/__tests__/ReadonlyEntity-test.js.map +1 -1
  114. package/build/__tests__/ViewerScopedEntityCompanionProvider-test.js +2 -25
  115. package/build/__tests__/ViewerScopedEntityCompanionProvider-test.js.map +1 -1
  116. package/build/__tests__/cases/TwoEntitySameTableDisjointRows-test.js +20 -23
  117. package/build/__tests__/cases/TwoEntitySameTableDisjointRows-test.js.map +1 -1
  118. package/build/__tests__/cases/TwoEntitySameTableOverlappingRows-test.js +17 -20
  119. package/build/__tests__/cases/TwoEntitySameTableOverlappingRows-test.js.map +1 -1
  120. package/build/errors/EntityError.js +2 -2
  121. package/build/errors/EntityError.js.map +1 -1
  122. package/build/errors/EntityInvalidFieldValueError.d.ts +2 -2
  123. package/build/errors/EntityInvalidFieldValueError.js.map +1 -1
  124. package/build/errors/EntityNotAuthorizedError.d.ts +2 -2
  125. package/build/errors/EntityNotAuthorizedError.js +1 -1
  126. package/build/errors/EntityNotAuthorizedError.js.map +1 -1
  127. package/build/errors/EntityNotFoundError.d.ts +2 -2
  128. package/build/errors/EntityNotFoundError.js.map +1 -1
  129. package/build/index.d.ts +2 -1
  130. package/build/index.js +3 -3
  131. package/build/index.js.map +1 -1
  132. package/build/internal/EntityDataManager.d.ts +1 -1
  133. package/build/internal/EntityDataManager.js +1 -1
  134. package/build/internal/EntityDataManager.js.map +1 -1
  135. package/build/internal/EntityFieldTransformationUtils.d.ts +1 -1
  136. package/build/internal/EntityFieldTransformationUtils.js +4 -4
  137. package/build/internal/EntityFieldTransformationUtils.js.map +1 -1
  138. package/build/internal/EntityTableDataCoordinator.d.ts +3 -3
  139. package/build/internal/EntityTableDataCoordinator.js.map +1 -1
  140. package/build/internal/ReadThroughEntityCache.d.ts +3 -3
  141. package/build/internal/ReadThroughEntityCache.js +1 -1
  142. package/build/internal/ReadThroughEntityCache.js.map +1 -1
  143. package/build/internal/__tests__/EntityDataManager-test.js +1 -1
  144. package/build/internal/__tests__/EntityDataManager-test.js.map +1 -1
  145. package/build/internal/__tests__/ReadThroughEntityCache-test.js.map +1 -1
  146. package/build/metrics/EntityMetricsUtils.js.map +1 -1
  147. package/build/metrics/IEntityMetricsAdapter.js +4 -4
  148. package/build/metrics/IEntityMetricsAdapter.js.map +1 -1
  149. package/build/rules/AlwaysAllowPrivacyPolicyRule.d.ts +2 -2
  150. package/build/rules/AlwaysAllowPrivacyPolicyRule.js.map +1 -1
  151. package/build/rules/AlwaysDenyPrivacyPolicyRule.d.ts +2 -2
  152. package/build/rules/AlwaysDenyPrivacyPolicyRule.js.map +1 -1
  153. package/build/rules/AlwaysSkipPrivacyPolicyRule.d.ts +2 -2
  154. package/build/rules/AlwaysSkipPrivacyPolicyRule.js.map +1 -1
  155. package/build/rules/PrivacyPolicyRule.d.ts +1 -1
  156. package/build/rules/PrivacyPolicyRule.js +1 -1
  157. package/build/rules/PrivacyPolicyRule.js.map +1 -1
  158. package/build/testfixtures/DateIDTestEntity.d.ts +2 -3
  159. package/build/testfixtures/DateIDTestEntity.js +7 -9
  160. package/build/testfixtures/DateIDTestEntity.js.map +1 -1
  161. package/build/testfixtures/SimpleTestEntity.d.ts +3 -4
  162. package/build/testfixtures/SimpleTestEntity.js +7 -9
  163. package/build/testfixtures/SimpleTestEntity.js.map +1 -1
  164. package/build/testfixtures/TestEntity.d.ts +2 -3
  165. package/build/testfixtures/TestEntity.js +14 -10
  166. package/build/testfixtures/TestEntity.js.map +1 -1
  167. package/build/testfixtures/TestEntity2.d.ts +2 -3
  168. package/build/testfixtures/TestEntity2.js +7 -9
  169. package/build/testfixtures/TestEntity2.js.map +1 -1
  170. package/build/testfixtures/TestEntityNumberKey.d.ts +2 -3
  171. package/build/testfixtures/TestEntityNumberKey.js +7 -9
  172. package/build/testfixtures/TestEntityNumberKey.js.map +1 -1
  173. package/build/utils/testing/PrivacyPolicyRuleTestUtils.d.ts +4 -4
  174. package/build/utils/testing/StubCacheAdapter.d.ts +6 -5
  175. package/build/utils/testing/StubCacheAdapter.js +5 -6
  176. package/build/utils/testing/StubCacheAdapter.js.map +1 -1
  177. package/build/utils/testing/StubDatabaseAdapterProvider.js.map +1 -1
  178. package/build/utils/testing/StubQueryContextProvider.d.ts +2 -1
  179. package/build/utils/testing/StubQueryContextProvider.js +1 -1
  180. package/build/utils/testing/StubQueryContextProvider.js.map +1 -1
  181. package/build/utils/testing/createUnitTestEntityCompanionProvider.js +2 -2
  182. package/build/utils/testing/createUnitTestEntityCompanionProvider.js.map +1 -1
  183. package/package.json +3 -3
  184. package/src/ComposedEntityCacheAdapter.ts +4 -11
  185. package/src/EnforcingEntityLoader.ts +10 -1
  186. package/src/Entity.ts +23 -12
  187. package/src/EntityAssociationLoader.ts +12 -12
  188. package/src/EntityCompanion.ts +13 -32
  189. package/src/EntityCompanionProvider.ts +41 -80
  190. package/src/EntityConfiguration.ts +4 -5
  191. package/src/EntityFieldDefinition.ts +2 -2
  192. package/src/EntityLoader.ts +36 -2
  193. package/src/EntityLoaderFactory.ts +7 -9
  194. package/src/EntityMutationInfo.ts +2 -2
  195. package/src/EntityMutationTriggerConfiguration.ts +3 -3
  196. package/src/EntityMutationValidator.ts +1 -1
  197. package/src/EntityMutator.ts +38 -31
  198. package/src/EntityMutatorFactory.ts +6 -1
  199. package/src/EntityPrivacyPolicy.ts +2 -2
  200. package/src/EntityQueryContext.ts +24 -4
  201. package/src/EntityQueryContextProvider.ts +7 -5
  202. package/src/EntitySecondaryCacheLoader.ts +1 -1
  203. package/src/GenericEntityCacheAdapter.ts +65 -0
  204. package/src/{EntityCacheAdapter.ts → IEntityCacheAdapter.ts} +5 -8
  205. package/src/IEntityCacheAdapterProvider.ts +2 -2
  206. package/src/IEntityGenericCacher.ts +32 -2
  207. package/src/ReadonlyEntity.ts +32 -32
  208. package/src/ViewerContext.ts +10 -8
  209. package/src/ViewerScopedEntityCompanion.ts +2 -2
  210. package/src/ViewerScopedEntityCompanionProvider.ts +4 -12
  211. package/src/ViewerScopedEntityLoaderFactory.ts +1 -1
  212. package/src/ViewerScopedEntityMutatorFactory.ts +1 -1
  213. package/src/__tests__/ComposedCacheAdapter-test.ts +6 -11
  214. package/src/__tests__/EnforcingEntityLoader-test.ts +44 -0
  215. package/src/__tests__/Entity-test.ts +42 -21
  216. package/src/__tests__/EntityCommonUseCases-test.ts +20 -22
  217. package/src/__tests__/EntityCompanion-test.ts +6 -9
  218. package/src/__tests__/EntityCompanionProvider-test.ts +14 -26
  219. package/src/__tests__/EntityEdges-test.ts +43 -49
  220. package/src/__tests__/EntityLoader-constructor-test.ts +16 -12
  221. package/src/__tests__/EntityLoader-test.ts +14 -1
  222. package/src/__tests__/EntityMutator-MutationCacheConsistency-test.ts +20 -22
  223. package/src/__tests__/EntityMutator-test.ts +119 -19
  224. package/src/__tests__/EntityPrivacyPolicy-test.ts +82 -29
  225. package/src/__tests__/EntityQueryContext-test.ts +23 -1
  226. package/src/__tests__/EntitySelfReferentialEdges-test.ts +8 -10
  227. package/src/__tests__/GenericEntityCacheAdapter-test.ts +102 -0
  228. package/src/__tests__/ReadonlyEntity-test.ts +79 -13
  229. package/src/__tests__/ViewerScopedEntityCompanionProvider-test.ts +2 -5
  230. package/src/__tests__/cases/TwoEntitySameTableDisjointRows-test.ts +30 -24
  231. package/src/__tests__/cases/TwoEntitySameTableOverlappingRows-test.ts +14 -18
  232. package/src/errors/EntityInvalidFieldValueError.ts +2 -2
  233. package/src/errors/EntityNotAuthorizedError.ts +2 -2
  234. package/src/errors/EntityNotFoundError.ts +2 -2
  235. package/src/index.ts +2 -1
  236. package/src/internal/EntityDataManager.ts +1 -1
  237. package/src/internal/EntityTableDataCoordinator.ts +4 -4
  238. package/src/internal/ReadThroughEntityCache.ts +2 -2
  239. package/src/internal/__tests__/EntityDataManager-test.ts +2 -1
  240. package/src/internal/__tests__/ReadThroughEntityCache-test.ts +8 -8
  241. package/src/metrics/EntityMetricsUtils.ts +1 -1
  242. package/src/rules/AlwaysAllowPrivacyPolicyRule.ts +2 -2
  243. package/src/rules/AlwaysDenyPrivacyPolicyRule.ts +2 -2
  244. package/src/rules/AlwaysSkipPrivacyPolicyRule.ts +2 -2
  245. package/src/rules/PrivacyPolicyRule.ts +1 -1
  246. package/src/testfixtures/DateIDTestEntity.ts +6 -8
  247. package/src/testfixtures/SimpleTestEntity.ts +6 -8
  248. package/src/testfixtures/TestEntity.ts +19 -15
  249. package/src/testfixtures/TestEntity2.ts +6 -8
  250. package/src/testfixtures/TestEntityNumberKey.ts +6 -8
  251. package/src/utils/testing/PrivacyPolicyRuleTestUtils.ts +4 -4
  252. package/src/utils/testing/StubCacheAdapter.ts +9 -11
  253. package/src/utils/testing/StubDatabaseAdapterProvider.ts +1 -1
  254. package/src/utils/testing/StubQueryContextProvider.ts +4 -3
  255. package/src/utils/testing/createUnitTestEntityCompanionProvider.ts +3 -3
  256. package/build/EntityCacheAdapter.js +0 -13
  257. package/build/EntityCacheAdapter.js.map +0 -1
@@ -87,17 +87,22 @@ export default class TestEntity extends Entity<
87
87
  ViewerContext,
88
88
  TestFieldSelection
89
89
  > {
90
- constructor(viewerContext: ViewerContext, rawFields: Readonly<TestFields>) {
91
- if (rawFields.id === ID_SENTINEL_THROW_LITERAL) {
90
+ constructor(constructorParams: {
91
+ viewerContext: ViewerContext;
92
+ id: string;
93
+ databaseFields: Readonly<TestFields>;
94
+ selectedFields: Readonly<TestFields>;
95
+ }) {
96
+ if (constructorParams.selectedFields.id === ID_SENTINEL_THROW_LITERAL) {
92
97
  // eslint-disable-next-line no-throw-literal,@typescript-eslint/no-throw-literal
93
98
  throw 'hello';
94
- } else if (rawFields.id === ID_SENTINEL_THROW_ERROR) {
99
+ } else if (constructorParams.selectedFields.id === ID_SENTINEL_THROW_ERROR) {
95
100
  throw new Error('world');
96
101
  }
97
- super(viewerContext, rawFields);
102
+ super(constructorParams);
98
103
  }
99
104
 
100
- static getCompanionDefinition(): EntityCompanionDefinition<
105
+ static defineCompanionDefinition(): EntityCompanionDefinition<
101
106
  TestFields,
102
107
  string,
103
108
  ViewerContext,
@@ -105,16 +110,14 @@ export default class TestEntity extends Entity<
105
110
  TestEntityPrivacyPolicy,
106
111
  TestFieldSelection
107
112
  > {
108
- return testEntityCompanion;
113
+ return {
114
+ entityClass: TestEntity,
115
+ entityConfiguration: testEntityConfiguration,
116
+ privacyPolicyClass: TestEntityPrivacyPolicy,
117
+ };
109
118
  }
110
119
  }
111
120
 
112
- export const testEntityCompanion = new EntityCompanionDefinition({
113
- entityClass: TestEntity,
114
- entityConfiguration: testEntityConfiguration,
115
- privacyPolicyClass: TestEntityPrivacyPolicy,
116
- });
117
-
118
121
  describe(EntityLoader, () => {
119
122
  it('handles thrown errors and literals from constructor', async () => {
120
123
  const viewerContext = instance(mock(ViewerContext));
@@ -158,6 +161,7 @@ describe(EntityLoader, () => {
158
161
  privacyPolicyEvaluationContext,
159
162
  testEntityConfiguration,
160
163
  TestEntity,
164
+ /* entitySelectedFields */ undefined,
161
165
  privacyPolicy,
162
166
  dataManager,
163
167
  metricsAdapter
@@ -75,6 +75,7 @@ describe(EntityLoader, () => {
75
75
  privacyPolicyEvaluationContext,
76
76
  testEntityConfiguration,
77
77
  TestEntity,
78
+ /* entitySelectedFields */ undefined,
78
79
  privacyPolicy,
79
80
  dataManager,
80
81
  metricsAdapter
@@ -177,6 +178,7 @@ describe(EntityLoader, () => {
177
178
  privacyPolicyEvaluationContext,
178
179
  testEntityConfiguration,
179
180
  TestEntity,
181
+ /* entitySelectedFields */ undefined,
180
182
  privacyPolicy,
181
183
  dataManager,
182
184
  metricsAdapter
@@ -275,6 +277,7 @@ describe(EntityLoader, () => {
275
277
  privacyPolicyEvaluationContext,
276
278
  testEntityConfiguration,
277
279
  TestEntity,
280
+ /* entitySelectedFields */ undefined,
278
281
  privacyPolicy,
279
282
  dataManager,
280
283
  metricsAdapter
@@ -353,6 +356,7 @@ describe(EntityLoader, () => {
353
356
  privacyPolicyEvaluationContext,
354
357
  testEntityConfiguration,
355
358
  TestEntity,
359
+ /* entitySelectedFields */ undefined,
356
360
  privacyPolicy,
357
361
  dataManager,
358
362
  metricsAdapter
@@ -385,6 +389,7 @@ describe(EntityLoader, () => {
385
389
  privacyPolicyEvaluationContext,
386
390
  testEntityConfiguration,
387
391
  TestEntity,
392
+ /* entitySelectedFields */ undefined,
388
393
  privacyPolicy,
389
394
  dataManagerInstance,
390
395
  metricsAdapter
@@ -412,6 +417,7 @@ describe(EntityLoader, () => {
412
417
  privacyPolicyEvaluationContext,
413
418
  testEntityConfiguration,
414
419
  TestEntity,
420
+ /* entitySelectedFields */ undefined,
415
421
  privacyPolicy,
416
422
  dataManagerInstance,
417
423
  metricsAdapter
@@ -442,6 +448,7 @@ describe(EntityLoader, () => {
442
448
  privacyPolicyEvaluationContext,
443
449
  testEntityConfiguration,
444
450
  TestEntity,
451
+ /* entitySelectedFields */ undefined,
445
452
  privacyPolicy,
446
453
  dataManagerInstance,
447
454
  metricsAdapter
@@ -486,6 +493,7 @@ describe(EntityLoader, () => {
486
493
  privacyPolicyEvaluationContext,
487
494
  testEntityConfiguration,
488
495
  TestEntity,
496
+ /* entitySelectedFields */ undefined,
489
497
  privacyPolicy,
490
498
  dataManagerInstance,
491
499
  metricsAdapter
@@ -519,6 +527,7 @@ describe(EntityLoader, () => {
519
527
  privacyPolicyEvaluationContext,
520
528
  testEntityConfiguration,
521
529
  TestEntity,
530
+ /* entitySelectedFields */ undefined,
522
531
  privacyPolicy,
523
532
  dataManagerInstance,
524
533
  metricsAdapter
@@ -529,7 +538,11 @@ describe(EntityLoader, () => {
529
538
  await expect(entityLoader.loadByIDAsync(loadByValue)).rejects.toEqual(error);
530
539
  await expect(entityLoader.enforcing().loadByIDAsync(loadByValue)).rejects.toEqual(error);
531
540
  await expect(entityLoader.loadManyByIDsAsync([loadByValue])).rejects.toEqual(error);
532
- await expect(entityLoader.loadManyByIDsAsync([loadByValue])).rejects.toEqual(error);
541
+ await expect(entityLoader.enforcing().loadManyByIDsAsync([loadByValue])).rejects.toEqual(error);
542
+ await expect(entityLoader.loadManyByIDsNullableAsync([loadByValue])).rejects.toEqual(error);
543
+ await expect(
544
+ entityLoader.enforcing().loadManyByIDsNullableAsync([loadByValue])
545
+ ).rejects.toEqual(error);
533
546
  await expect(
534
547
  entityLoader.loadManyByFieldEqualingAsync('customIdField', loadByValue)
535
548
  ).rejects.toEqual(error);
@@ -34,37 +34,35 @@ class BlahEntityPrivacyPolicy extends EntityPrivacyPolicy<
34
34
  }
35
35
 
36
36
  class BlahEntity extends Entity<BlahFields, string, ViewerContext> {
37
- static getCompanionDefinition(): EntityCompanionDefinition<
37
+ static defineCompanionDefinition(): EntityCompanionDefinition<
38
38
  BlahFields,
39
39
  string,
40
40
  ViewerContext,
41
41
  BlahEntity,
42
42
  BlahEntityPrivacyPolicy
43
43
  > {
44
- return blahCompanion;
44
+ return {
45
+ entityClass: BlahEntity,
46
+ entityConfiguration: new EntityConfiguration<BlahFields>({
47
+ idField: 'id',
48
+ tableName: 'blah_table',
49
+ schema: {
50
+ id: new UUIDField({
51
+ columnName: 'id',
52
+ cache: true,
53
+ }),
54
+ },
55
+ databaseAdapterFlavor: 'postgres',
56
+ cacheAdapterFlavor: 'redis',
57
+ }),
58
+ privacyPolicyClass: BlahEntityPrivacyPolicy,
59
+ mutationTriggers: {
60
+ afterCommit: [new TestNonTransactionalMutationTrigger()],
61
+ },
62
+ };
45
63
  }
46
64
  }
47
65
 
48
- const blahCompanion = new EntityCompanionDefinition({
49
- entityClass: BlahEntity,
50
- entityConfiguration: new EntityConfiguration<BlahFields>({
51
- idField: 'id',
52
- tableName: 'blah_table',
53
- schema: {
54
- id: new UUIDField({
55
- columnName: 'id',
56
- cache: true,
57
- }),
58
- },
59
- databaseAdapterFlavor: 'postgres',
60
- cacheAdapterFlavor: 'redis',
61
- }),
62
- privacyPolicyClass: BlahEntityPrivacyPolicy,
63
- mutationTriggers: () => ({
64
- afterCommit: [new TestNonTransactionalMutationTrigger()],
65
- }),
66
- });
67
-
68
66
  class TestNonTransactionalMutationTrigger extends EntityNonTransactionalMutationTrigger<
69
67
  BlahFields,
70
68
  string,
@@ -12,7 +12,10 @@ import {
12
12
  } from 'ts-mockito';
13
13
  import { v4 as uuidv4 } from 'uuid';
14
14
 
15
+ import EntityCompanionProvider from '../EntityCompanionProvider';
16
+ import EntityConfiguration from '../EntityConfiguration';
15
17
  import EntityDatabaseAdapter from '../EntityDatabaseAdapter';
18
+ import EntityLoader from '../EntityLoader';
16
19
  import EntityLoaderFactory from '../EntityLoaderFactory';
17
20
  import {
18
21
  EntityMutationType,
@@ -27,6 +30,7 @@ import EntityMutationValidator from '../EntityMutationValidator';
27
30
  import EntityMutatorFactory from '../EntityMutatorFactory';
28
31
  import { EntityPrivacyPolicyEvaluationContext } from '../EntityPrivacyPolicy';
29
32
  import { EntityTransactionalQueryContext, EntityQueryContext } from '../EntityQueryContext';
33
+ import IEntityDatabaseAdapterProvider from '../IEntityDatabaseAdapterProvider';
30
34
  import ViewerContext from '../ViewerContext';
31
35
  import { enforceResultsAsync } from '../entityUtils';
32
36
  import EntityDataManager from '../internal/EntityDataManager';
@@ -299,10 +303,39 @@ const createEntityMutatorFactory = (
299
303
  new Map([[testEntityConfiguration.tableName, existingObjects]])
300
304
  )
301
305
  );
306
+ const customStubDatabaseAdapterProvider: IEntityDatabaseAdapterProvider = {
307
+ getDatabaseAdapter<TFields>(
308
+ _entityConfiguration: EntityConfiguration<TFields>
309
+ ): EntityDatabaseAdapter<TFields> {
310
+ return databaseAdapter as any as EntityDatabaseAdapter<TFields>;
311
+ },
312
+ };
302
313
  const metricsAdapter = new NoOpEntityMetricsAdapter();
303
314
  const cacheAdapterProvider = new NoCacheStubCacheAdapterProvider();
304
315
  const cacheAdapter = cacheAdapterProvider.getCacheAdapter(testEntityConfiguration);
305
316
  const entityCache = new ReadThroughEntityCache<TestFields>(testEntityConfiguration, cacheAdapter);
317
+
318
+ const companionProvider = new EntityCompanionProvider(
319
+ metricsAdapter,
320
+ new Map([
321
+ [
322
+ 'postgres',
323
+ {
324
+ adapterProvider: customStubDatabaseAdapterProvider,
325
+ queryContextProvider: StubQueryContextProvider,
326
+ },
327
+ ],
328
+ ]),
329
+ new Map([
330
+ [
331
+ 'redis',
332
+ {
333
+ cacheAdapterProvider,
334
+ },
335
+ ],
336
+ ])
337
+ );
338
+
306
339
  const dataManager = new EntityDataManager(
307
340
  databaseAdapter,
308
341
  entityCache,
@@ -311,13 +344,12 @@ const createEntityMutatorFactory = (
311
344
  TestEntity.name
312
345
  );
313
346
  const entityLoaderFactory = new EntityLoaderFactory(
314
- testEntityConfiguration,
315
- TestEntity,
316
- privacyPolicy,
347
+ companionProvider.getCompanionForEntity(TestEntity),
317
348
  dataManager,
318
349
  metricsAdapter
319
350
  );
320
351
  const entityMutatorFactory = new EntityMutatorFactory(
352
+ companionProvider,
321
353
  testEntityConfiguration,
322
354
  TestEntity,
323
355
  privacyPolicy,
@@ -930,12 +962,40 @@ describe(EntityMutatorFactory, () => {
930
962
  });
931
963
 
932
964
  it('returns error result when not authorized to create', async () => {
965
+ const entityCompanionProvider = instance(mock(EntityCompanionProvider));
933
966
  const viewerContext = instance(mock(ViewerContext));
934
967
  const queryContext = StubQueryContextProvider.getQueryContext();
935
968
  const privacyPolicyMock = mock(SimpleTestEntityPrivacyPolicy);
936
969
  const databaseAdapter = instance(mock<EntityDatabaseAdapter<SimpleTestFields>>());
937
970
  const metricsAdapter = instance(mock<IEntityMetricsAdapter>());
938
- const entityLoaderFactory = instance(
971
+
972
+ const id1 = uuidv4();
973
+ const fakeEntity = new SimpleTestEntity({
974
+ viewerContext,
975
+ id: id1,
976
+ selectedFields: {
977
+ id: id1,
978
+ },
979
+ databaseFields: {
980
+ id: id1,
981
+ },
982
+ });
983
+
984
+ const entityLoaderMock =
985
+ mock<
986
+ EntityLoader<
987
+ SimpleTestFields,
988
+ string,
989
+ ViewerContext,
990
+ SimpleTestEntity,
991
+ SimpleTestEntityPrivacyPolicy,
992
+ keyof SimpleTestFields
993
+ >
994
+ >(EntityLoader);
995
+ when(entityLoaderMock.constructEntity(anything())).thenReturn(fakeEntity);
996
+ const entityLoader = instance(entityLoaderMock);
997
+
998
+ const entityLoaderFactoryMock =
939
999
  mock<
940
1000
  EntityLoaderFactory<
941
1001
  SimpleTestFields,
@@ -945,8 +1005,15 @@ describe(EntityMutatorFactory, () => {
945
1005
  SimpleTestEntityPrivacyPolicy,
946
1006
  keyof SimpleTestFields
947
1007
  >
948
- >(EntityLoaderFactory)
949
- );
1008
+ >(EntityLoaderFactory);
1009
+ when(
1010
+ entityLoaderFactoryMock.forLoad(
1011
+ viewerContext,
1012
+ anyOfClass(EntityTransactionalQueryContext),
1013
+ anything()
1014
+ )
1015
+ ).thenReturn(entityLoader);
1016
+ const entityLoaderFactory = instance(entityLoaderFactoryMock);
950
1017
 
951
1018
  const rejectionError = new Error();
952
1019
 
@@ -979,6 +1046,7 @@ describe(EntityMutatorFactory, () => {
979
1046
  ).thenReject(rejectionError);
980
1047
 
981
1048
  const entityMutatorFactory = new EntityMutatorFactory(
1049
+ entityCompanionProvider,
982
1050
  simpleTestEntityConfiguration,
983
1051
  SimpleTestEntity,
984
1052
  instance(privacyPolicyMock),
@@ -996,11 +1064,6 @@ describe(EntityMutatorFactory, () => {
996
1064
  expect(entityCreateResult.reason).toEqual(rejectionError);
997
1065
  expect(entityCreateResult.value).toBe(undefined);
998
1066
 
999
- const id1 = uuidv4();
1000
- const fakeEntity = new SimpleTestEntity(viewerContext, {
1001
- id: id1,
1002
- });
1003
-
1004
1067
  const entityUpdateResult = await entityMutatorFactory
1005
1068
  .forUpdate(fakeEntity, queryContext)
1006
1069
  .updateAsync();
@@ -1017,12 +1080,46 @@ describe(EntityMutatorFactory, () => {
1017
1080
  });
1018
1081
 
1019
1082
  it('throws error when db adapter throws', async () => {
1083
+ const entityCompanionProviderMock = mock(EntityCompanionProvider);
1084
+ when(entityCompanionProviderMock.getCompanionForEntity(SimpleTestEntity)).thenReturn({
1085
+ entityCompanionDefinition: SimpleTestEntity.defineCompanionDefinition(),
1086
+ } as any);
1087
+
1088
+ const entityCompanionProvider = instance(entityCompanionProviderMock);
1089
+
1020
1090
  const viewerContext = instance(mock(ViewerContext));
1021
1091
  const queryContext = StubQueryContextProvider.getQueryContext();
1022
1092
  const privacyPolicy = instance(mock(SimpleTestEntityPrivacyPolicy));
1023
1093
  const databaseAdapterMock = mock<EntityDatabaseAdapter<SimpleTestFields>>();
1024
1094
  const metricsAdapter = instance(mock<IEntityMetricsAdapter>());
1025
- const entityLoaderFactory = instance(
1095
+
1096
+ const id1 = uuidv4();
1097
+ const fakeEntity = new SimpleTestEntity({
1098
+ viewerContext,
1099
+ id: id1,
1100
+ selectedFields: {
1101
+ id: id1,
1102
+ },
1103
+ databaseFields: {
1104
+ id: id1,
1105
+ },
1106
+ });
1107
+
1108
+ const entityLoaderMock =
1109
+ mock<
1110
+ EntityLoader<
1111
+ SimpleTestFields,
1112
+ string,
1113
+ ViewerContext,
1114
+ SimpleTestEntity,
1115
+ SimpleTestEntityPrivacyPolicy,
1116
+ keyof SimpleTestFields
1117
+ >
1118
+ >(EntityLoader);
1119
+ when(entityLoaderMock.constructEntity(anything())).thenReturn(fakeEntity);
1120
+ const entityLoader = instance(entityLoaderMock);
1121
+
1122
+ const entityLoaderFactoryMock =
1026
1123
  mock<
1027
1124
  EntityLoaderFactory<
1028
1125
  SimpleTestFields,
@@ -1032,8 +1129,15 @@ describe(EntityMutatorFactory, () => {
1032
1129
  SimpleTestEntityPrivacyPolicy,
1033
1130
  keyof SimpleTestFields
1034
1131
  >
1035
- >(EntityLoaderFactory)
1036
- );
1132
+ >(EntityLoaderFactory);
1133
+ when(
1134
+ entityLoaderFactoryMock.forLoad(
1135
+ viewerContext,
1136
+ anyOfClass(EntityTransactionalQueryContext),
1137
+ anything()
1138
+ )
1139
+ ).thenReturn(entityLoader);
1140
+ const entityLoaderFactory = instance(entityLoaderFactoryMock);
1037
1141
 
1038
1142
  const rejectionError = new Error();
1039
1143
 
@@ -1057,6 +1161,7 @@ describe(EntityMutatorFactory, () => {
1057
1161
  ).thenReject(rejectionError);
1058
1162
 
1059
1163
  const entityMutatorFactory = new EntityMutatorFactory(
1164
+ entityCompanionProvider,
1060
1165
  simpleTestEntityConfiguration,
1061
1166
  SimpleTestEntity,
1062
1167
  privacyPolicy,
@@ -1067,11 +1172,6 @@ describe(EntityMutatorFactory, () => {
1067
1172
  metricsAdapter
1068
1173
  );
1069
1174
 
1070
- const id1 = uuidv4();
1071
- const fakeEntity = new SimpleTestEntity(viewerContext, {
1072
- id: id1,
1073
- });
1074
-
1075
1175
  await expect(
1076
1176
  entityMutatorFactory.forCreate(viewerContext, queryContext).createAsync()
1077
1177
  ).rejects.toEqual(rejectionError);
@@ -26,14 +26,28 @@ type BlahFields = {
26
26
  };
27
27
 
28
28
  class BlahEntity extends Entity<BlahFields, string, ViewerContext> {
29
- static getCompanionDefinition(): EntityCompanionDefinition<
29
+ static defineCompanionDefinition(): EntityCompanionDefinition<
30
30
  BlahFields,
31
31
  string,
32
32
  ViewerContext,
33
33
  BlahEntity,
34
34
  any
35
35
  > {
36
- return blahEntityCompanionDefinition;
36
+ return {
37
+ entityClass: BlahEntity,
38
+ entityConfiguration: new EntityConfiguration<BlahFields>({
39
+ idField: 'id',
40
+ tableName: 'blah_table',
41
+ schema: {
42
+ id: new UUIDField({
43
+ columnName: 'id',
44
+ }),
45
+ },
46
+ databaseAdapterFlavor: 'postgres',
47
+ cacheAdapterFlavor: 'redis',
48
+ }),
49
+ privacyPolicyClass: AlwaysDenyPolicy,
50
+ };
37
51
  }
38
52
  }
39
53
 
@@ -226,22 +240,6 @@ class EmptyPolicy extends EntityPrivacyPolicy<BlahFields, string, ViewerContext,
226
240
  protected override readonly deleteRules = [];
227
241
  }
228
242
 
229
- const blahEntityCompanionDefinition = new EntityCompanionDefinition({
230
- entityClass: BlahEntity,
231
- entityConfiguration: new EntityConfiguration<BlahFields>({
232
- idField: 'id',
233
- tableName: 'blah_table',
234
- schema: {
235
- id: new UUIDField({
236
- columnName: 'id',
237
- }),
238
- },
239
- databaseAdapterFlavor: 'postgres',
240
- cacheAdapterFlavor: 'redis',
241
- }),
242
- privacyPolicyClass: AlwaysDenyPolicy,
243
- });
244
-
245
243
  describe(EntityPrivacyPolicy, () => {
246
244
  describe(EntityPrivacyPolicyEvaluationMode.ENFORCE.toString(), () => {
247
245
  it('throws EntityNotAuthorizedError when deny', async () => {
@@ -250,7 +248,12 @@ describe(EntityPrivacyPolicy, () => {
250
248
  const privacyPolicyEvaluationContext = instance(mock<EntityPrivacyPolicyEvaluationContext>());
251
249
  const metricsAdapterMock = mock<IEntityMetricsAdapter>();
252
250
  const metricsAdapter = instance(metricsAdapterMock);
253
- const entity = new BlahEntity(viewerContext, { id: '1' });
251
+ const entity = new BlahEntity({
252
+ viewerContext,
253
+ id: '1',
254
+ databaseFields: { id: '1' },
255
+ selectedFields: { id: '1' },
256
+ });
254
257
  const policy = new AlwaysDenyPolicy();
255
258
  await expect(
256
259
  policy.authorizeCreateAsync(
@@ -279,7 +282,12 @@ describe(EntityPrivacyPolicy, () => {
279
282
  const privacyPolicyEvaluationContext = instance(mock<EntityPrivacyPolicyEvaluationContext>());
280
283
  const metricsAdapterMock = mock<IEntityMetricsAdapter>();
281
284
  const metricsAdapter = instance(metricsAdapterMock);
282
- const entity = new BlahEntity(viewerContext, { id: '1' });
285
+ const entity = new BlahEntity({
286
+ viewerContext,
287
+ id: '1',
288
+ databaseFields: { id: '1' },
289
+ selectedFields: { id: '1' },
290
+ });
283
291
  const policy = new AlwaysAllowPolicy();
284
292
  const approvedEntity = await policy.authorizeCreateAsync(
285
293
  viewerContext,
@@ -307,7 +315,12 @@ describe(EntityPrivacyPolicy, () => {
307
315
  const privacyPolicyEvaluationContext = instance(mock<EntityPrivacyPolicyEvaluationContext>());
308
316
  const metricsAdapterMock = mock<IEntityMetricsAdapter>();
309
317
  const metricsAdapter = instance(metricsAdapterMock);
310
- const entity = new BlahEntity(viewerContext, { id: '1' });
318
+ const entity = new BlahEntity({
319
+ viewerContext,
320
+ id: '1',
321
+ databaseFields: { id: '1' },
322
+ selectedFields: { id: '1' },
323
+ });
311
324
  const policy = new SkipAllPolicy();
312
325
  await expect(
313
326
  policy.authorizeCreateAsync(
@@ -336,7 +349,12 @@ describe(EntityPrivacyPolicy, () => {
336
349
  const privacyPolicyEvaluationContext = instance(mock<EntityPrivacyPolicyEvaluationContext>());
337
350
  const metricsAdapterMock = mock<IEntityMetricsAdapter>();
338
351
  const metricsAdapter = instance(metricsAdapterMock);
339
- const entity = new BlahEntity(viewerContext, { id: '1' });
352
+ const entity = new BlahEntity({
353
+ viewerContext,
354
+ id: '1',
355
+ databaseFields: { id: '1' },
356
+ selectedFields: { id: '1' },
357
+ });
340
358
  const policy = new EmptyPolicy();
341
359
  await expect(
342
360
  policy.authorizeCreateAsync(
@@ -365,7 +383,12 @@ describe(EntityPrivacyPolicy, () => {
365
383
  const privacyPolicyEvaluationContext = instance(mock<EntityPrivacyPolicyEvaluationContext>());
366
384
  const metricsAdapterMock = mock<IEntityMetricsAdapter>();
367
385
  const metricsAdapter = instance(metricsAdapterMock);
368
- const entity = new BlahEntity(viewerContext, { id: '1' });
386
+ const entity = new BlahEntity({
387
+ viewerContext,
388
+ id: '1',
389
+ databaseFields: { id: '1' },
390
+ selectedFields: { id: '1' },
391
+ });
369
392
  const policy = new ThrowAllPolicy();
370
393
  await expect(
371
394
  policy.authorizeCreateAsync(
@@ -387,7 +410,12 @@ describe(EntityPrivacyPolicy, () => {
387
410
  const privacyPolicyEvaluationContext = instance(mock<EntityPrivacyPolicyEvaluationContext>());
388
411
  const metricsAdapterMock = mock<IEntityMetricsAdapter>();
389
412
  const metricsAdapter = instance(metricsAdapterMock);
390
- const entity = new BlahEntity(viewerContext, { id: '1' });
413
+ const entity = new BlahEntity({
414
+ viewerContext,
415
+ id: '1',
416
+ databaseFields: { id: '1' },
417
+ selectedFields: { id: '1' },
418
+ });
391
419
  const policy = new DryRunAlwaysDenyPolicy();
392
420
 
393
421
  const policySpy = spy(policy);
@@ -421,7 +449,12 @@ describe(EntityPrivacyPolicy, () => {
421
449
  const privacyPolicyEvaluationContext = instance(mock<EntityPrivacyPolicyEvaluationContext>());
422
450
  const metricsAdapterMock = mock<IEntityMetricsAdapter>();
423
451
  const metricsAdapter = instance(metricsAdapterMock);
424
- const entity = new BlahEntity(viewerContext, { id: '1' });
452
+ const entity = new BlahEntity({
453
+ viewerContext,
454
+ id: '1',
455
+ databaseFields: { id: '1' },
456
+ selectedFields: { id: '1' },
457
+ });
425
458
  const policy = new DryRunAlwaysAllowPolicy();
426
459
 
427
460
  const policySpy = spy(policy);
@@ -455,7 +488,12 @@ describe(EntityPrivacyPolicy, () => {
455
488
  const privacyPolicyEvaluationContext = instance(mock<EntityPrivacyPolicyEvaluationContext>());
456
489
  const metricsAdapterMock = mock<IEntityMetricsAdapter>();
457
490
  const metricsAdapter = instance(metricsAdapterMock);
458
- const entity = new BlahEntity(viewerContext, { id: '1' });
491
+ const entity = new BlahEntity({
492
+ viewerContext,
493
+ id: '1',
494
+ databaseFields: { id: '1' },
495
+ selectedFields: { id: '1' },
496
+ });
459
497
  const policy = new DryRunThrowAllPolicy();
460
498
 
461
499
  const policySpy = spy(policy);
@@ -483,7 +521,12 @@ describe(EntityPrivacyPolicy, () => {
483
521
  const privacyPolicyEvaluationContext = instance(mock<EntityPrivacyPolicyEvaluationContext>());
484
522
  const metricsAdapterMock = mock<IEntityMetricsAdapter>();
485
523
  const metricsAdapter = instance(metricsAdapterMock);
486
- const entity = new BlahEntity(viewerContext, { id: '1' });
524
+ const entity = new BlahEntity({
525
+ viewerContext,
526
+ id: '1',
527
+ databaseFields: { id: '1' },
528
+ selectedFields: { id: '1' },
529
+ });
487
530
  const policy = new LoggingEnforceAlwaysDenyPolicy();
488
531
 
489
532
  const policySpy = spy(policy);
@@ -518,7 +561,12 @@ describe(EntityPrivacyPolicy, () => {
518
561
  const privacyPolicyEvaluationContext = instance(mock<EntityPrivacyPolicyEvaluationContext>());
519
562
  const metricsAdapterMock = mock<IEntityMetricsAdapter>();
520
563
  const metricsAdapter = instance(metricsAdapterMock);
521
- const entity = new BlahEntity(viewerContext, { id: '1' });
564
+ const entity = new BlahEntity({
565
+ viewerContext,
566
+ id: '1',
567
+ databaseFields: { id: '1' },
568
+ selectedFields: { id: '1' },
569
+ });
522
570
  const policy = new LoggingEnforceAlwaysAllowPolicy();
523
571
 
524
572
  const policySpy = spy(policy);
@@ -552,7 +600,12 @@ describe(EntityPrivacyPolicy, () => {
552
600
  const privacyPolicyEvaluationContext = instance(mock<EntityPrivacyPolicyEvaluationContext>());
553
601
  const metricsAdapterMock = mock<IEntityMetricsAdapter>();
554
602
  const metricsAdapter = instance(metricsAdapterMock);
555
- const entity = new BlahEntity(viewerContext, { id: '1' });
603
+ const entity = new BlahEntity({
604
+ viewerContext,
605
+ id: '1',
606
+ databaseFields: { id: '1' },
607
+ selectedFields: { id: '1' },
608
+ });
556
609
  const policy = new LoggingEnforceThrowAllPolicy();
557
610
 
558
611
  const policySpy = spy(policy);
@@ -1,6 +1,6 @@
1
1
  import invariant from 'invariant';
2
2
 
3
- import { EntityQueryContext } from '../EntityQueryContext';
3
+ import { EntityQueryContext, TransactionIsolationLevel } from '../EntityQueryContext';
4
4
  import ViewerContext from '../ViewerContext';
5
5
  import { createUnitTestEntityCompanionProvider } from '../utils/testing/createUnitTestEntityCompanionProvider';
6
6
 
@@ -129,4 +129,26 @@ describe(EntityQueryContext, () => {
129
129
  expect(postCommitInvalidationCallback).toHaveBeenCalledTimes(2);
130
130
  });
131
131
  });
132
+
133
+ describe('transaction config', () => {
134
+ it('passes it into the provider', async () => {
135
+ const companionProvider = createUnitTestEntityCompanionProvider();
136
+ const viewerContext = new ViewerContext(companionProvider);
137
+
138
+ const queryContextProvider =
139
+ companionProvider.getQueryContextProviderForDatabaseAdaptorFlavor('postgres');
140
+ const queryContextProviderSpy = jest.spyOn(queryContextProvider, 'runInTransactionAsync');
141
+
142
+ const transactionScopeFn = async (): Promise<any> => {};
143
+ const transactionConfig = { isolationLevel: TransactionIsolationLevel.SERIALIZABLE };
144
+
145
+ await viewerContext.runInTransactionForDatabaseAdaptorFlavorAsync(
146
+ 'postgres',
147
+ transactionScopeFn,
148
+ transactionConfig
149
+ );
150
+
151
+ expect(queryContextProviderSpy).toHaveBeenCalledWith(transactionScopeFn, transactionConfig);
152
+ });
153
+ });
132
154
  });