@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.
- package/build/ComposedEntityCacheAdapter.d.ts +4 -6
- package/build/ComposedEntityCacheAdapter.js +3 -6
- package/build/ComposedEntityCacheAdapter.js.map +1 -1
- package/build/EnforcingEntityLoader.d.ts +6 -1
- package/build/EnforcingEntityLoader.js +8 -0
- package/build/EnforcingEntityLoader.js.map +1 -1
- package/build/Entity.d.ts +20 -10
- package/build/Entity.js +2 -2
- package/build/Entity.js.map +1 -1
- package/build/EntityAssociationLoader.d.ts +9 -9
- package/build/EntityCompanion.d.ts +6 -5
- package/build/EntityCompanion.js +6 -4
- package/build/EntityCompanion.js.map +1 -1
- package/build/EntityCompanionProvider.d.ts +28 -36
- package/build/EntityCompanionProvider.js +4 -19
- package/build/EntityCompanionProvider.js.map +1 -1
- package/build/EntityConfiguration.d.ts +3 -3
- package/build/EntityConfiguration.js +2 -2
- package/build/EntityConfiguration.js.map +1 -1
- package/build/EntityDatabaseAdapter.d.ts +1 -1
- package/build/EntityDatabaseAdapter.js +1 -1
- package/build/EntityDatabaseAdapter.js.map +1 -1
- package/build/EntityFieldDefinition.d.ts +2 -2
- package/build/EntityFieldDefinition.js +1 -1
- package/build/EntityFieldDefinition.js.map +1 -1
- package/build/EntityLoader.d.ts +10 -2
- package/build/EntityLoader.js +32 -7
- package/build/EntityLoader.js.map +1 -1
- package/build/EntityLoaderFactory.d.ts +4 -7
- package/build/EntityLoaderFactory.js +3 -5
- package/build/EntityLoaderFactory.js.map +1 -1
- package/build/EntityMutationInfo.d.ts +3 -3
- package/build/EntityMutationInfo.js +1 -1
- package/build/EntityMutationInfo.js.map +1 -1
- package/build/EntityMutationTriggerConfiguration.d.ts +3 -3
- package/build/EntityMutationValidator.d.ts +1 -1
- package/build/EntityMutator.d.ts +9 -7
- package/build/EntityMutator.js +21 -21
- package/build/EntityMutator.js.map +1 -1
- package/build/EntityMutatorFactory.d.ts +4 -2
- package/build/EntityMutatorFactory.js +5 -4
- package/build/EntityMutatorFactory.js.map +1 -1
- package/build/EntityPrivacyPolicy.d.ts +3 -3
- package/build/EntityPrivacyPolicy.js +2 -2
- package/build/EntityPrivacyPolicy.js.map +1 -1
- package/build/EntityQueryContext.d.ts +13 -5
- package/build/EntityQueryContext.js +11 -4
- package/build/EntityQueryContext.js.map +1 -1
- package/build/EntityQueryContextProvider.d.ts +3 -3
- package/build/EntityQueryContextProvider.js +2 -2
- package/build/EntityQueryContextProvider.js.map +1 -1
- package/build/EntitySecondaryCacheLoader.d.ts +1 -1
- package/build/EntitySecondaryCacheLoader.js +1 -1
- package/build/EntitySecondaryCacheLoader.js.map +1 -1
- package/build/GenericEntityCacheAdapter.d.ts +14 -0
- package/build/GenericEntityCacheAdapter.js +38 -0
- package/build/GenericEntityCacheAdapter.js.map +1 -0
- package/build/{EntityCacheAdapter.d.ts → IEntityCacheAdapter.d.ts} +5 -8
- package/build/IEntityCacheAdapter.js +3 -0
- package/build/IEntityCacheAdapter.js.map +1 -0
- package/build/IEntityCacheAdapterProvider.d.ts +2 -2
- package/build/IEntityGenericCacher.d.ts +31 -2
- package/build/ReadonlyEntity.d.ts +19 -7
- package/build/ReadonlyEntity.js +15 -13
- package/build/ReadonlyEntity.js.map +1 -1
- package/build/ViewerContext.d.ts +3 -3
- package/build/ViewerContext.js +3 -3
- package/build/ViewerContext.js.map +1 -1
- package/build/ViewerScopedEntityCompanion.d.ts +2 -2
- package/build/ViewerScopedEntityCompanion.js.map +1 -1
- package/build/ViewerScopedEntityCompanionProvider.d.ts +3 -3
- package/build/ViewerScopedEntityCompanionProvider.js +3 -3
- package/build/ViewerScopedEntityCompanionProvider.js.map +1 -1
- package/build/ViewerScopedEntityLoaderFactory.d.ts +1 -1
- package/build/ViewerScopedEntityMutatorFactory.d.ts +1 -1
- package/build/__tests__/ComposedCacheAdapter-test.js +4 -8
- package/build/__tests__/ComposedCacheAdapter-test.js.map +1 -1
- package/build/__tests__/EnforcingEntityLoader-test.js +28 -0
- package/build/__tests__/EnforcingEntityLoader-test.js.map +1 -1
- package/build/__tests__/Entity-test.js +42 -20
- package/build/__tests__/Entity-test.js.map +1 -1
- package/build/__tests__/EntityAssociationLoader-test.js +6 -6
- package/build/__tests__/EntityAssociationLoader-test.js.map +1 -1
- package/build/__tests__/EntityCommonUseCases-test.js +20 -22
- package/build/__tests__/EntityCommonUseCases-test.js.map +1 -1
- package/build/__tests__/EntityCompanion-test.js +2 -1
- package/build/__tests__/EntityCompanion-test.js.map +1 -1
- package/build/__tests__/EntityCompanionProvider-test.js +15 -40
- package/build/__tests__/EntityCompanionProvider-test.js.map +1 -1
- package/build/__tests__/EntityEdges-test.js +48 -54
- package/build/__tests__/EntityEdges-test.js.map +1 -1
- package/build/__tests__/EntityLoader-constructor-test.d.ts +9 -5
- package/build/__tests__/EntityLoader-constructor-test.js +13 -14
- package/build/__tests__/EntityLoader-constructor-test.js.map +1 -1
- package/build/__tests__/EntityLoader-test.js +22 -12
- package/build/__tests__/EntityLoader-test.js.map +1 -1
- package/build/__tests__/EntityMutator-MutationCacheConsistency-test.js +20 -22
- package/build/__tests__/EntityMutator-MutationCacheConsistency-test.js.map +1 -1
- package/build/__tests__/EntityMutator-test.js +67 -14
- package/build/__tests__/EntityMutator-test.js.map +1 -1
- package/build/__tests__/EntityPrivacyPolicy-test.js +82 -29
- package/build/__tests__/EntityPrivacyPolicy-test.js.map +1 -1
- package/build/__tests__/EntityQueryContext-test.js +12 -0
- package/build/__tests__/EntityQueryContext-test.js.map +1 -1
- package/build/__tests__/EntitySecondaryCacheLoader-test.js +1 -2
- package/build/__tests__/EntitySecondaryCacheLoader-test.js.map +1 -1
- package/build/__tests__/EntitySelfReferentialEdges-test.js +16 -20
- package/build/__tests__/EntitySelfReferentialEdges-test.js.map +1 -1
- package/build/__tests__/GenericEntityCacheAdapter-test.d.ts +1 -0
- package/build/__tests__/GenericEntityCacheAdapter-test.js +80 -0
- package/build/__tests__/GenericEntityCacheAdapter-test.js.map +1 -0
- package/build/__tests__/ReadonlyEntity-test.js +79 -13
- package/build/__tests__/ReadonlyEntity-test.js.map +1 -1
- package/build/__tests__/ViewerScopedEntityCompanionProvider-test.js +2 -25
- package/build/__tests__/ViewerScopedEntityCompanionProvider-test.js.map +1 -1
- package/build/__tests__/cases/TwoEntitySameTableDisjointRows-test.js +20 -23
- package/build/__tests__/cases/TwoEntitySameTableDisjointRows-test.js.map +1 -1
- package/build/__tests__/cases/TwoEntitySameTableOverlappingRows-test.js +17 -20
- package/build/__tests__/cases/TwoEntitySameTableOverlappingRows-test.js.map +1 -1
- package/build/errors/EntityError.js +2 -2
- package/build/errors/EntityError.js.map +1 -1
- package/build/errors/EntityInvalidFieldValueError.d.ts +2 -2
- package/build/errors/EntityInvalidFieldValueError.js.map +1 -1
- package/build/errors/EntityNotAuthorizedError.d.ts +2 -2
- package/build/errors/EntityNotAuthorizedError.js +1 -1
- package/build/errors/EntityNotAuthorizedError.js.map +1 -1
- package/build/errors/EntityNotFoundError.d.ts +2 -2
- package/build/errors/EntityNotFoundError.js.map +1 -1
- package/build/index.d.ts +2 -1
- package/build/index.js +3 -3
- package/build/index.js.map +1 -1
- package/build/internal/EntityDataManager.d.ts +1 -1
- package/build/internal/EntityDataManager.js +1 -1
- package/build/internal/EntityDataManager.js.map +1 -1
- package/build/internal/EntityFieldTransformationUtils.d.ts +1 -1
- package/build/internal/EntityFieldTransformationUtils.js +4 -4
- package/build/internal/EntityFieldTransformationUtils.js.map +1 -1
- package/build/internal/EntityTableDataCoordinator.d.ts +3 -3
- package/build/internal/EntityTableDataCoordinator.js.map +1 -1
- package/build/internal/ReadThroughEntityCache.d.ts +3 -3
- package/build/internal/ReadThroughEntityCache.js +1 -1
- package/build/internal/ReadThroughEntityCache.js.map +1 -1
- package/build/internal/__tests__/EntityDataManager-test.js +1 -1
- package/build/internal/__tests__/EntityDataManager-test.js.map +1 -1
- package/build/internal/__tests__/ReadThroughEntityCache-test.js.map +1 -1
- package/build/metrics/EntityMetricsUtils.js.map +1 -1
- package/build/metrics/IEntityMetricsAdapter.js +4 -4
- package/build/metrics/IEntityMetricsAdapter.js.map +1 -1
- package/build/rules/AlwaysAllowPrivacyPolicyRule.d.ts +2 -2
- package/build/rules/AlwaysAllowPrivacyPolicyRule.js.map +1 -1
- package/build/rules/AlwaysDenyPrivacyPolicyRule.d.ts +2 -2
- package/build/rules/AlwaysDenyPrivacyPolicyRule.js.map +1 -1
- package/build/rules/AlwaysSkipPrivacyPolicyRule.d.ts +2 -2
- package/build/rules/AlwaysSkipPrivacyPolicyRule.js.map +1 -1
- package/build/rules/PrivacyPolicyRule.d.ts +1 -1
- package/build/rules/PrivacyPolicyRule.js +1 -1
- package/build/rules/PrivacyPolicyRule.js.map +1 -1
- package/build/testfixtures/DateIDTestEntity.d.ts +2 -3
- package/build/testfixtures/DateIDTestEntity.js +7 -9
- package/build/testfixtures/DateIDTestEntity.js.map +1 -1
- package/build/testfixtures/SimpleTestEntity.d.ts +3 -4
- package/build/testfixtures/SimpleTestEntity.js +7 -9
- package/build/testfixtures/SimpleTestEntity.js.map +1 -1
- package/build/testfixtures/TestEntity.d.ts +2 -3
- package/build/testfixtures/TestEntity.js +14 -10
- package/build/testfixtures/TestEntity.js.map +1 -1
- package/build/testfixtures/TestEntity2.d.ts +2 -3
- package/build/testfixtures/TestEntity2.js +7 -9
- package/build/testfixtures/TestEntity2.js.map +1 -1
- package/build/testfixtures/TestEntityNumberKey.d.ts +2 -3
- package/build/testfixtures/TestEntityNumberKey.js +7 -9
- package/build/testfixtures/TestEntityNumberKey.js.map +1 -1
- package/build/utils/testing/PrivacyPolicyRuleTestUtils.d.ts +4 -4
- package/build/utils/testing/StubCacheAdapter.d.ts +6 -5
- package/build/utils/testing/StubCacheAdapter.js +5 -6
- package/build/utils/testing/StubCacheAdapter.js.map +1 -1
- package/build/utils/testing/StubDatabaseAdapterProvider.js.map +1 -1
- package/build/utils/testing/StubQueryContextProvider.d.ts +2 -1
- package/build/utils/testing/StubQueryContextProvider.js +1 -1
- package/build/utils/testing/StubQueryContextProvider.js.map +1 -1
- package/build/utils/testing/createUnitTestEntityCompanionProvider.js +2 -2
- package/build/utils/testing/createUnitTestEntityCompanionProvider.js.map +1 -1
- package/package.json +3 -3
- package/src/ComposedEntityCacheAdapter.ts +4 -11
- package/src/EnforcingEntityLoader.ts +10 -1
- package/src/Entity.ts +23 -12
- package/src/EntityAssociationLoader.ts +12 -12
- package/src/EntityCompanion.ts +13 -32
- package/src/EntityCompanionProvider.ts +41 -80
- package/src/EntityConfiguration.ts +4 -5
- package/src/EntityFieldDefinition.ts +2 -2
- package/src/EntityLoader.ts +36 -2
- package/src/EntityLoaderFactory.ts +7 -9
- package/src/EntityMutationInfo.ts +2 -2
- package/src/EntityMutationTriggerConfiguration.ts +3 -3
- package/src/EntityMutationValidator.ts +1 -1
- package/src/EntityMutator.ts +38 -31
- package/src/EntityMutatorFactory.ts +6 -1
- package/src/EntityPrivacyPolicy.ts +2 -2
- package/src/EntityQueryContext.ts +24 -4
- package/src/EntityQueryContextProvider.ts +7 -5
- package/src/EntitySecondaryCacheLoader.ts +1 -1
- package/src/GenericEntityCacheAdapter.ts +65 -0
- package/src/{EntityCacheAdapter.ts → IEntityCacheAdapter.ts} +5 -8
- package/src/IEntityCacheAdapterProvider.ts +2 -2
- package/src/IEntityGenericCacher.ts +32 -2
- package/src/ReadonlyEntity.ts +32 -32
- package/src/ViewerContext.ts +10 -8
- package/src/ViewerScopedEntityCompanion.ts +2 -2
- package/src/ViewerScopedEntityCompanionProvider.ts +4 -12
- package/src/ViewerScopedEntityLoaderFactory.ts +1 -1
- package/src/ViewerScopedEntityMutatorFactory.ts +1 -1
- package/src/__tests__/ComposedCacheAdapter-test.ts +6 -11
- package/src/__tests__/EnforcingEntityLoader-test.ts +44 -0
- package/src/__tests__/Entity-test.ts +42 -21
- package/src/__tests__/EntityCommonUseCases-test.ts +20 -22
- package/src/__tests__/EntityCompanion-test.ts +6 -9
- package/src/__tests__/EntityCompanionProvider-test.ts +14 -26
- package/src/__tests__/EntityEdges-test.ts +43 -49
- package/src/__tests__/EntityLoader-constructor-test.ts +16 -12
- package/src/__tests__/EntityLoader-test.ts +14 -1
- package/src/__tests__/EntityMutator-MutationCacheConsistency-test.ts +20 -22
- package/src/__tests__/EntityMutator-test.ts +119 -19
- package/src/__tests__/EntityPrivacyPolicy-test.ts +82 -29
- package/src/__tests__/EntityQueryContext-test.ts +23 -1
- package/src/__tests__/EntitySelfReferentialEdges-test.ts +8 -10
- package/src/__tests__/GenericEntityCacheAdapter-test.ts +102 -0
- package/src/__tests__/ReadonlyEntity-test.ts +79 -13
- package/src/__tests__/ViewerScopedEntityCompanionProvider-test.ts +2 -5
- package/src/__tests__/cases/TwoEntitySameTableDisjointRows-test.ts +30 -24
- package/src/__tests__/cases/TwoEntitySameTableOverlappingRows-test.ts +14 -18
- package/src/errors/EntityInvalidFieldValueError.ts +2 -2
- package/src/errors/EntityNotAuthorizedError.ts +2 -2
- package/src/errors/EntityNotFoundError.ts +2 -2
- package/src/index.ts +2 -1
- package/src/internal/EntityDataManager.ts +1 -1
- package/src/internal/EntityTableDataCoordinator.ts +4 -4
- package/src/internal/ReadThroughEntityCache.ts +2 -2
- package/src/internal/__tests__/EntityDataManager-test.ts +2 -1
- package/src/internal/__tests__/ReadThroughEntityCache-test.ts +8 -8
- package/src/metrics/EntityMetricsUtils.ts +1 -1
- package/src/rules/AlwaysAllowPrivacyPolicyRule.ts +2 -2
- package/src/rules/AlwaysDenyPrivacyPolicyRule.ts +2 -2
- package/src/rules/AlwaysSkipPrivacyPolicyRule.ts +2 -2
- package/src/rules/PrivacyPolicyRule.ts +1 -1
- package/src/testfixtures/DateIDTestEntity.ts +6 -8
- package/src/testfixtures/SimpleTestEntity.ts +6 -8
- package/src/testfixtures/TestEntity.ts +19 -15
- package/src/testfixtures/TestEntity2.ts +6 -8
- package/src/testfixtures/TestEntityNumberKey.ts +6 -8
- package/src/utils/testing/PrivacyPolicyRuleTestUtils.ts +4 -4
- package/src/utils/testing/StubCacheAdapter.ts +9 -11
- package/src/utils/testing/StubDatabaseAdapterProvider.ts +1 -1
- package/src/utils/testing/StubQueryContextProvider.ts +4 -3
- package/src/utils/testing/createUnitTestEntityCompanionProvider.ts +3 -3
- package/build/EntityCacheAdapter.js +0 -13
- 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(
|
|
91
|
-
|
|
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 (
|
|
99
|
+
} else if (constructorParams.selectedFields.id === ID_SENTINEL_THROW_ERROR) {
|
|
95
100
|
throw new Error('world');
|
|
96
101
|
}
|
|
97
|
-
super(
|
|
102
|
+
super(constructorParams);
|
|
98
103
|
}
|
|
99
104
|
|
|
100
|
-
static
|
|
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
|
|
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
|
|
37
|
+
static defineCompanionDefinition(): EntityCompanionDefinition<
|
|
38
38
|
BlahFields,
|
|
39
39
|
string,
|
|
40
40
|
ViewerContext,
|
|
41
41
|
BlahEntity,
|
|
42
42
|
BlahEntityPrivacyPolicy
|
|
43
43
|
> {
|
|
44
|
-
return
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
29
|
+
static defineCompanionDefinition(): EntityCompanionDefinition<
|
|
30
30
|
BlahFields,
|
|
31
31
|
string,
|
|
32
32
|
ViewerContext,
|
|
33
33
|
BlahEntity,
|
|
34
34
|
any
|
|
35
35
|
> {
|
|
36
|
-
return
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
});
|