@expo/entity 0.35.0 → 0.36.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/AuthorizationResultBasedEntityLoader.d.ts +128 -0
- package/build/AuthorizationResultBasedEntityLoader.js +196 -0
- package/build/AuthorizationResultBasedEntityLoader.js.map +1 -0
- package/build/ComposedEntityCacheAdapter.js +1 -0
- package/build/ComposedEntityCacheAdapter.js.map +1 -1
- package/build/ComposedSecondaryEntityCache.js +1 -0
- package/build/ComposedSecondaryEntityCache.js.map +1 -1
- package/build/EnforcingEntityLoader.d.ts +5 -4
- package/build/EnforcingEntityLoader.js +4 -2
- package/build/EnforcingEntityLoader.js.map +1 -1
- package/build/Entity.d.ts +0 -27
- package/build/Entity.js +0 -50
- package/build/Entity.js.map +1 -1
- package/build/EntityAssociationLoader.d.ts +1 -1
- package/build/EntityAssociationLoader.js +17 -8
- package/build/EntityAssociationLoader.js.map +1 -1
- package/build/EntityCompanion.js +9 -1
- package/build/EntityCompanion.js.map +1 -1
- package/build/EntityCompanionProvider.d.ts +3 -1
- package/build/EntityCompanionProvider.js +10 -4
- package/build/EntityCompanionProvider.js.map +1 -1
- package/build/EntityConfiguration.d.ts +2 -1
- package/build/EntityConfiguration.js +19 -1
- package/build/EntityConfiguration.js.map +1 -1
- package/build/EntityDatabaseAdapter.d.ts +2 -2
- package/build/EntityDatabaseAdapter.js +5 -3
- package/build/EntityDatabaseAdapter.js.map +1 -1
- package/build/EntityFieldDefinition.d.ts +21 -10
- package/build/EntityFieldDefinition.js +8 -9
- package/build/EntityFieldDefinition.js.map +1 -1
- package/build/EntityFields.d.ts +10 -0
- package/build/EntityFields.js +15 -1
- package/build/EntityFields.js.map +1 -1
- package/build/EntityLoader.d.ts +12 -125
- package/build/EntityLoader.js +24 -239
- package/build/EntityLoader.js.map +1 -1
- package/build/EntityLoaderFactory.d.ts +1 -1
- package/build/EntityLoaderFactory.js +3 -0
- package/build/EntityLoaderFactory.js.map +1 -1
- package/build/EntityLoaderUtils.d.ts +58 -0
- package/build/EntityLoaderUtils.js +109 -0
- package/build/EntityLoaderUtils.js.map +1 -0
- package/build/EntityMutator.d.ts +1 -0
- package/build/EntityMutator.js +71 -56
- package/build/EntityMutator.js.map +1 -1
- package/build/EntityMutatorFactory.js +9 -0
- package/build/EntityMutatorFactory.js.map +1 -1
- package/build/EntityPrivacyPolicy.d.ts +11 -5
- package/build/EntityPrivacyPolicy.js +5 -7
- package/build/EntityPrivacyPolicy.js.map +1 -1
- package/build/EntityQueryContext.d.ts +2 -1
- package/build/EntityQueryContext.js +11 -6
- package/build/EntityQueryContext.js.map +1 -1
- package/build/EntitySecondaryCacheLoader.js +5 -1
- package/build/EntitySecondaryCacheLoader.js.map +1 -1
- package/build/GenericEntityCacheAdapter.js +1 -0
- package/build/GenericEntityCacheAdapter.js.map +1 -1
- package/build/GenericSecondaryEntityCache.js +2 -0
- package/build/GenericSecondaryEntityCache.js.map +1 -1
- package/build/IEntityCacheAdapterProvider.d.ts +1 -1
- package/build/IEntityDatabaseAdapterProvider.d.ts +1 -1
- package/build/ReadonlyEntity.js +5 -1
- package/build/ReadonlyEntity.js.map +1 -1
- package/build/ViewerContext.js +2 -0
- package/build/ViewerContext.js.map +1 -1
- package/build/ViewerScopedEntityCompanion.js +2 -0
- package/build/ViewerScopedEntityCompanion.js.map +1 -1
- package/build/ViewerScopedEntityCompanionProvider.d.ts +0 -1
- package/build/ViewerScopedEntityCompanionProvider.js +2 -1
- package/build/ViewerScopedEntityCompanionProvider.js.map +1 -1
- package/build/ViewerScopedEntityLoaderFactory.d.ts +1 -1
- package/build/ViewerScopedEntityLoaderFactory.js +2 -0
- package/build/ViewerScopedEntityLoaderFactory.js.map +1 -1
- package/build/ViewerScopedEntityMutatorFactory.js +2 -0
- package/build/ViewerScopedEntityMutatorFactory.js.map +1 -1
- package/build/__tests__/ComposedCacheAdapter-test.js +2 -0
- package/build/__tests__/ComposedCacheAdapter-test.js.map +1 -1
- package/build/__tests__/ComposedSecondaryEntityCache-test.js +1 -0
- package/build/__tests__/ComposedSecondaryEntityCache-test.js.map +1 -1
- package/build/__tests__/EnforcingEntityLoader-test.js +101 -113
- package/build/__tests__/EnforcingEntityLoader-test.js.map +1 -1
- package/build/__tests__/Entity-test.js +0 -132
- package/build/__tests__/Entity-test.js.map +1 -1
- package/build/__tests__/EntityAssociationLoader-test.js +6 -2
- package/build/__tests__/EntityAssociationLoader-test.js.map +1 -1
- package/build/__tests__/EntityCommonUseCases-test.js +24 -22
- package/build/__tests__/EntityCommonUseCases-test.js.map +1 -1
- package/build/__tests__/EntityCompanion-test.js +26 -3
- package/build/__tests__/EntityCompanion-test.js.map +1 -1
- package/build/__tests__/EntityConfiguration-test.js +103 -0
- package/build/__tests__/EntityConfiguration-test.js.map +1 -0
- package/build/__tests__/EntityDatabaseAdapter-test.js +6 -0
- package/build/__tests__/EntityDatabaseAdapter-test.js.map +1 -1
- package/build/__tests__/EntityEdges-test.js +61 -20
- package/build/__tests__/EntityEdges-test.js.map +1 -1
- package/build/__tests__/EntityFields-test.js +6 -0
- package/build/__tests__/EntityFields-test.js.map +1 -1
- package/build/__tests__/EntityLoader-constructor-test.js +16 -17
- package/build/__tests__/EntityLoader-constructor-test.js.map +1 -1
- package/build/__tests__/EntityLoader-test.js +74 -22
- package/build/__tests__/EntityLoader-test.js.map +1 -1
- package/build/__tests__/EntityMutator-MutationCacheConsistency-test.js +12 -15
- package/build/__tests__/EntityMutator-MutationCacheConsistency-test.js.map +1 -1
- package/build/__tests__/EntityMutator-test.js +54 -9
- package/build/__tests__/EntityMutator-test.js.map +1 -1
- package/build/__tests__/EntityPrivacyPolicy-test.js +77 -59
- package/build/__tests__/EntityPrivacyPolicy-test.js.map +1 -1
- package/build/__tests__/EntityQueryContext-test.js +9 -0
- package/build/__tests__/EntityQueryContext-test.js.map +1 -1
- package/build/__tests__/EntitySelfReferentialEdges-test.js +42 -25
- package/build/__tests__/EntitySelfReferentialEdges-test.js.map +1 -1
- package/build/__tests__/ViewerScopedEntityLoaderFactory-test.js.map +1 -1
- package/build/__tests__/cases/TwoEntitySameTableDisjointRows-test.js +20 -18
- package/build/__tests__/cases/TwoEntitySameTableDisjointRows-test.js.map +1 -1
- package/build/__tests__/cases/TwoEntitySameTableOverlappingRows-test.js +12 -15
- package/build/__tests__/cases/TwoEntitySameTableOverlappingRows-test.js.map +1 -1
- package/build/entityUtils.d.ts +1 -1
- package/build/entityUtils.js.map +1 -1
- package/build/errors/EntityCacheAdapterError.js +2 -5
- package/build/errors/EntityCacheAdapterError.js.map +1 -1
- package/build/errors/EntityDatabaseAdapterError.js +14 -35
- package/build/errors/EntityDatabaseAdapterError.js.map +1 -1
- package/build/errors/EntityError.js +1 -0
- package/build/errors/EntityError.js.map +1 -1
- package/build/errors/EntityInvalidFieldValueError.js +2 -2
- package/build/errors/EntityInvalidFieldValueError.js.map +1 -1
- package/build/errors/EntityNotAuthorizedError.js +3 -2
- package/build/errors/EntityNotAuthorizedError.js.map +1 -1
- package/build/errors/EntityNotFoundError.js +2 -2
- package/build/errors/EntityNotFoundError.js.map +1 -1
- package/build/index.d.ts +1 -0
- package/build/index.js +1 -0
- package/build/index.js.map +1 -1
- package/build/internal/EntityDataManager.d.ts +1 -1
- package/build/internal/EntityDataManager.js +6 -1
- package/build/internal/EntityDataManager.js.map +1 -1
- package/build/internal/EntityFieldTransformationUtils.d.ts +5 -5
- package/build/internal/EntityFieldTransformationUtils.js +5 -8
- package/build/internal/EntityFieldTransformationUtils.js.map +1 -1
- package/build/internal/EntityTableDataCoordinator.d.ts +1 -1
- package/build/internal/EntityTableDataCoordinator.js +5 -0
- package/build/internal/EntityTableDataCoordinator.js.map +1 -1
- package/build/internal/ReadThroughEntityCache.d.ts +1 -1
- package/build/internal/ReadThroughEntityCache.js +2 -0
- package/build/internal/ReadThroughEntityCache.js.map +1 -1
- package/build/internal/__tests__/EntityFieldTransformationUtils-test.js +6 -2
- package/build/internal/__tests__/EntityFieldTransformationUtils-test.js.map +1 -1
- package/build/internal/__tests__/ReadThroughEntityCache-test.js +33 -0
- package/build/internal/__tests__/ReadThroughEntityCache-test.js.map +1 -1
- package/build/metrics/IEntityMetricsAdapter.d.ts +1 -1
- package/build/rules/AlwaysAllowPrivacyPolicyRule.d.ts +1 -1
- package/build/rules/AlwaysAllowPrivacyPolicyRule.js.map +1 -1
- package/build/rules/AlwaysDenyPrivacyPolicyRule.d.ts +1 -1
- package/build/rules/AlwaysDenyPrivacyPolicyRule.js.map +1 -1
- package/build/rules/AlwaysSkipPrivacyPolicyRule.d.ts +1 -1
- package/build/rules/AlwaysSkipPrivacyPolicyRule.js.map +1 -1
- package/build/rules/PrivacyPolicyRule.d.ts +1 -1
- package/build/rules/PrivacyPolicyRule.js.map +1 -1
- package/build/rules/__tests__/AlwaysAllowPrivacyPolicyRule-test.js.map +1 -1
- package/build/rules/__tests__/AlwaysDenyPrivacyPolicyRule-test.js.map +1 -1
- package/build/rules/__tests__/AlwaysSkipPrivacyPolicyRule-test.js.map +1 -1
- package/build/testfixtures/DateIDTestEntity.js +12 -15
- package/build/testfixtures/DateIDTestEntity.js.map +1 -1
- package/build/testfixtures/SimpleTestEntity.js +12 -15
- package/build/testfixtures/SimpleTestEntity.js.map +1 -1
- package/build/testfixtures/TestEntity.js +12 -15
- package/build/testfixtures/TestEntity.js.map +1 -1
- package/build/testfixtures/TestEntity2.js +12 -15
- package/build/testfixtures/TestEntity2.js.map +1 -1
- package/build/testfixtures/TestEntityNumberKey.js +12 -15
- package/build/testfixtures/TestEntityNumberKey.js.map +1 -1
- package/build/testfixtures/TestEntityWithMutationTriggers.d.ts +36 -0
- package/build/testfixtures/TestEntityWithMutationTriggers.js +82 -0
- package/build/testfixtures/TestEntityWithMutationTriggers.js.map +1 -0
- package/build/utils/EntityPrivacyUtils.d.ts +34 -0
- package/build/utils/EntityPrivacyUtils.js +160 -0
- package/build/utils/EntityPrivacyUtils.js.map +1 -0
- package/build/utils/__tests__/EntityPrivacyUtils-test.d.ts +1 -0
- package/build/utils/__tests__/EntityPrivacyUtils-test.js +395 -0
- package/build/utils/__tests__/EntityPrivacyUtils-test.js.map +1 -0
- package/build/utils/__tests__/mergeEntityMutationTriggerConfigurations-test.d.ts +1 -0
- package/build/utils/__tests__/mergeEntityMutationTriggerConfigurations-test.js +26 -0
- package/build/utils/__tests__/mergeEntityMutationTriggerConfigurations-test.js.map +1 -0
- package/build/utils/collections/maps.js.map +1 -1
- package/build/utils/mergeEntityMutationTriggerConfigurations.d.ts +4 -0
- package/build/utils/mergeEntityMutationTriggerConfigurations.js +28 -0
- package/build/utils/mergeEntityMutationTriggerConfigurations.js.map +1 -0
- package/build/utils/testing/PrivacyPolicyRuleTestUtils.d.ts +1 -1
- package/build/utils/testing/PrivacyPolicyRuleTestUtils.js.map +1 -1
- package/build/utils/testing/StubCacheAdapter.d.ts +3 -3
- package/build/utils/testing/StubCacheAdapter.js +3 -3
- package/build/utils/testing/StubCacheAdapter.js.map +1 -1
- package/build/utils/testing/StubDatabaseAdapter.d.ts +2 -2
- package/build/utils/testing/StubDatabaseAdapter.js +4 -2
- package/build/utils/testing/StubDatabaseAdapter.js.map +1 -1
- package/build/utils/testing/StubDatabaseAdapterProvider.d.ts +1 -1
- package/build/utils/testing/StubDatabaseAdapterProvider.js +1 -3
- package/build/utils/testing/StubDatabaseAdapterProvider.js.map +1 -1
- package/build/utils/testing/__tests__/PrivacyPolicyRuleTestUtils-test.d.ts +1 -0
- package/build/utils/testing/__tests__/PrivacyPolicyRuleTestUtils-test.js +42 -0
- package/build/utils/testing/__tests__/PrivacyPolicyRuleTestUtils-test.js.map +1 -0
- package/build/utils/testing/__tests__/StubDatabaseAdapter-test.js +53 -0
- package/build/utils/testing/__tests__/StubDatabaseAdapter-test.js.map +1 -1
- package/build/utils/testing/describeFieldTestCase.js.map +1 -1
- package/package.json +4 -3
- package/src/AuthorizationResultBasedEntityLoader.ts +297 -0
- package/src/ComposedEntityCacheAdapter.ts +6 -6
- package/src/ComposedSecondaryEntityCache.ts +8 -8
- package/src/EnforcingEntityLoader.ts +20 -19
- package/src/Entity.ts +11 -126
- package/src/EntityAssociationLoader.ts +40 -41
- package/src/EntityCompanion.ts +8 -4
- package/src/EntityCompanionProvider.ts +24 -16
- package/src/EntityConfiguration.ts +18 -7
- package/src/EntityDatabaseAdapter.ts +41 -41
- package/src/EntityFieldDefinition.ts +28 -18
- package/src/EntityFields.ts +15 -0
- package/src/EntityLoader.ts +63 -357
- package/src/EntityLoaderFactory.ts +10 -4
- package/src/EntityLoaderUtils.ts +149 -0
- package/src/EntityMutationInfo.ts +2 -2
- package/src/EntityMutationTriggerConfiguration.ts +5 -5
- package/src/EntityMutationValidator.ts +2 -2
- package/src/EntityMutator.ts +146 -144
- package/src/EntityMutatorFactory.ts +8 -8
- package/src/EntityPrivacyPolicy.ts +78 -28
- package/src/EntityQueryContext.ts +14 -13
- package/src/EntityQueryContextProvider.ts +5 -5
- package/src/EntitySecondaryCacheLoader.ts +13 -11
- package/src/GenericEntityCacheAdapter.ts +10 -10
- package/src/GenericSecondaryEntityCache.ts +6 -6
- package/src/IEntityCacheAdapter.ts +4 -4
- package/src/IEntityCacheAdapterProvider.ts +2 -2
- package/src/IEntityDatabaseAdapterProvider.ts +2 -2
- package/src/ReadonlyEntity.ts +5 -5
- package/src/ViewerContext.ts +5 -5
- package/src/ViewerScopedEntityCompanion.ts +4 -4
- package/src/ViewerScopedEntityCompanionProvider.ts +4 -5
- package/src/ViewerScopedEntityLoaderFactory.ts +10 -4
- package/src/ViewerScopedEntityMutatorFactory.ts +5 -5
- package/src/__tests__/ComposedCacheAdapter-test.ts +12 -10
- package/src/__tests__/ComposedSecondaryEntityCache-test.ts +8 -8
- package/src/__tests__/EnforcingEntityLoader-test.ts +236 -159
- package/src/__tests__/Entity-test.ts +0 -202
- package/src/__tests__/EntityAssociationLoader-test.ts +29 -25
- package/src/__tests__/EntityCommonUseCases-test.ts +29 -13
- package/src/__tests__/EntityCompanion-test.ts +57 -5
- package/src/__tests__/EntityConfiguration-test.ts +118 -0
- package/src/__tests__/EntityDatabaseAdapter-test.ts +11 -11
- package/src/__tests__/EntityEdges-test.ts +108 -36
- package/src/__tests__/EntityFields-test.ts +14 -2
- package/src/__tests__/EntityLoader-constructor-test.ts +20 -7
- package/src/__tests__/EntityLoader-test.ts +214 -86
- package/src/__tests__/EntityMutator-MutationCacheConsistency-test.ts +2 -2
- package/src/__tests__/EntityMutator-test.ts +281 -96
- package/src/__tests__/EntityPrivacyPolicy-test.ts +166 -53
- package/src/__tests__/EntityQueryContext-test.ts +30 -12
- package/src/__tests__/EntitySecondaryCacheLoader-test.ts +7 -7
- package/src/__tests__/EntitySelfReferentialEdges-test.ts +46 -26
- package/src/__tests__/GenericEntityCacheAdapter-test.ts +2 -2
- package/src/__tests__/ViewerContext-test.ts +1 -1
- package/src/__tests__/ViewerScopedEntityCompanion-test.ts +2 -2
- package/src/__tests__/ViewerScopedEntityCompanionProvider-test.ts +2 -2
- package/src/__tests__/ViewerScopedEntityLoaderFactory-test.ts +2 -1
- package/src/__tests__/cases/TwoEntitySameTableDisjointRows-test.ts +19 -19
- package/src/__tests__/entityUtils-test.ts +2 -2
- package/src/entityUtils.ts +4 -4
- package/src/errors/EntityError.ts +4 -1
- package/src/errors/EntityInvalidFieldValueError.ts +2 -2
- package/src/errors/EntityNotAuthorizedError.ts +3 -3
- package/src/errors/EntityNotFoundError.ts +2 -2
- package/src/index.ts +1 -0
- package/src/internal/EntityDataManager.ts +24 -24
- package/src/internal/EntityFieldTransformationUtils.ts +39 -32
- package/src/internal/EntityTableDataCoordinator.ts +3 -3
- package/src/internal/ReadThroughEntityCache.ts +9 -9
- package/src/internal/__tests__/EntityDataManager-test.ts +51 -51
- package/src/internal/__tests__/EntityFieldTransformationUtils-test.ts +14 -10
- package/src/internal/__tests__/ReadThroughEntityCache-test.ts +74 -18
- package/src/metrics/EntityMetricsUtils.ts +4 -4
- package/src/metrics/IEntityMetricsAdapter.ts +1 -1
- package/src/rules/AlwaysAllowPrivacyPolicyRule.ts +9 -3
- package/src/rules/AlwaysDenyPrivacyPolicyRule.ts +9 -3
- package/src/rules/AlwaysSkipPrivacyPolicyRule.ts +9 -3
- package/src/rules/PrivacyPolicyRule.ts +9 -3
- package/src/rules/__tests__/AlwaysAllowPrivacyPolicyRule-test.ts +2 -1
- package/src/rules/__tests__/AlwaysDenyPrivacyPolicyRule-test.ts +2 -1
- package/src/rules/__tests__/AlwaysSkipPrivacyPolicyRule-test.ts +2 -1
- package/src/testfixtures/TestEntity.ts +1 -1
- package/src/testfixtures/TestEntityWithMutationTriggers.ts +156 -0
- package/src/utils/EntityPrivacyUtils.ts +325 -0
- package/src/utils/__tests__/EntityPrivacyUtils-test.ts +570 -0
- package/src/utils/__tests__/mergeEntityMutationTriggerConfigurations-test.ts +29 -0
- package/src/utils/collections/__tests__/maps-test.ts +2 -2
- package/src/utils/collections/maps.ts +11 -11
- package/src/utils/mergeEntityMutationTriggerConfigurations.ts +44 -0
- package/src/utils/testing/PrivacyPolicyRuleTestUtils.ts +25 -22
- package/src/utils/testing/StubCacheAdapter.ts +17 -15
- package/src/utils/testing/StubDatabaseAdapter.ts +35 -30
- package/src/utils/testing/StubDatabaseAdapterProvider.ts +2 -2
- package/src/utils/testing/StubQueryContextProvider.ts +2 -2
- package/src/utils/testing/__tests__/PrivacyPolicyRuleTestUtils-test.ts +42 -0
- package/src/utils/testing/__tests__/StubDatabaseAdapter-test.ts +111 -29
- package/src/utils/testing/createUnitTestEntityCompanionProvider.ts +2 -2
- package/src/utils/testing/describeFieldTestCase.ts +1 -1
- package/build/__tests__/EntityDataConfiguration-test.js +0 -68
- package/build/__tests__/EntityDataConfiguration-test.js.map +0 -1
- package/src/__tests__/EntityDataConfiguration-test.ts +0 -77
- /package/build/__tests__/{EntityDataConfiguration-test.d.ts → EntityConfiguration-test.d.ts} +0 -0
|
@@ -7,6 +7,7 @@ import EntityLoader from '../EntityLoader';
|
|
|
7
7
|
import { EntityPrivacyPolicyEvaluationContext } from '../EntityPrivacyPolicy';
|
|
8
8
|
import ViewerContext from '../ViewerContext';
|
|
9
9
|
import { enforceResultsAsync } from '../entityUtils';
|
|
10
|
+
import EntityNotFoundError from '../errors/EntityNotFoundError';
|
|
10
11
|
import EntityDataManager from '../internal/EntityDataManager';
|
|
11
12
|
import ReadThroughEntityCache from '../internal/ReadThroughEntityCache';
|
|
12
13
|
import IEntityMetricsAdapter from '../metrics/IEntityMetricsAdapter';
|
|
@@ -23,7 +24,10 @@ describe(EntityLoader, () => {
|
|
|
23
24
|
it('loads entities', async () => {
|
|
24
25
|
const dateToInsert = new Date();
|
|
25
26
|
const viewerContext = instance(mock(ViewerContext));
|
|
26
|
-
const privacyPolicyEvaluationContext =
|
|
27
|
+
const privacyPolicyEvaluationContext =
|
|
28
|
+
instance(
|
|
29
|
+
mock<EntityPrivacyPolicyEvaluationContext<TestFields, string, ViewerContext, TestEntity>>(),
|
|
30
|
+
);
|
|
27
31
|
const metricsAdapter = instance(mock<IEntityMetricsAdapter>());
|
|
28
32
|
const queryContext = StubQueryContextProvider.getQueryContext();
|
|
29
33
|
|
|
@@ -55,8 +59,8 @@ describe(EntityLoader, () => {
|
|
|
55
59
|
},
|
|
56
60
|
],
|
|
57
61
|
],
|
|
58
|
-
])
|
|
59
|
-
)
|
|
62
|
+
]),
|
|
63
|
+
),
|
|
60
64
|
);
|
|
61
65
|
const privacyPolicy = new TestEntityPrivacyPolicy();
|
|
62
66
|
const cacheAdapterProvider = new NoCacheStubCacheAdapterProvider();
|
|
@@ -67,7 +71,7 @@ describe(EntityLoader, () => {
|
|
|
67
71
|
entityCache,
|
|
68
72
|
StubQueryContextProvider,
|
|
69
73
|
instance(mock<IEntityMetricsAdapter>()),
|
|
70
|
-
TestEntity.name
|
|
74
|
+
TestEntity.name,
|
|
71
75
|
);
|
|
72
76
|
const entityLoader = new EntityLoader(
|
|
73
77
|
viewerContext,
|
|
@@ -78,22 +82,28 @@ describe(EntityLoader, () => {
|
|
|
78
82
|
/* entitySelectedFields */ undefined,
|
|
79
83
|
privacyPolicy,
|
|
80
84
|
dataManager,
|
|
81
|
-
metricsAdapter
|
|
85
|
+
metricsAdapter,
|
|
86
|
+
);
|
|
87
|
+
const entity = await enforceAsyncResult(
|
|
88
|
+
entityLoader.withAuthorizationResults().loadByIDAsync(id1),
|
|
82
89
|
);
|
|
83
|
-
const entity = await enforceAsyncResult(entityLoader.loadByIDAsync(id1));
|
|
84
90
|
expect(entity.getID()).toEqual(id1);
|
|
85
91
|
expect(entity.getField('dateField')).toEqual(dateToInsert);
|
|
86
92
|
|
|
87
93
|
const entities = await enforceResultsAsync(
|
|
88
|
-
entityLoader.loadManyByFieldEqualingAsync('stringField', 'huh')
|
|
94
|
+
entityLoader.withAuthorizationResults().loadManyByFieldEqualingAsync('stringField', 'huh'),
|
|
89
95
|
);
|
|
90
96
|
expect(entities.map((m) => m.getID())).toEqual([id1, id2]);
|
|
91
97
|
|
|
92
|
-
const entityResultNumber3 = await entityLoader
|
|
98
|
+
const entityResultNumber3 = await entityLoader
|
|
99
|
+
.withAuthorizationResults()
|
|
100
|
+
.loadByFieldEqualingAsync('intField', 3);
|
|
93
101
|
expect(entityResultNumber3).not.toBeNull();
|
|
94
102
|
expect(entityResultNumber3!.enforceValue().getID()).toEqual(id2);
|
|
95
103
|
|
|
96
|
-
const entityResultNumber4 = await entityLoader
|
|
104
|
+
const entityResultNumber4 = await entityLoader
|
|
105
|
+
.withAuthorizationResults()
|
|
106
|
+
.loadByFieldEqualingAsync('intField', 4);
|
|
97
107
|
expect(entityResultNumber4).toBeNull();
|
|
98
108
|
|
|
99
109
|
const entityResultDuplicateValues = await entityLoader
|
|
@@ -102,23 +112,43 @@ describe(EntityLoader, () => {
|
|
|
102
112
|
expect(entityResultDuplicateValues.size).toBe(1);
|
|
103
113
|
expect(entityResultDuplicateValues.get('huh')?.map((m) => m.getID())).toEqual([id1, id2]);
|
|
104
114
|
|
|
105
|
-
await expect(
|
|
106
|
-
'
|
|
115
|
+
await expect(
|
|
116
|
+
entityLoader.withAuthorizationResults().loadByFieldEqualingAsync('stringField', 'huh'),
|
|
117
|
+
).rejects.toThrowError(
|
|
118
|
+
'loadByFieldEqualing: Multiple entities of type TestEntity found for stringField=huh',
|
|
107
119
|
);
|
|
108
120
|
|
|
109
|
-
await expect(
|
|
110
|
-
|
|
121
|
+
await expect(
|
|
122
|
+
entityLoader.withAuthorizationResults().loadByIDNullableAsync(uuidv4()),
|
|
123
|
+
).resolves.toBeNull();
|
|
124
|
+
await expect(
|
|
125
|
+
entityLoader.withAuthorizationResults().loadByIDNullableAsync(id1),
|
|
126
|
+
).resolves.not.toBeNull();
|
|
111
127
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
128
|
+
const nonExistentId = uuidv4();
|
|
129
|
+
const manyIdResults = await entityLoader
|
|
130
|
+
.withAuthorizationResults()
|
|
131
|
+
.loadManyByIDsNullableAsync([nonExistentId, id1]);
|
|
132
|
+
expect(manyIdResults.get(nonExistentId)).toBeNull();
|
|
133
|
+
expect(manyIdResults.get(id1)).not.toBeNull();
|
|
134
|
+
|
|
135
|
+
await expect(
|
|
136
|
+
enforceAsyncResult(entityLoader.withAuthorizationResults().loadByIDAsync(nonExistentId)),
|
|
137
|
+
).rejects.toThrow(EntityNotFoundError);
|
|
138
|
+
|
|
139
|
+
await expect(
|
|
140
|
+
entityLoader.withAuthorizationResults().loadByIDAsync('not-a-uuid'),
|
|
141
|
+
).rejects.toThrowError('Entity field not valid: TestEntity (customIdField = not-a-uuid)');
|
|
115
142
|
});
|
|
116
143
|
|
|
117
144
|
it('loads entities with loadManyByFieldEqualityConjunction', async () => {
|
|
118
145
|
const privacyPolicy = new TestEntityPrivacyPolicy();
|
|
119
146
|
const spiedPrivacyPolicy = spy(privacyPolicy);
|
|
120
147
|
const viewerContext = instance(mock(ViewerContext));
|
|
121
|
-
const privacyPolicyEvaluationContext =
|
|
148
|
+
const privacyPolicyEvaluationContext =
|
|
149
|
+
instance(
|
|
150
|
+
mock<EntityPrivacyPolicyEvaluationContext<TestFields, string, ViewerContext, TestEntity>>(),
|
|
151
|
+
);
|
|
122
152
|
const metricsAdapter = instance(mock<IEntityMetricsAdapter>());
|
|
123
153
|
const queryContext = StubQueryContextProvider.getQueryContext();
|
|
124
154
|
|
|
@@ -159,8 +189,8 @@ describe(EntityLoader, () => {
|
|
|
159
189
|
},
|
|
160
190
|
],
|
|
161
191
|
],
|
|
162
|
-
])
|
|
163
|
-
)
|
|
192
|
+
]),
|
|
193
|
+
),
|
|
164
194
|
);
|
|
165
195
|
const cacheAdapterProvider = new NoCacheStubCacheAdapterProvider();
|
|
166
196
|
const cacheAdapter = cacheAdapterProvider.getCacheAdapter(testEntityConfiguration);
|
|
@@ -170,7 +200,7 @@ describe(EntityLoader, () => {
|
|
|
170
200
|
entityCache,
|
|
171
201
|
StubQueryContextProvider,
|
|
172
202
|
instance(mock<IEntityMetricsAdapter>()),
|
|
173
|
-
TestEntity.name
|
|
203
|
+
TestEntity.name,
|
|
174
204
|
);
|
|
175
205
|
const entityLoader = new EntityLoader(
|
|
176
206
|
viewerContext,
|
|
@@ -181,19 +211,19 @@ describe(EntityLoader, () => {
|
|
|
181
211
|
/* entitySelectedFields */ undefined,
|
|
182
212
|
privacyPolicy,
|
|
183
213
|
dataManager,
|
|
184
|
-
metricsAdapter
|
|
214
|
+
metricsAdapter,
|
|
185
215
|
);
|
|
186
216
|
const entities = await enforceResultsAsync(
|
|
187
|
-
entityLoader.loadManyByFieldEqualityConjunctionAsync([
|
|
217
|
+
entityLoader.withAuthorizationResults().loadManyByFieldEqualityConjunctionAsync([
|
|
188
218
|
{
|
|
189
219
|
fieldName: 'stringField',
|
|
190
220
|
fieldValue: 'huh',
|
|
191
221
|
},
|
|
192
222
|
{
|
|
193
223
|
fieldName: 'intField',
|
|
194
|
-
|
|
224
|
+
fieldValues: [4],
|
|
195
225
|
},
|
|
196
|
-
])
|
|
226
|
+
]),
|
|
197
227
|
);
|
|
198
228
|
expect(entities).toHaveLength(2);
|
|
199
229
|
verify(
|
|
@@ -202,14 +232,16 @@ describe(EntityLoader, () => {
|
|
|
202
232
|
queryContext,
|
|
203
233
|
privacyPolicyEvaluationContext,
|
|
204
234
|
anyOfClass(TestEntity),
|
|
205
|
-
anything()
|
|
206
|
-
)
|
|
235
|
+
anything(),
|
|
236
|
+
),
|
|
207
237
|
).twice();
|
|
208
238
|
|
|
209
239
|
await expect(
|
|
210
|
-
entityLoader
|
|
211
|
-
|
|
212
|
-
|
|
240
|
+
entityLoader
|
|
241
|
+
.withAuthorizationResults()
|
|
242
|
+
.loadManyByFieldEqualityConjunctionAsync([
|
|
243
|
+
{ fieldName: 'customIdField', fieldValue: 'not-a-uuid' },
|
|
244
|
+
]),
|
|
213
245
|
).rejects.toThrowError('Entity field not valid: TestEntity (customIdField = not-a-uuid)');
|
|
214
246
|
});
|
|
215
247
|
|
|
@@ -217,7 +249,10 @@ describe(EntityLoader, () => {
|
|
|
217
249
|
const privacyPolicy = new TestEntityPrivacyPolicy();
|
|
218
250
|
const spiedPrivacyPolicy = spy(privacyPolicy);
|
|
219
251
|
const viewerContext = instance(mock(ViewerContext));
|
|
220
|
-
const privacyPolicyEvaluationContext =
|
|
252
|
+
const privacyPolicyEvaluationContext =
|
|
253
|
+
instance(
|
|
254
|
+
mock<EntityPrivacyPolicyEvaluationContext<TestFields, string, ViewerContext, TestEntity>>(),
|
|
255
|
+
);
|
|
221
256
|
const metricsAdapter = instance(mock<IEntityMetricsAdapter>());
|
|
222
257
|
const queryContext = StubQueryContextProvider.getQueryContext();
|
|
223
258
|
|
|
@@ -258,8 +293,8 @@ describe(EntityLoader, () => {
|
|
|
258
293
|
},
|
|
259
294
|
],
|
|
260
295
|
],
|
|
261
|
-
])
|
|
262
|
-
)
|
|
296
|
+
]),
|
|
297
|
+
),
|
|
263
298
|
);
|
|
264
299
|
const cacheAdapterProvider = new NoCacheStubCacheAdapterProvider();
|
|
265
300
|
const cacheAdapter = cacheAdapterProvider.getCacheAdapter(testEntityConfiguration);
|
|
@@ -269,7 +304,7 @@ describe(EntityLoader, () => {
|
|
|
269
304
|
entityCache,
|
|
270
305
|
StubQueryContextProvider,
|
|
271
306
|
instance(mock<IEntityMetricsAdapter>()),
|
|
272
|
-
TestEntity.name
|
|
307
|
+
TestEntity.name,
|
|
273
308
|
);
|
|
274
309
|
const entityLoader = new EntityLoader(
|
|
275
310
|
viewerContext,
|
|
@@ -280,21 +315,23 @@ describe(EntityLoader, () => {
|
|
|
280
315
|
/* entitySelectedFields */ undefined,
|
|
281
316
|
privacyPolicy,
|
|
282
317
|
dataManager,
|
|
283
|
-
metricsAdapter
|
|
284
|
-
);
|
|
285
|
-
const result = await entityLoader.loadFirstByFieldEqualityConjunctionAsync(
|
|
286
|
-
[
|
|
287
|
-
{
|
|
288
|
-
fieldName: 'stringField',
|
|
289
|
-
fieldValue: 'huh',
|
|
290
|
-
},
|
|
291
|
-
{
|
|
292
|
-
fieldName: 'intField',
|
|
293
|
-
fieldValue: 4,
|
|
294
|
-
},
|
|
295
|
-
],
|
|
296
|
-
{ orderBy: [{ fieldName: 'testIndexedField', order: OrderByOrdering.DESCENDING }] }
|
|
318
|
+
metricsAdapter,
|
|
297
319
|
);
|
|
320
|
+
const result = await entityLoader
|
|
321
|
+
.withAuthorizationResults()
|
|
322
|
+
.loadFirstByFieldEqualityConjunctionAsync(
|
|
323
|
+
[
|
|
324
|
+
{
|
|
325
|
+
fieldName: 'stringField',
|
|
326
|
+
fieldValue: 'huh',
|
|
327
|
+
},
|
|
328
|
+
{
|
|
329
|
+
fieldName: 'intField',
|
|
330
|
+
fieldValue: 4,
|
|
331
|
+
},
|
|
332
|
+
],
|
|
333
|
+
{ orderBy: [{ fieldName: 'testIndexedField', order: OrderByOrdering.DESCENDING }] },
|
|
334
|
+
);
|
|
298
335
|
expect(result).not.toBeNull();
|
|
299
336
|
expect(result!.ok).toBe(true);
|
|
300
337
|
expect(result!.enforceValue().getField('testIndexedField')).toEqual('5');
|
|
@@ -304,8 +341,69 @@ describe(EntityLoader, () => {
|
|
|
304
341
|
queryContext,
|
|
305
342
|
privacyPolicyEvaluationContext,
|
|
306
343
|
anyOfClass(TestEntity),
|
|
307
|
-
anything()
|
|
308
|
-
)
|
|
344
|
+
anything(),
|
|
345
|
+
),
|
|
346
|
+
).once();
|
|
347
|
+
});
|
|
348
|
+
|
|
349
|
+
it('loads entities with loadManyByRawWhereClauseAsync', async () => {
|
|
350
|
+
const privacyPolicy = new TestEntityPrivacyPolicy();
|
|
351
|
+
const spiedPrivacyPolicy = spy(privacyPolicy);
|
|
352
|
+
const viewerContext = instance(mock(ViewerContext));
|
|
353
|
+
const privacyPolicyEvaluationContext =
|
|
354
|
+
instance(
|
|
355
|
+
mock<EntityPrivacyPolicyEvaluationContext<TestFields, string, ViewerContext, TestEntity>>(),
|
|
356
|
+
);
|
|
357
|
+
const metricsAdapter = instance(mock<IEntityMetricsAdapter>());
|
|
358
|
+
const queryContext = StubQueryContextProvider.getQueryContext();
|
|
359
|
+
|
|
360
|
+
const dataManagerMock = mock<EntityDataManager<TestFields>>(EntityDataManager);
|
|
361
|
+
when(
|
|
362
|
+
dataManagerMock.loadManyByRawWhereClauseAsync(
|
|
363
|
+
queryContext,
|
|
364
|
+
anything(),
|
|
365
|
+
anything(),
|
|
366
|
+
anything(),
|
|
367
|
+
),
|
|
368
|
+
).thenResolve([
|
|
369
|
+
{
|
|
370
|
+
customIdField: 'id',
|
|
371
|
+
stringField: 'huh',
|
|
372
|
+
intField: 4,
|
|
373
|
+
testIndexedField: '4',
|
|
374
|
+
dateField: new Date(),
|
|
375
|
+
nullableField: null,
|
|
376
|
+
},
|
|
377
|
+
]);
|
|
378
|
+
const dataManager = instance(dataManagerMock);
|
|
379
|
+
const entityLoader = new EntityLoader(
|
|
380
|
+
viewerContext,
|
|
381
|
+
queryContext,
|
|
382
|
+
privacyPolicyEvaluationContext,
|
|
383
|
+
testEntityConfiguration,
|
|
384
|
+
TestEntity,
|
|
385
|
+
/* entitySelectedFields */ undefined,
|
|
386
|
+
privacyPolicy,
|
|
387
|
+
dataManager,
|
|
388
|
+
metricsAdapter,
|
|
389
|
+
);
|
|
390
|
+
const result = await entityLoader
|
|
391
|
+
.withAuthorizationResults()
|
|
392
|
+
.loadManyByRawWhereClauseAsync('id = ?', [1], {
|
|
393
|
+
orderBy: [{ fieldName: 'testIndexedField', order: OrderByOrdering.DESCENDING }],
|
|
394
|
+
});
|
|
395
|
+
expect(result).toHaveLength(1);
|
|
396
|
+
expect(result[0]).not.toBeNull();
|
|
397
|
+
expect(result[0]!.ok).toBe(true);
|
|
398
|
+
expect(result[0]!.enforceValue().getField('testIndexedField')).toEqual('4');
|
|
399
|
+
verify(
|
|
400
|
+
spiedPrivacyPolicy.authorizeReadAsync(
|
|
401
|
+
viewerContext,
|
|
402
|
+
queryContext,
|
|
403
|
+
privacyPolicyEvaluationContext,
|
|
404
|
+
anyOfClass(TestEntity),
|
|
405
|
+
anything(),
|
|
406
|
+
),
|
|
309
407
|
).once();
|
|
310
408
|
});
|
|
311
409
|
|
|
@@ -314,7 +412,10 @@ describe(EntityLoader, () => {
|
|
|
314
412
|
const spiedPrivacyPolicy = spy(privacyPolicy);
|
|
315
413
|
|
|
316
414
|
const viewerContext = instance(mock(ViewerContext));
|
|
317
|
-
const privacyPolicyEvaluationContext =
|
|
415
|
+
const privacyPolicyEvaluationContext =
|
|
416
|
+
instance(
|
|
417
|
+
mock<EntityPrivacyPolicyEvaluationContext<TestFields, string, ViewerContext, TestEntity>>(),
|
|
418
|
+
);
|
|
318
419
|
const metricsAdapter = instance(mock<IEntityMetricsAdapter>());
|
|
319
420
|
const queryContext = StubQueryContextProvider.getQueryContext();
|
|
320
421
|
|
|
@@ -337,8 +438,8 @@ describe(EntityLoader, () => {
|
|
|
337
438
|
},
|
|
338
439
|
],
|
|
339
440
|
],
|
|
340
|
-
])
|
|
341
|
-
)
|
|
441
|
+
]),
|
|
442
|
+
),
|
|
342
443
|
);
|
|
343
444
|
const cacheAdapterProvider = new NoCacheStubCacheAdapterProvider();
|
|
344
445
|
const cacheAdapter = cacheAdapterProvider.getCacheAdapter(testEntityConfiguration);
|
|
@@ -348,7 +449,7 @@ describe(EntityLoader, () => {
|
|
|
348
449
|
entityCache,
|
|
349
450
|
StubQueryContextProvider,
|
|
350
451
|
instance(mock<IEntityMetricsAdapter>()),
|
|
351
|
-
TestEntity.name
|
|
452
|
+
TestEntity.name,
|
|
352
453
|
);
|
|
353
454
|
const entityLoader = new EntityLoader(
|
|
354
455
|
viewerContext,
|
|
@@ -359,23 +460,28 @@ describe(EntityLoader, () => {
|
|
|
359
460
|
/* entitySelectedFields */ undefined,
|
|
360
461
|
privacyPolicy,
|
|
361
462
|
dataManager,
|
|
362
|
-
metricsAdapter
|
|
463
|
+
metricsAdapter,
|
|
464
|
+
);
|
|
465
|
+
const entity = await enforceAsyncResult(
|
|
466
|
+
entityLoader.withAuthorizationResults().loadByIDAsync(id1),
|
|
363
467
|
);
|
|
364
|
-
const entity = await enforceAsyncResult(entityLoader.loadByIDAsync(id1));
|
|
365
468
|
verify(
|
|
366
469
|
spiedPrivacyPolicy.authorizeReadAsync(
|
|
367
470
|
viewerContext,
|
|
368
471
|
queryContext,
|
|
369
472
|
privacyPolicyEvaluationContext,
|
|
370
473
|
entity,
|
|
371
|
-
anything()
|
|
372
|
-
)
|
|
474
|
+
anything(),
|
|
475
|
+
),
|
|
373
476
|
).once();
|
|
374
477
|
});
|
|
375
478
|
|
|
376
479
|
it('invalidates upon invalidate one', async () => {
|
|
377
480
|
const viewerContext = instance(mock(ViewerContext));
|
|
378
|
-
const privacyPolicyEvaluationContext =
|
|
481
|
+
const privacyPolicyEvaluationContext =
|
|
482
|
+
instance(
|
|
483
|
+
mock<EntityPrivacyPolicyEvaluationContext<TestFields, string, ViewerContext, TestEntity>>(),
|
|
484
|
+
);
|
|
379
485
|
const metricsAdapter = instance(mock<IEntityMetricsAdapter>());
|
|
380
486
|
const queryContext = StubQueryContextProvider.getQueryContext();
|
|
381
487
|
const privacyPolicy = instance(mock(TestEntityPrivacyPolicy));
|
|
@@ -392,18 +498,21 @@ describe(EntityLoader, () => {
|
|
|
392
498
|
/* entitySelectedFields */ undefined,
|
|
393
499
|
privacyPolicy,
|
|
394
500
|
dataManagerInstance,
|
|
395
|
-
metricsAdapter
|
|
501
|
+
metricsAdapter,
|
|
396
502
|
);
|
|
397
|
-
await entityLoader.invalidateFieldsAsync({ customIdField: id1 } as any);
|
|
503
|
+
await entityLoader.utils().invalidateFieldsAsync({ customIdField: id1 } as any);
|
|
398
504
|
|
|
399
505
|
verify(
|
|
400
|
-
dataManagerMock.invalidateObjectFieldsAsync(deepEqual({ customIdField: id1 } as any))
|
|
506
|
+
dataManagerMock.invalidateObjectFieldsAsync(deepEqual({ customIdField: id1 } as any)),
|
|
401
507
|
).once();
|
|
402
508
|
});
|
|
403
509
|
|
|
404
510
|
it('invalidates upon invalidate by field', async () => {
|
|
405
511
|
const viewerContext = instance(mock(ViewerContext));
|
|
406
|
-
const privacyPolicyEvaluationContext =
|
|
512
|
+
const privacyPolicyEvaluationContext =
|
|
513
|
+
instance(
|
|
514
|
+
mock<EntityPrivacyPolicyEvaluationContext<TestFields, string, ViewerContext, TestEntity>>(),
|
|
515
|
+
);
|
|
407
516
|
const metricsAdapter = instance(mock<IEntityMetricsAdapter>());
|
|
408
517
|
const queryContext = StubQueryContextProvider.getQueryContext();
|
|
409
518
|
const privacyPolicy = instance(mock(TestEntityPrivacyPolicy));
|
|
@@ -420,17 +529,20 @@ describe(EntityLoader, () => {
|
|
|
420
529
|
/* entitySelectedFields */ undefined,
|
|
421
530
|
privacyPolicy,
|
|
422
531
|
dataManagerInstance,
|
|
423
|
-
metricsAdapter
|
|
532
|
+
metricsAdapter,
|
|
424
533
|
);
|
|
425
|
-
await entityLoader.invalidateFieldsAsync({ customIdField: id1 } as any);
|
|
534
|
+
await entityLoader.utils().invalidateFieldsAsync({ customIdField: id1 } as any);
|
|
426
535
|
verify(
|
|
427
|
-
dataManagerMock.invalidateObjectFieldsAsync(deepEqual({ customIdField: id1 } as any))
|
|
536
|
+
dataManagerMock.invalidateObjectFieldsAsync(deepEqual({ customIdField: id1 } as any)),
|
|
428
537
|
).once();
|
|
429
538
|
});
|
|
430
539
|
|
|
431
540
|
it('invalidates upon invalidate by entity', async () => {
|
|
432
541
|
const viewerContext = instance(mock(ViewerContext));
|
|
433
|
-
const privacyPolicyEvaluationContext =
|
|
542
|
+
const privacyPolicyEvaluationContext =
|
|
543
|
+
instance(
|
|
544
|
+
mock<EntityPrivacyPolicyEvaluationContext<TestFields, string, ViewerContext, TestEntity>>(),
|
|
545
|
+
);
|
|
434
546
|
const metricsAdapter = instance(mock<IEntityMetricsAdapter>());
|
|
435
547
|
const queryContext = StubQueryContextProvider.getQueryContext();
|
|
436
548
|
const privacyPolicy = instance(mock(TestEntityPrivacyPolicy));
|
|
@@ -451,17 +563,20 @@ describe(EntityLoader, () => {
|
|
|
451
563
|
/* entitySelectedFields */ undefined,
|
|
452
564
|
privacyPolicy,
|
|
453
565
|
dataManagerInstance,
|
|
454
|
-
metricsAdapter
|
|
566
|
+
metricsAdapter,
|
|
455
567
|
);
|
|
456
|
-
await entityLoader.invalidateEntityAsync(entityInstance);
|
|
568
|
+
await entityLoader.utils().invalidateEntityAsync(entityInstance);
|
|
457
569
|
verify(
|
|
458
|
-
dataManagerMock.invalidateObjectFieldsAsync(deepEqual({ customIdField: id1 } as any))
|
|
570
|
+
dataManagerMock.invalidateObjectFieldsAsync(deepEqual({ customIdField: id1 } as any)),
|
|
459
571
|
).once();
|
|
460
572
|
});
|
|
461
573
|
|
|
462
574
|
it('returns error result when not allowed', async () => {
|
|
463
575
|
const viewerContext = instance(mock(ViewerContext));
|
|
464
|
-
const privacyPolicyEvaluationContext =
|
|
576
|
+
const privacyPolicyEvaluationContext =
|
|
577
|
+
instance(
|
|
578
|
+
mock<EntityPrivacyPolicyEvaluationContext<TestFields, string, ViewerContext, TestEntity>>(),
|
|
579
|
+
);
|
|
465
580
|
const metricsAdapter = instance(mock<IEntityMetricsAdapter>());
|
|
466
581
|
const queryContext = StubQueryContextProvider.getQueryContext();
|
|
467
582
|
const privacyPolicyMock = mock(TestEntityPrivacyPolicy);
|
|
@@ -469,7 +584,7 @@ describe(EntityLoader, () => {
|
|
|
469
584
|
|
|
470
585
|
const id1 = uuidv4();
|
|
471
586
|
when(
|
|
472
|
-
dataManagerMock.loadManyByFieldEqualingAsync(anything(), anything(), anything())
|
|
587
|
+
dataManagerMock.loadManyByFieldEqualingAsync(anything(), anything(), anything()),
|
|
473
588
|
).thenResolve(new Map().set(id1, [{ customIdField: id1 }]));
|
|
474
589
|
|
|
475
590
|
const rejectionError = new Error();
|
|
@@ -480,8 +595,8 @@ describe(EntityLoader, () => {
|
|
|
480
595
|
queryContext,
|
|
481
596
|
privacyPolicyEvaluationContext,
|
|
482
597
|
anyOfClass(TestEntity),
|
|
483
|
-
anything()
|
|
484
|
-
)
|
|
598
|
+
anything(),
|
|
599
|
+
),
|
|
485
600
|
).thenReject(rejectionError);
|
|
486
601
|
|
|
487
602
|
const privacyPolicy = instance(privacyPolicyMock);
|
|
@@ -496,10 +611,10 @@ describe(EntityLoader, () => {
|
|
|
496
611
|
/* entitySelectedFields */ undefined,
|
|
497
612
|
privacyPolicy,
|
|
498
613
|
dataManagerInstance,
|
|
499
|
-
metricsAdapter
|
|
614
|
+
metricsAdapter,
|
|
500
615
|
);
|
|
501
616
|
|
|
502
|
-
const entityResult = await entityLoader.loadByIDAsync(id1);
|
|
617
|
+
const entityResult = await entityLoader.withAuthorizationResults().loadByIDAsync(id1);
|
|
503
618
|
expect(entityResult.ok).toBe(false);
|
|
504
619
|
expect(entityResult.reason).toEqual(rejectionError);
|
|
505
620
|
expect(entityResult.value).toBe(undefined);
|
|
@@ -507,7 +622,10 @@ describe(EntityLoader, () => {
|
|
|
507
622
|
|
|
508
623
|
it('throws upon database adapter error', async () => {
|
|
509
624
|
const viewerContext = instance(mock(ViewerContext));
|
|
510
|
-
const privacyPolicyEvaluationContext =
|
|
625
|
+
const privacyPolicyEvaluationContext =
|
|
626
|
+
instance(
|
|
627
|
+
mock<EntityPrivacyPolicyEvaluationContext<TestFields, string, ViewerContext, TestEntity>>(),
|
|
628
|
+
);
|
|
511
629
|
const metricsAdapter = instance(mock<IEntityMetricsAdapter>());
|
|
512
630
|
const queryContext = StubQueryContextProvider.getQueryContext();
|
|
513
631
|
const privacyPolicy = instance(mock(TestEntityPrivacyPolicy));
|
|
@@ -516,7 +634,7 @@ describe(EntityLoader, () => {
|
|
|
516
634
|
const error = new Error();
|
|
517
635
|
|
|
518
636
|
when(
|
|
519
|
-
dataManagerMock.loadManyByFieldEqualingAsync(anything(), anything(), anything())
|
|
637
|
+
dataManagerMock.loadManyByFieldEqualingAsync(anything(), anything(), anything()),
|
|
520
638
|
).thenReject(error);
|
|
521
639
|
|
|
522
640
|
const dataManagerInstance = instance(dataManagerMock);
|
|
@@ -530,30 +648,40 @@ describe(EntityLoader, () => {
|
|
|
530
648
|
/* entitySelectedFields */ undefined,
|
|
531
649
|
privacyPolicy,
|
|
532
650
|
dataManagerInstance,
|
|
533
|
-
metricsAdapter
|
|
651
|
+
metricsAdapter,
|
|
534
652
|
);
|
|
535
653
|
|
|
536
654
|
const loadByValue = uuidv4();
|
|
537
655
|
|
|
538
|
-
await expect(
|
|
656
|
+
await expect(
|
|
657
|
+
entityLoader.withAuthorizationResults().loadByIDAsync(loadByValue),
|
|
658
|
+
).rejects.toEqual(error);
|
|
539
659
|
await expect(entityLoader.enforcing().loadByIDAsync(loadByValue)).rejects.toEqual(error);
|
|
540
|
-
await expect(
|
|
660
|
+
await expect(
|
|
661
|
+
entityLoader.withAuthorizationResults().loadManyByIDsAsync([loadByValue]),
|
|
662
|
+
).rejects.toEqual(error);
|
|
541
663
|
await expect(entityLoader.enforcing().loadManyByIDsAsync([loadByValue])).rejects.toEqual(error);
|
|
542
|
-
await expect(entityLoader.loadManyByIDsNullableAsync([loadByValue])).rejects.toEqual(error);
|
|
543
664
|
await expect(
|
|
544
|
-
entityLoader.
|
|
665
|
+
entityLoader.withAuthorizationResults().loadManyByIDsNullableAsync([loadByValue]),
|
|
666
|
+
).rejects.toEqual(error);
|
|
667
|
+
await expect(
|
|
668
|
+
entityLoader.enforcing().loadManyByIDsNullableAsync([loadByValue]),
|
|
545
669
|
).rejects.toEqual(error);
|
|
546
670
|
await expect(
|
|
547
|
-
entityLoader
|
|
671
|
+
entityLoader
|
|
672
|
+
.withAuthorizationResults()
|
|
673
|
+
.loadManyByFieldEqualingAsync('customIdField', loadByValue),
|
|
548
674
|
).rejects.toEqual(error);
|
|
549
675
|
await expect(
|
|
550
|
-
entityLoader.enforcing().loadManyByFieldEqualingAsync('customIdField', loadByValue)
|
|
676
|
+
entityLoader.enforcing().loadManyByFieldEqualingAsync('customIdField', loadByValue),
|
|
551
677
|
).rejects.toEqual(error);
|
|
552
678
|
await expect(
|
|
553
|
-
entityLoader
|
|
679
|
+
entityLoader
|
|
680
|
+
.withAuthorizationResults()
|
|
681
|
+
.loadManyByFieldEqualingManyAsync('customIdField', [loadByValue]),
|
|
554
682
|
).rejects.toEqual(error);
|
|
555
683
|
await expect(
|
|
556
|
-
entityLoader.enforcing().loadManyByFieldEqualingManyAsync('customIdField', [loadByValue])
|
|
684
|
+
entityLoader.enforcing().loadManyByFieldEqualingManyAsync('customIdField', [loadByValue]),
|
|
557
685
|
).rejects.toEqual(error);
|
|
558
686
|
});
|
|
559
687
|
});
|
|
@@ -72,7 +72,7 @@ class TestNonTransactionalMutationTrigger extends EntityNonTransactionalMutation
|
|
|
72
72
|
async executeAsync(
|
|
73
73
|
viewerContext: ViewerContext,
|
|
74
74
|
entity: BlahEntity,
|
|
75
|
-
mutationInfo: EntityTriggerMutationInfo<BlahFields, string, ViewerContext, BlahEntity
|
|
75
|
+
mutationInfo: EntityTriggerMutationInfo<BlahFields, string, ViewerContext, BlahEntity>,
|
|
76
76
|
): Promise<void> {
|
|
77
77
|
if (mutationInfo.type === EntityMutationType.DELETE) {
|
|
78
78
|
const entityLoaded = await BlahEntity.loader(viewerContext)
|
|
@@ -80,7 +80,7 @@ class TestNonTransactionalMutationTrigger extends EntityNonTransactionalMutation
|
|
|
80
80
|
.loadByIDNullableAsync(entity.getID());
|
|
81
81
|
if (entityLoaded) {
|
|
82
82
|
throw new Error(
|
|
83
|
-
'should not have been able to re-load the entity after delete. this means the cache has not been cleared'
|
|
83
|
+
'should not have been able to re-load the entity after delete. this means the cache has not been cleared',
|
|
84
84
|
);
|
|
85
85
|
}
|
|
86
86
|
}
|