@expo/entity 0.46.0 → 0.47.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/src/AuthorizationResultBasedEntityMutator.d.ts +5 -3
- package/build/src/AuthorizationResultBasedEntityMutator.js +75 -37
- package/build/src/AuthorizationResultBasedEntityMutator.js.map +1 -1
- package/build/src/EntityDeleter.js +1 -1
- package/build/src/EntityDeleter.js.map +1 -1
- package/build/src/EntityFields.d.ts +7 -0
- package/build/src/EntityFields.js +11 -1
- package/build/src/EntityFields.js.map +1 -1
- package/build/src/EntityMutatorFactory.d.ts +3 -2
- package/build/src/EntityMutatorFactory.js +4 -4
- package/build/src/EntityMutatorFactory.js.map +1 -1
- package/build/src/EntityUpdater.js +1 -1
- package/build/src/EntityUpdater.js.map +1 -1
- package/build/src/ViewerScopedEntityMutatorFactory.d.ts +3 -2
- package/build/src/ViewerScopedEntityMutatorFactory.js +4 -4
- package/build/src/ViewerScopedEntityMutatorFactory.js.map +1 -1
- package/package.json +5 -3
- package/src/AuthorizationResultBasedEntityMutator.ts +63 -49
- package/src/EntityDeleter.ts +1 -1
- package/src/EntityFields.ts +13 -0
- package/src/EntityMutatorFactory.ts +5 -0
- package/src/EntityUpdater.ts +1 -1
- package/src/ViewerScopedEntityMutatorFactory.ts +5 -2
- package/src/__tests__/EntityFields-test.ts +7 -0
- package/src/__tests__/EntityMutator-test.ts +217 -16
- package/LICENSE +0 -21
- package/build/src/__tests__/AuthorizationResultBasedEntityAssociationLoader-test.d.ts +0 -1
- package/build/src/__tests__/AuthorizationResultBasedEntityAssociationLoader-test.js +0 -240
- package/build/src/__tests__/AuthorizationResultBasedEntityAssociationLoader-test.js.map +0 -1
- package/build/src/__tests__/AuthorizationResultBasedEntityLoader-constructor-test.d.ts +0 -26
- package/build/src/__tests__/AuthorizationResultBasedEntityLoader-constructor-test.js +0 -109
- package/build/src/__tests__/AuthorizationResultBasedEntityLoader-constructor-test.js.map +0 -1
- package/build/src/__tests__/AuthorizationResultBasedEntityLoader-test.d.ts +0 -1
- package/build/src/__tests__/AuthorizationResultBasedEntityLoader-test.js +0 -590
- package/build/src/__tests__/AuthorizationResultBasedEntityLoader-test.js.map +0 -1
- package/build/src/__tests__/ComposedCacheAdapter-test.d.ts +0 -1
- package/build/src/__tests__/ComposedCacheAdapter-test.js +0 -259
- package/build/src/__tests__/ComposedCacheAdapter-test.js.map +0 -1
- package/build/src/__tests__/ComposedSecondaryEntityCache-test.d.ts +0 -1
- package/build/src/__tests__/ComposedSecondaryEntityCache-test.js +0 -67
- package/build/src/__tests__/ComposedSecondaryEntityCache-test.js.map +0 -1
- package/build/src/__tests__/EnforcingEntityAssociationLoader-test.d.ts +0 -1
- package/build/src/__tests__/EnforcingEntityAssociationLoader-test.js +0 -113
- package/build/src/__tests__/EnforcingEntityAssociationLoader-test.js.map +0 -1
- package/build/src/__tests__/EnforcingEntityLoader-test.d.ts +0 -1
- package/build/src/__tests__/EnforcingEntityLoader-test.js +0 -316
- package/build/src/__tests__/EnforcingEntityLoader-test.js.map +0 -1
- package/build/src/__tests__/Entity-test.d.ts +0 -1
- package/build/src/__tests__/Entity-test.js +0 -92
- package/build/src/__tests__/Entity-test.js.map +0 -1
- package/build/src/__tests__/EntityAssociationLoader-test.d.ts +0 -1
- package/build/src/__tests__/EntityAssociationLoader-test.js +0 -28
- package/build/src/__tests__/EntityAssociationLoader-test.js.map +0 -1
- package/build/src/__tests__/EntityCommonUseCases-test.d.ts +0 -1
- package/build/src/__tests__/EntityCommonUseCases-test.js +0 -111
- package/build/src/__tests__/EntityCommonUseCases-test.js.map +0 -1
- package/build/src/__tests__/EntityCompanion-test.d.ts +0 -1
- package/build/src/__tests__/EntityCompanion-test.js +0 -42
- package/build/src/__tests__/EntityCompanion-test.js.map +0 -1
- package/build/src/__tests__/EntityCompanionProvider-test.d.ts +0 -1
- package/build/src/__tests__/EntityCompanionProvider-test.js +0 -53
- package/build/src/__tests__/EntityCompanionProvider-test.js.map +0 -1
- package/build/src/__tests__/EntityConfiguration-test.d.ts +0 -1
- package/build/src/__tests__/EntityConfiguration-test.js +0 -164
- package/build/src/__tests__/EntityConfiguration-test.js.map +0 -1
- package/build/src/__tests__/EntityDatabaseAdapter-test.d.ts +0 -1
- package/build/src/__tests__/EntityDatabaseAdapter-test.js +0 -189
- package/build/src/__tests__/EntityDatabaseAdapter-test.js.map +0 -1
- package/build/src/__tests__/EntityEdges-test.d.ts +0 -1
- package/build/src/__tests__/EntityEdges-test.js +0 -680
- package/build/src/__tests__/EntityEdges-test.js.map +0 -1
- package/build/src/__tests__/EntityFields-test.d.ts +0 -1
- package/build/src/__tests__/EntityFields-test.js +0 -61
- package/build/src/__tests__/EntityFields-test.js.map +0 -1
- package/build/src/__tests__/EntityLoader-test.d.ts +0 -1
- package/build/src/__tests__/EntityLoader-test.js +0 -34
- package/build/src/__tests__/EntityLoader-test.js.map +0 -1
- package/build/src/__tests__/EntityMutator-MutationCacheConsistency-test.d.ts +0 -1
- package/build/src/__tests__/EntityMutator-MutationCacheConsistency-test.js +0 -71
- package/build/src/__tests__/EntityMutator-MutationCacheConsistency-test.js.map +0 -1
- package/build/src/__tests__/EntityMutator-SingleCompositeFieldCacheConsistency-test.d.ts +0 -1
- package/build/src/__tests__/EntityMutator-SingleCompositeFieldCacheConsistency-test.js +0 -54
- package/build/src/__tests__/EntityMutator-SingleCompositeFieldCacheConsistency-test.js.map +0 -1
- package/build/src/__tests__/EntityMutator-test.d.ts +0 -1
- package/build/src/__tests__/EntityMutator-test.js +0 -721
- package/build/src/__tests__/EntityMutator-test.js.map +0 -1
- package/build/src/__tests__/EntityPrivacyPolicy-test.d.ts +0 -1
- package/build/src/__tests__/EntityPrivacyPolicy-test.js +0 -429
- package/build/src/__tests__/EntityPrivacyPolicy-test.js.map +0 -1
- package/build/src/__tests__/EntityQueryContext-test.d.ts +0 -1
- package/build/src/__tests__/EntityQueryContext-test.js +0 -181
- package/build/src/__tests__/EntityQueryContext-test.js.map +0 -1
- package/build/src/__tests__/EntitySecondaryCacheLoader-test.d.ts +0 -1
- package/build/src/__tests__/EntitySecondaryCacheLoader-test.js +0 -58
- package/build/src/__tests__/EntitySecondaryCacheLoader-test.js.map +0 -1
- package/build/src/__tests__/EntitySelfReferentialEdges-test.d.ts +0 -1
- package/build/src/__tests__/EntitySelfReferentialEdges-test.js +0 -196
- package/build/src/__tests__/EntitySelfReferentialEdges-test.js.map +0 -1
- package/build/src/__tests__/GenericEntityCacheAdapter-test.d.ts +0 -1
- package/build/src/__tests__/GenericEntityCacheAdapter-test.js +0 -95
- package/build/src/__tests__/GenericEntityCacheAdapter-test.js.map +0 -1
- package/build/src/__tests__/ReadonlyEntity-test.d.ts +0 -1
- package/build/src/__tests__/ReadonlyEntity-test.js +0 -209
- package/build/src/__tests__/ReadonlyEntity-test.js.map +0 -1
- package/build/src/__tests__/ViewerContext-test.d.ts +0 -1
- package/build/src/__tests__/ViewerContext-test.js +0 -28
- package/build/src/__tests__/ViewerContext-test.js.map +0 -1
- package/build/src/__tests__/ViewerScopedEntityCompanion-test.d.ts +0 -1
- package/build/src/__tests__/ViewerScopedEntityCompanion-test.js +0 -18
- package/build/src/__tests__/ViewerScopedEntityCompanion-test.js.map +0 -1
- package/build/src/__tests__/ViewerScopedEntityCompanionProvider-test.d.ts +0 -1
- package/build/src/__tests__/ViewerScopedEntityCompanionProvider-test.js +0 -18
- package/build/src/__tests__/ViewerScopedEntityCompanionProvider-test.js.map +0 -1
- package/build/src/__tests__/ViewerScopedEntityLoaderFactory-test.d.ts +0 -1
- package/build/src/__tests__/ViewerScopedEntityLoaderFactory-test.js +0 -21
- package/build/src/__tests__/ViewerScopedEntityLoaderFactory-test.js.map +0 -1
- package/build/src/__tests__/ViewerScopedEntityMutatorFactory-test.d.ts +0 -1
- package/build/src/__tests__/ViewerScopedEntityMutatorFactory-test.js +0 -20
- package/build/src/__tests__/ViewerScopedEntityMutatorFactory-test.js.map +0 -1
- package/build/src/__tests__/cases/TwoEntitySameTableDisjointRows-test.d.ts +0 -1
- package/build/src/__tests__/cases/TwoEntitySameTableDisjointRows-test.js +0 -121
- package/build/src/__tests__/cases/TwoEntitySameTableDisjointRows-test.js.map +0 -1
- package/build/src/__tests__/cases/TwoEntitySameTableOverlappingRows-test.d.ts +0 -1
- package/build/src/__tests__/cases/TwoEntitySameTableOverlappingRows-test.js +0 -119
- package/build/src/__tests__/cases/TwoEntitySameTableOverlappingRows-test.js.map +0 -1
- package/build/src/__tests__/entityUtils-test.d.ts +0 -1
- package/build/src/__tests__/entityUtils-test.js +0 -88
- package/build/src/__tests__/entityUtils-test.js.map +0 -1
- package/build/src/errors/__tests__/EntityDatabaseAdapterError-test.d.ts +0 -1
- package/build/src/errors/__tests__/EntityDatabaseAdapterError-test.js +0 -21
- package/build/src/errors/__tests__/EntityDatabaseAdapterError-test.js.map +0 -1
- package/build/src/internal/__tests__/CompositeFieldHolder-test.d.ts +0 -1
- package/build/src/internal/__tests__/CompositeFieldHolder-test.js +0 -25
- package/build/src/internal/__tests__/CompositeFieldHolder-test.js.map +0 -1
- package/build/src/internal/__tests__/CompositeFieldValueMap-test.d.ts +0 -1
- package/build/src/internal/__tests__/CompositeFieldValueMap-test.js +0 -40
- package/build/src/internal/__tests__/CompositeFieldValueMap-test.js.map +0 -1
- package/build/src/internal/__tests__/EntityDataManager-test.d.ts +0 -1
- package/build/src/internal/__tests__/EntityDataManager-test.js +0 -666
- package/build/src/internal/__tests__/EntityDataManager-test.js.map +0 -1
- package/build/src/internal/__tests__/EntityFieldTransformationUtils-test.d.ts +0 -1
- package/build/src/internal/__tests__/EntityFieldTransformationUtils-test.js +0 -135
- package/build/src/internal/__tests__/EntityFieldTransformationUtils-test.js.map +0 -1
- package/build/src/internal/__tests__/ReadThroughEntityCache-test.d.ts +0 -1
- package/build/src/internal/__tests__/ReadThroughEntityCache-test.js +0 -217
- package/build/src/internal/__tests__/ReadThroughEntityCache-test.js.map +0 -1
- package/build/src/rules/__tests__/AlwaysAllowPrivacyPolicyRule-test.d.ts +0 -1
- package/build/src/rules/__tests__/AlwaysAllowPrivacyPolicyRule-test.js +0 -18
- package/build/src/rules/__tests__/AlwaysAllowPrivacyPolicyRule-test.js.map +0 -1
- package/build/src/rules/__tests__/AlwaysDenyPrivacyPolicyRule-test.d.ts +0 -1
- package/build/src/rules/__tests__/AlwaysDenyPrivacyPolicyRule-test.js +0 -18
- package/build/src/rules/__tests__/AlwaysDenyPrivacyPolicyRule-test.js.map +0 -1
- package/build/src/rules/__tests__/AlwaysSkipPrivacyPolicyRule-test.d.ts +0 -1
- package/build/src/rules/__tests__/AlwaysSkipPrivacyPolicyRule-test.js +0 -18
- package/build/src/rules/__tests__/AlwaysSkipPrivacyPolicyRule-test.js.map +0 -1
- package/build/src/utils/__testfixtures__/PrivacyPolicyRuleTestUtils.d.ts +0 -28
- package/build/src/utils/__testfixtures__/PrivacyPolicyRuleTestUtils.js +0 -53
- package/build/src/utils/__testfixtures__/PrivacyPolicyRuleTestUtils.js.map +0 -1
- package/build/src/utils/__testfixtures__/SimpleTestEntity.d.ts +0 -20
- package/build/src/utils/__testfixtures__/SimpleTestEntity.js +0 -46
- package/build/src/utils/__testfixtures__/SimpleTestEntity.js.map +0 -1
- package/build/src/utils/__testfixtures__/StubCacheAdapter.d.ts +0 -29
- package/build/src/utils/__testfixtures__/StubCacheAdapter.js +0 -103
- package/build/src/utils/__testfixtures__/StubCacheAdapter.js.map +0 -1
- package/build/src/utils/__testfixtures__/StubDatabaseAdapter.d.ts +0 -26
- package/build/src/utils/__testfixtures__/StubDatabaseAdapter.js +0 -173
- package/build/src/utils/__testfixtures__/StubDatabaseAdapter.js.map +0 -1
- package/build/src/utils/__testfixtures__/StubDatabaseAdapterProvider.d.ts +0 -7
- package/build/src/utils/__testfixtures__/StubDatabaseAdapterProvider.js +0 -12
- package/build/src/utils/__testfixtures__/StubDatabaseAdapterProvider.js.map +0 -1
- package/build/src/utils/__testfixtures__/StubQueryContextProvider.d.ts +0 -7
- package/build/src/utils/__testfixtures__/StubQueryContextProvider.js +0 -17
- package/build/src/utils/__testfixtures__/StubQueryContextProvider.js.map +0 -1
- package/build/src/utils/__testfixtures__/TSMockitoExtensions.d.ts +0 -9
- package/build/src/utils/__testfixtures__/TSMockitoExtensions.js +0 -65
- package/build/src/utils/__testfixtures__/TSMockitoExtensions.js.map +0 -1
- package/build/src/utils/__testfixtures__/TestEntity.d.ts +0 -30
- package/build/src/utils/__testfixtures__/TestEntity.js +0 -96
- package/build/src/utils/__testfixtures__/TestEntity.js.map +0 -1
- package/build/src/utils/__testfixtures__/TestEntity2.d.ts +0 -20
- package/build/src/utils/__testfixtures__/TestEntity2.js +0 -49
- package/build/src/utils/__testfixtures__/TestEntity2.js.map +0 -1
- package/build/src/utils/__testfixtures__/TestEntityWithMutationTriggers.d.ts +0 -36
- package/build/src/utils/__testfixtures__/TestEntityWithMutationTriggers.js +0 -80
- package/build/src/utils/__testfixtures__/TestEntityWithMutationTriggers.js.map +0 -1
- package/build/src/utils/__testfixtures__/TestViewerContext.d.ts +0 -3
- package/build/src/utils/__testfixtures__/TestViewerContext.js +0 -8
- package/build/src/utils/__testfixtures__/TestViewerContext.js.map +0 -1
- package/build/src/utils/__testfixtures__/createUnitTestEntityCompanionProvider.d.ts +0 -7
- package/build/src/utils/__testfixtures__/createUnitTestEntityCompanionProvider.js +0 -33
- package/build/src/utils/__testfixtures__/createUnitTestEntityCompanionProvider.js.map +0 -1
- package/build/src/utils/__testfixtures__/describeFieldTestCase.d.ts +0 -2
- package/build/src/utils/__testfixtures__/describeFieldTestCase.js +0 -19
- package/build/src/utils/__testfixtures__/describeFieldTestCase.js.map +0 -1
- package/build/src/utils/__tests__/EntityCreationUtils-test.d.ts +0 -1
- package/build/src/utils/__tests__/EntityCreationUtils-test.js +0 -144
- package/build/src/utils/__tests__/EntityCreationUtils-test.js.map +0 -1
- package/build/src/utils/__tests__/EntityPrivacyUtils-test.d.ts +0 -1
- package/build/src/utils/__tests__/EntityPrivacyUtils-test.js +0 -460
- package/build/src/utils/__tests__/EntityPrivacyUtils-test.js.map +0 -1
- package/build/src/utils/__tests__/canViewerDeleteAsync-edgeDeletionPermissionInferenceBehavior-test.d.ts +0 -1
- package/build/src/utils/__tests__/canViewerDeleteAsync-edgeDeletionPermissionInferenceBehavior-test.js +0 -180
- package/build/src/utils/__tests__/canViewerDeleteAsync-edgeDeletionPermissionInferenceBehavior-test.js.map +0 -1
- package/build/src/utils/__tests__/mergeEntityMutationTriggerConfigurations-test.d.ts +0 -1
- package/build/src/utils/__tests__/mergeEntityMutationTriggerConfigurations-test.js +0 -27
- package/build/src/utils/__tests__/mergeEntityMutationTriggerConfigurations-test.js.map +0 -1
- package/build/src/utils/collections/__tests__/SerializableKeyMap-test.d.ts +0 -5
- package/build/src/utils/collections/__tests__/SerializableKeyMap-test.js +0 -99
- package/build/src/utils/collections/__tests__/SerializableKeyMap-test.js.map +0 -1
- package/build/src/utils/collections/__tests__/maps-test.d.ts +0 -1
- package/build/src/utils/collections/__tests__/maps-test.js +0 -121
- package/build/src/utils/collections/__tests__/maps-test.js.map +0 -1
- package/build/src/utils/collections/__tests__/sets-test.d.ts +0 -1
- package/build/src/utils/collections/__tests__/sets-test.js +0 -19
- package/build/src/utils/collections/__tests__/sets-test.js.map +0 -1
- package/build/tsconfig.tsbuildinfo +0 -1
|
@@ -1,680 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const globals_1 = require("@jest/globals");
|
|
7
|
-
const invariant_1 = __importDefault(require("invariant"));
|
|
8
|
-
const Entity_1 = require("../Entity");
|
|
9
|
-
const EntityConfiguration_1 = require("../EntityConfiguration");
|
|
10
|
-
const EntityFieldDefinition_1 = require("../EntityFieldDefinition");
|
|
11
|
-
const EntityFields_1 = require("../EntityFields");
|
|
12
|
-
const EntityMutationInfo_1 = require("../EntityMutationInfo");
|
|
13
|
-
const EntityMutationTriggerConfiguration_1 = require("../EntityMutationTriggerConfiguration");
|
|
14
|
-
const EntityPrivacyPolicy_1 = require("../EntityPrivacyPolicy");
|
|
15
|
-
const ReadThroughEntityCache_1 = require("../internal/ReadThroughEntityCache");
|
|
16
|
-
const SingleFieldHolder_1 = require("../internal/SingleFieldHolder");
|
|
17
|
-
const PrivacyPolicyRule_1 = require("../rules/PrivacyPolicyRule");
|
|
18
|
-
const TestViewerContext_1 = require("../utils/__testfixtures__/TestViewerContext");
|
|
19
|
-
const createUnitTestEntityCompanionProvider_1 = require("../utils/__testfixtures__/createUnitTestEntityCompanionProvider");
|
|
20
|
-
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
|
|
21
|
-
const makeEntityClasses = (edgeDeletionBehavior) => {
|
|
22
|
-
const triggerExecutionCounts = {
|
|
23
|
-
ParentEntityDeletion: 0,
|
|
24
|
-
ChildEntityDeletion: 0,
|
|
25
|
-
GrandChildEntityDeletion: 0,
|
|
26
|
-
ParentEntityUpdate: 0,
|
|
27
|
-
ChildEntityUpdate: 0,
|
|
28
|
-
GrandChildEntityUpdate: 0,
|
|
29
|
-
};
|
|
30
|
-
const privacyPolicyEvaluationRecords = {
|
|
31
|
-
shouldRecord: false,
|
|
32
|
-
ParentEntity: {
|
|
33
|
-
[EntityPrivacyPolicy_1.EntityAuthorizationAction.CREATE]: [],
|
|
34
|
-
[EntityPrivacyPolicy_1.EntityAuthorizationAction.READ]: [],
|
|
35
|
-
[EntityPrivacyPolicy_1.EntityAuthorizationAction.UPDATE]: [],
|
|
36
|
-
[EntityPrivacyPolicy_1.EntityAuthorizationAction.DELETE]: [],
|
|
37
|
-
},
|
|
38
|
-
ChildEntity: {
|
|
39
|
-
[EntityPrivacyPolicy_1.EntityAuthorizationAction.CREATE]: [],
|
|
40
|
-
[EntityPrivacyPolicy_1.EntityAuthorizationAction.READ]: [],
|
|
41
|
-
[EntityPrivacyPolicy_1.EntityAuthorizationAction.UPDATE]: [],
|
|
42
|
-
[EntityPrivacyPolicy_1.EntityAuthorizationAction.DELETE]: [],
|
|
43
|
-
},
|
|
44
|
-
GrandChildEntity: {
|
|
45
|
-
[EntityPrivacyPolicy_1.EntityAuthorizationAction.CREATE]: [],
|
|
46
|
-
[EntityPrivacyPolicy_1.EntityAuthorizationAction.READ]: [],
|
|
47
|
-
[EntityPrivacyPolicy_1.EntityAuthorizationAction.UPDATE]: [],
|
|
48
|
-
[EntityPrivacyPolicy_1.EntityAuthorizationAction.DELETE]: [],
|
|
49
|
-
},
|
|
50
|
-
};
|
|
51
|
-
class AlwaysAllowPrivacyPolicyRuleThatRecords extends PrivacyPolicyRule_1.PrivacyPolicyRule {
|
|
52
|
-
action;
|
|
53
|
-
constructor(action) {
|
|
54
|
-
super();
|
|
55
|
-
this.action = action;
|
|
56
|
-
}
|
|
57
|
-
async evaluateAsync(_viewerContext, _queryContext, evaluationContext, entity) {
|
|
58
|
-
if (privacyPolicyEvaluationRecords.shouldRecord) {
|
|
59
|
-
privacyPolicyEvaluationRecords[entity.constructor.name][this.action].push(evaluationContext);
|
|
60
|
-
}
|
|
61
|
-
return PrivacyPolicyRule_1.RuleEvaluationResult.ALLOW;
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
class TestEntityPrivacyPolicy extends EntityPrivacyPolicy_1.EntityPrivacyPolicy {
|
|
65
|
-
readRules = [
|
|
66
|
-
new AlwaysAllowPrivacyPolicyRuleThatRecords(EntityPrivacyPolicy_1.EntityAuthorizationAction.READ),
|
|
67
|
-
];
|
|
68
|
-
createRules = [
|
|
69
|
-
new AlwaysAllowPrivacyPolicyRuleThatRecords(EntityPrivacyPolicy_1.EntityAuthorizationAction.CREATE),
|
|
70
|
-
];
|
|
71
|
-
updateRules = [
|
|
72
|
-
new AlwaysAllowPrivacyPolicyRuleThatRecords(EntityPrivacyPolicy_1.EntityAuthorizationAction.UPDATE),
|
|
73
|
-
];
|
|
74
|
-
deleteRules = [
|
|
75
|
-
new AlwaysAllowPrivacyPolicyRuleThatRecords(EntityPrivacyPolicy_1.EntityAuthorizationAction.DELETE),
|
|
76
|
-
];
|
|
77
|
-
}
|
|
78
|
-
class ParentCheckInfoDeletionTrigger extends EntityMutationTriggerConfiguration_1.EntityMutationTrigger {
|
|
79
|
-
async executeAsync(_viewerContext, _queryContext, _entity, mutationInfo) {
|
|
80
|
-
(0, invariant_1.default)(mutationInfo.type === EntityMutationInfo_1.EntityMutationType.DELETE, 'invalid EntityMutationType');
|
|
81
|
-
if (mutationInfo.cascadingDeleteCause !== null) {
|
|
82
|
-
throw new Error('Parent entity should not have casade delete cause');
|
|
83
|
-
}
|
|
84
|
-
triggerExecutionCounts.ParentEntityDeletion++;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
class ParentCheckInfoUpdateTrigger extends EntityMutationTriggerConfiguration_1.EntityMutationTrigger {
|
|
88
|
-
async executeAsync(_viewerContext, _queryContext, _entity, mutationInfo) {
|
|
89
|
-
(0, invariant_1.default)(mutationInfo.type === EntityMutationInfo_1.EntityMutationType.UPDATE, 'invalid EntityMutationType');
|
|
90
|
-
if (mutationInfo.cascadingDeleteCause !== null) {
|
|
91
|
-
throw new Error('Parent entity should not have casade delete cause');
|
|
92
|
-
}
|
|
93
|
-
triggerExecutionCounts.ParentEntityUpdate++;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
class ChildCheckInfoDeletionTrigger extends EntityMutationTriggerConfiguration_1.EntityMutationTrigger {
|
|
97
|
-
async executeAsync(_viewerContext, _queryContext, _entity, mutationInfo) {
|
|
98
|
-
(0, invariant_1.default)(mutationInfo.type === EntityMutationInfo_1.EntityMutationType.DELETE, 'invalid EntityMutationType');
|
|
99
|
-
if (mutationInfo.cascadingDeleteCause === null) {
|
|
100
|
-
throw new Error('Child entity should have casade delete cause');
|
|
101
|
-
}
|
|
102
|
-
const cascadingDeleteCauseEntity = mutationInfo.cascadingDeleteCause.entity;
|
|
103
|
-
if (!(cascadingDeleteCauseEntity instanceof ParentEntity)) {
|
|
104
|
-
throw new Error('Child entity should have casade delete cause entity of type ParentEntity');
|
|
105
|
-
}
|
|
106
|
-
const secondLevelCascadingDeleteCause = mutationInfo.cascadingDeleteCause.cascadingDeleteCause;
|
|
107
|
-
if (secondLevelCascadingDeleteCause) {
|
|
108
|
-
throw new Error('Child entity should not have two-level casade delete cause');
|
|
109
|
-
}
|
|
110
|
-
triggerExecutionCounts.ChildEntityDeletion++;
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
class ChildCheckInfoUpdateTrigger extends EntityMutationTriggerConfiguration_1.EntityMutationTrigger {
|
|
114
|
-
async executeAsync(_viewerContext, _queryContext, _entity, mutationInfo) {
|
|
115
|
-
(0, invariant_1.default)(mutationInfo.type === EntityMutationInfo_1.EntityMutationType.UPDATE, 'invalid EntityMutationType');
|
|
116
|
-
if (mutationInfo.cascadingDeleteCause === null) {
|
|
117
|
-
throw new Error('Child entity should have casade delete cause');
|
|
118
|
-
}
|
|
119
|
-
const cascadingDeleteCauseEntity = mutationInfo.cascadingDeleteCause.entity;
|
|
120
|
-
if (!(cascadingDeleteCauseEntity instanceof ParentEntity)) {
|
|
121
|
-
throw new Error('Child entity should have casade delete cause entity of type ParentEntity');
|
|
122
|
-
}
|
|
123
|
-
const secondLevelCascadingDeleteCause = mutationInfo.cascadingDeleteCause.cascadingDeleteCause;
|
|
124
|
-
if (secondLevelCascadingDeleteCause) {
|
|
125
|
-
throw new Error('Child entity should not have two-level casade delete cause');
|
|
126
|
-
}
|
|
127
|
-
triggerExecutionCounts.ChildEntityUpdate++;
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
class GrandChildCheckInfoDeletionTrigger extends EntityMutationTriggerConfiguration_1.EntityMutationTrigger {
|
|
131
|
-
async executeAsync(_viewerContext, _queryContext, _entity, mutationInfo) {
|
|
132
|
-
(0, invariant_1.default)(mutationInfo.type === EntityMutationInfo_1.EntityMutationType.DELETE, 'invalid EntityMutationType');
|
|
133
|
-
if (mutationInfo.cascadingDeleteCause === null) {
|
|
134
|
-
throw new Error('GrandChild entity should have cascade delete cause');
|
|
135
|
-
}
|
|
136
|
-
const cascadingDeleteCauseEntity = mutationInfo.cascadingDeleteCause.entity;
|
|
137
|
-
if (!(cascadingDeleteCauseEntity instanceof ChildEntity)) {
|
|
138
|
-
throw new Error('GrandChild entity should have cascade delete cause entity of type ChildEntity');
|
|
139
|
-
}
|
|
140
|
-
const secondLevelCascadingDeleteCause = mutationInfo.cascadingDeleteCause.cascadingDeleteCause;
|
|
141
|
-
if (!secondLevelCascadingDeleteCause) {
|
|
142
|
-
throw new Error('GrandChild entity should have two-level casade delete cause');
|
|
143
|
-
}
|
|
144
|
-
const secondLevelCascadingDeleteCauseEntity = secondLevelCascadingDeleteCause.entity;
|
|
145
|
-
if (!(secondLevelCascadingDeleteCauseEntity instanceof ParentEntity)) {
|
|
146
|
-
throw new Error('GrandChild entity should have second level casade delete cause entity of type ParentEntity');
|
|
147
|
-
}
|
|
148
|
-
const thirdLevelCascadingDeleteCause = secondLevelCascadingDeleteCause.cascadingDeleteCause;
|
|
149
|
-
if (thirdLevelCascadingDeleteCause) {
|
|
150
|
-
throw new Error('GrandChild entity should not have three-level casade delete cause');
|
|
151
|
-
}
|
|
152
|
-
triggerExecutionCounts.GrandChildEntityDeletion++;
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
class GrandChildCheckInfoUpdateTrigger extends EntityMutationTriggerConfiguration_1.EntityMutationTrigger {
|
|
156
|
-
async executeAsync(_viewerContext, _queryContext, _entity, mutationInfo) {
|
|
157
|
-
(0, invariant_1.default)(mutationInfo.type === EntityMutationInfo_1.EntityMutationType.UPDATE, 'invalid EntityMutationType');
|
|
158
|
-
if (mutationInfo.cascadingDeleteCause === null) {
|
|
159
|
-
throw new Error('GrandChild entity should have cascade delete cause');
|
|
160
|
-
}
|
|
161
|
-
const cascadingDeleteCauseEntity = mutationInfo.cascadingDeleteCause.entity;
|
|
162
|
-
if (!(cascadingDeleteCauseEntity instanceof ChildEntity)) {
|
|
163
|
-
throw new Error('GrandChild entity should have cascade delete cause entity of type ChildEntity');
|
|
164
|
-
}
|
|
165
|
-
const secondLevelCascadingDeleteCause = mutationInfo.cascadingDeleteCause.cascadingDeleteCause;
|
|
166
|
-
if (!secondLevelCascadingDeleteCause) {
|
|
167
|
-
throw new Error('GrandChild entity should have two-level casade delete cause');
|
|
168
|
-
}
|
|
169
|
-
const secondLevelCascadingDeleteCauseEntity = secondLevelCascadingDeleteCause.entity;
|
|
170
|
-
if (!(secondLevelCascadingDeleteCauseEntity instanceof ParentEntity)) {
|
|
171
|
-
throw new Error('GrandChild entity should have second level casade delete cause entity of type ParentEntity');
|
|
172
|
-
}
|
|
173
|
-
const thirdLevelCascadingDeleteCause = secondLevelCascadingDeleteCause.cascadingDeleteCause;
|
|
174
|
-
if (thirdLevelCascadingDeleteCause) {
|
|
175
|
-
throw new Error('GrandChild entity should not have three-level casade delete cause');
|
|
176
|
-
}
|
|
177
|
-
triggerExecutionCounts.GrandChildEntityUpdate++;
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
class OtherEntity extends Entity_1.Entity {
|
|
181
|
-
static defineCompanionDefinition() {
|
|
182
|
-
return {
|
|
183
|
-
entityClass: ParentEntity,
|
|
184
|
-
entityConfiguration: otherEntityConfiguration,
|
|
185
|
-
privacyPolicyClass: TestEntityPrivacyPolicy,
|
|
186
|
-
};
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
class ParentEntity extends Entity_1.Entity {
|
|
190
|
-
static defineCompanionDefinition() {
|
|
191
|
-
return {
|
|
192
|
-
entityClass: ParentEntity,
|
|
193
|
-
entityConfiguration: parentEntityConfiguration,
|
|
194
|
-
privacyPolicyClass: TestEntityPrivacyPolicy,
|
|
195
|
-
mutationTriggers: {
|
|
196
|
-
beforeDelete: [new ParentCheckInfoDeletionTrigger()],
|
|
197
|
-
afterDelete: [new ParentCheckInfoDeletionTrigger()],
|
|
198
|
-
beforeUpdate: [new ParentCheckInfoUpdateTrigger()],
|
|
199
|
-
afterUpdate: [new ParentCheckInfoUpdateTrigger()],
|
|
200
|
-
},
|
|
201
|
-
};
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
class ChildEntity extends Entity_1.Entity {
|
|
205
|
-
static defineCompanionDefinition() {
|
|
206
|
-
return {
|
|
207
|
-
entityClass: ChildEntity,
|
|
208
|
-
entityConfiguration: childEntityConfiguration,
|
|
209
|
-
privacyPolicyClass: TestEntityPrivacyPolicy,
|
|
210
|
-
mutationTriggers: {
|
|
211
|
-
beforeDelete: [new ChildCheckInfoDeletionTrigger()],
|
|
212
|
-
afterDelete: [new ChildCheckInfoDeletionTrigger()],
|
|
213
|
-
beforeUpdate: [new ChildCheckInfoUpdateTrigger()],
|
|
214
|
-
afterUpdate: [new ChildCheckInfoUpdateTrigger()],
|
|
215
|
-
},
|
|
216
|
-
};
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
class GrandChildEntity extends Entity_1.Entity {
|
|
220
|
-
static defineCompanionDefinition() {
|
|
221
|
-
return {
|
|
222
|
-
entityClass: GrandChildEntity,
|
|
223
|
-
entityConfiguration: grandChildEntityConfiguration,
|
|
224
|
-
privacyPolicyClass: TestEntityPrivacyPolicy,
|
|
225
|
-
mutationTriggers: {
|
|
226
|
-
beforeDelete: [new GrandChildCheckInfoDeletionTrigger()],
|
|
227
|
-
afterDelete: [new GrandChildCheckInfoDeletionTrigger()],
|
|
228
|
-
beforeUpdate: [new GrandChildCheckInfoUpdateTrigger()],
|
|
229
|
-
afterUpdate: [new GrandChildCheckInfoUpdateTrigger()],
|
|
230
|
-
},
|
|
231
|
-
};
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
const otherEntityConfiguration = new EntityConfiguration_1.EntityConfiguration({
|
|
235
|
-
idField: 'id',
|
|
236
|
-
tableName: 'others',
|
|
237
|
-
schema: {
|
|
238
|
-
id: new EntityFields_1.UUIDField({
|
|
239
|
-
columnName: 'id',
|
|
240
|
-
cache: true,
|
|
241
|
-
}),
|
|
242
|
-
},
|
|
243
|
-
databaseAdapterFlavor: 'postgres',
|
|
244
|
-
cacheAdapterFlavor: 'redis',
|
|
245
|
-
});
|
|
246
|
-
const parentEntityConfiguration = new EntityConfiguration_1.EntityConfiguration({
|
|
247
|
-
idField: 'id',
|
|
248
|
-
tableName: 'parents',
|
|
249
|
-
inboundEdges: [ChildEntity],
|
|
250
|
-
schema: {
|
|
251
|
-
id: new EntityFields_1.UUIDField({
|
|
252
|
-
columnName: 'id',
|
|
253
|
-
cache: true,
|
|
254
|
-
}),
|
|
255
|
-
},
|
|
256
|
-
databaseAdapterFlavor: 'postgres',
|
|
257
|
-
cacheAdapterFlavor: 'redis',
|
|
258
|
-
});
|
|
259
|
-
const childEntityConfiguration = new EntityConfiguration_1.EntityConfiguration({
|
|
260
|
-
idField: 'id',
|
|
261
|
-
tableName: 'children',
|
|
262
|
-
inboundEdges: [GrandChildEntity],
|
|
263
|
-
schema: {
|
|
264
|
-
id: new EntityFields_1.UUIDField({
|
|
265
|
-
columnName: 'id',
|
|
266
|
-
cache: true,
|
|
267
|
-
}),
|
|
268
|
-
unused_other_edge_id: new EntityFields_1.UUIDField({
|
|
269
|
-
columnName: 'unused_other_edge_id',
|
|
270
|
-
association: {
|
|
271
|
-
associatedEntityClass: OtherEntity,
|
|
272
|
-
edgeDeletionBehavior,
|
|
273
|
-
},
|
|
274
|
-
}),
|
|
275
|
-
parent_id: new EntityFields_1.UUIDField({
|
|
276
|
-
columnName: 'parent_id',
|
|
277
|
-
cache: true,
|
|
278
|
-
association: {
|
|
279
|
-
associatedEntityClass: ParentEntity,
|
|
280
|
-
associatedEntityLookupByField: 'id', // sanity check that this functionality works by using it for one edge
|
|
281
|
-
edgeDeletionBehavior,
|
|
282
|
-
},
|
|
283
|
-
}),
|
|
284
|
-
},
|
|
285
|
-
databaseAdapterFlavor: 'postgres',
|
|
286
|
-
cacheAdapterFlavor: 'redis',
|
|
287
|
-
});
|
|
288
|
-
const grandChildEntityConfiguration = new EntityConfiguration_1.EntityConfiguration({
|
|
289
|
-
idField: 'id',
|
|
290
|
-
tableName: 'grandchildren',
|
|
291
|
-
schema: {
|
|
292
|
-
id: new EntityFields_1.UUIDField({
|
|
293
|
-
columnName: 'id',
|
|
294
|
-
cache: true,
|
|
295
|
-
}),
|
|
296
|
-
parent_id: new EntityFields_1.UUIDField({
|
|
297
|
-
columnName: 'parent_id',
|
|
298
|
-
cache: true,
|
|
299
|
-
association: {
|
|
300
|
-
associatedEntityClass: ChildEntity,
|
|
301
|
-
edgeDeletionBehavior,
|
|
302
|
-
},
|
|
303
|
-
}),
|
|
304
|
-
},
|
|
305
|
-
databaseAdapterFlavor: 'postgres',
|
|
306
|
-
cacheAdapterFlavor: 'redis',
|
|
307
|
-
});
|
|
308
|
-
return {
|
|
309
|
-
ParentEntity,
|
|
310
|
-
ChildEntity,
|
|
311
|
-
GrandChildEntity,
|
|
312
|
-
triggerExecutionCounts,
|
|
313
|
-
privacyPolicyEvaluationRecords,
|
|
314
|
-
};
|
|
315
|
-
};
|
|
316
|
-
(0, globals_1.describe)('EntityMutator.processEntityDeletionForInboundEdgesAsync', () => {
|
|
317
|
-
(0, globals_1.describe)('EntityEdgeDeletionBehavior.CASCADE_DELETE', () => {
|
|
318
|
-
(0, globals_1.it)('deletes', async () => {
|
|
319
|
-
const { ParentEntity, ChildEntity, GrandChildEntity, triggerExecutionCounts, privacyPolicyEvaluationRecords, } = makeEntityClasses(EntityFieldDefinition_1.EntityEdgeDeletionBehavior.CASCADE_DELETE);
|
|
320
|
-
const companionProvider = (0, createUnitTestEntityCompanionProvider_1.createUnitTestEntityCompanionProvider)();
|
|
321
|
-
const viewerContext = new TestViewerContext_1.TestViewerContext(companionProvider);
|
|
322
|
-
const parent = await ParentEntity.creator(viewerContext).createAsync();
|
|
323
|
-
const child = await ChildEntity.creator(viewerContext)
|
|
324
|
-
.setField('parent_id', parent.getID())
|
|
325
|
-
.createAsync();
|
|
326
|
-
const grandchild = await GrandChildEntity.creator(viewerContext)
|
|
327
|
-
.setField('parent_id', child.getID())
|
|
328
|
-
.createAsync();
|
|
329
|
-
await (0, globals_1.expect)(ParentEntity.loader(viewerContext).loadByIDNullableAsync(parent.getID())).resolves.not.toBeNull();
|
|
330
|
-
await (0, globals_1.expect)(ChildEntity.loader(viewerContext).loadByIDNullableAsync(child.getID())).resolves.not.toBeNull();
|
|
331
|
-
await (0, globals_1.expect)(GrandChildEntity.loader(viewerContext).loadByIDNullableAsync(grandchild.getID())).resolves.not.toBeNull();
|
|
332
|
-
privacyPolicyEvaluationRecords.shouldRecord = true;
|
|
333
|
-
await ParentEntity.deleter(parent).deleteAsync();
|
|
334
|
-
privacyPolicyEvaluationRecords.shouldRecord = false;
|
|
335
|
-
await (0, globals_1.expect)(ParentEntity.loader(viewerContext).loadByIDNullableAsync(parent.getID())).resolves.toBeNull();
|
|
336
|
-
await (0, globals_1.expect)(ChildEntity.loader(viewerContext).loadByIDNullableAsync(child.getID())).resolves.toBeNull();
|
|
337
|
-
await (0, globals_1.expect)(GrandChildEntity.loader(viewerContext).loadByIDNullableAsync(grandchild.getID())).resolves.toBeNull();
|
|
338
|
-
// two calls for each trigger, one beforeDelete, one afterDelete
|
|
339
|
-
(0, globals_1.expect)(triggerExecutionCounts).toMatchObject({
|
|
340
|
-
ParentEntityDeletion: 2,
|
|
341
|
-
ChildEntityDeletion: 2,
|
|
342
|
-
GrandChildEntityDeletion: 2,
|
|
343
|
-
ParentEntityUpdate: 0,
|
|
344
|
-
ChildEntityUpdate: 0,
|
|
345
|
-
GrandChildEntityUpdate: 0,
|
|
346
|
-
});
|
|
347
|
-
(0, globals_1.expect)(privacyPolicyEvaluationRecords).toMatchObject({
|
|
348
|
-
ParentEntity: {
|
|
349
|
-
[EntityPrivacyPolicy_1.EntityAuthorizationAction.CREATE]: [],
|
|
350
|
-
[EntityPrivacyPolicy_1.EntityAuthorizationAction.READ]: [],
|
|
351
|
-
[EntityPrivacyPolicy_1.EntityAuthorizationAction.UPDATE]: [],
|
|
352
|
-
// one DELETE auth action for parent (since it's being deleted)
|
|
353
|
-
[EntityPrivacyPolicy_1.EntityAuthorizationAction.DELETE]: [{ cascadingDeleteCause: null }],
|
|
354
|
-
},
|
|
355
|
-
ChildEntity: {
|
|
356
|
-
[EntityPrivacyPolicy_1.EntityAuthorizationAction.CREATE]: [],
|
|
357
|
-
// one READ auth action for child in order to delete via cascade
|
|
358
|
-
[EntityPrivacyPolicy_1.EntityAuthorizationAction.READ]: [
|
|
359
|
-
{
|
|
360
|
-
cascadingDeleteCause: {
|
|
361
|
-
entity: globals_1.expect.any(ParentEntity),
|
|
362
|
-
cascadingDeleteCause: null,
|
|
363
|
-
},
|
|
364
|
-
},
|
|
365
|
-
],
|
|
366
|
-
[EntityPrivacyPolicy_1.EntityAuthorizationAction.UPDATE]: [],
|
|
367
|
-
// one DELETE auth action for child (since it's being deleted via cascade)
|
|
368
|
-
[EntityPrivacyPolicy_1.EntityAuthorizationAction.DELETE]: [
|
|
369
|
-
{
|
|
370
|
-
cascadingDeleteCause: {
|
|
371
|
-
entity: globals_1.expect.any(ParentEntity),
|
|
372
|
-
cascadingDeleteCause: null,
|
|
373
|
-
},
|
|
374
|
-
},
|
|
375
|
-
],
|
|
376
|
-
},
|
|
377
|
-
GrandChildEntity: {
|
|
378
|
-
[EntityPrivacyPolicy_1.EntityAuthorizationAction.CREATE]: [],
|
|
379
|
-
// one READ auth action for grandchild in order to delete via cascade
|
|
380
|
-
[EntityPrivacyPolicy_1.EntityAuthorizationAction.READ]: [
|
|
381
|
-
{
|
|
382
|
-
cascadingDeleteCause: {
|
|
383
|
-
entity: globals_1.expect.any(ChildEntity),
|
|
384
|
-
cascadingDeleteCause: {
|
|
385
|
-
entity: globals_1.expect.any(ParentEntity),
|
|
386
|
-
cascadingDeleteCause: null,
|
|
387
|
-
},
|
|
388
|
-
},
|
|
389
|
-
},
|
|
390
|
-
],
|
|
391
|
-
[EntityPrivacyPolicy_1.EntityAuthorizationAction.UPDATE]: [],
|
|
392
|
-
// one DELETE auth action for grandchild (since it's being deleted via cascade)
|
|
393
|
-
[EntityPrivacyPolicy_1.EntityAuthorizationAction.DELETE]: [
|
|
394
|
-
{
|
|
395
|
-
cascadingDeleteCause: {
|
|
396
|
-
entity: globals_1.expect.any(ChildEntity),
|
|
397
|
-
cascadingDeleteCause: {
|
|
398
|
-
entity: globals_1.expect.any(ParentEntity),
|
|
399
|
-
cascadingDeleteCause: null,
|
|
400
|
-
},
|
|
401
|
-
},
|
|
402
|
-
},
|
|
403
|
-
],
|
|
404
|
-
},
|
|
405
|
-
});
|
|
406
|
-
});
|
|
407
|
-
});
|
|
408
|
-
(0, globals_1.describe)('EntityEdgeDeletionBehavior.SET_NULL', () => {
|
|
409
|
-
(0, globals_1.it)('sets null', async () => {
|
|
410
|
-
const { ParentEntity, ChildEntity, GrandChildEntity, triggerExecutionCounts, privacyPolicyEvaluationRecords, } = makeEntityClasses(EntityFieldDefinition_1.EntityEdgeDeletionBehavior.SET_NULL);
|
|
411
|
-
const companionProvider = (0, createUnitTestEntityCompanionProvider_1.createUnitTestEntityCompanionProvider)();
|
|
412
|
-
const viewerContext = new TestViewerContext_1.TestViewerContext(companionProvider);
|
|
413
|
-
const parent = await ParentEntity.creator(viewerContext).createAsync();
|
|
414
|
-
const child = await ChildEntity.creator(viewerContext)
|
|
415
|
-
.setField('parent_id', parent.getID())
|
|
416
|
-
.createAsync();
|
|
417
|
-
const grandchild = await GrandChildEntity.creator(viewerContext)
|
|
418
|
-
.setField('parent_id', child.getID())
|
|
419
|
-
.createAsync();
|
|
420
|
-
await (0, globals_1.expect)(ParentEntity.loader(viewerContext).loadByIDNullableAsync(parent.getID())).resolves.not.toBeNull();
|
|
421
|
-
await (0, globals_1.expect)(ChildEntity.loader(viewerContext).loadByIDNullableAsync(child.getID())).resolves.not.toBeNull();
|
|
422
|
-
await (0, globals_1.expect)(GrandChildEntity.loader(viewerContext).loadByIDNullableAsync(grandchild.getID())).resolves.not.toBeNull();
|
|
423
|
-
privacyPolicyEvaluationRecords.shouldRecord = true;
|
|
424
|
-
await ParentEntity.deleter(parent).deleteAsync();
|
|
425
|
-
privacyPolicyEvaluationRecords.shouldRecord = false;
|
|
426
|
-
await (0, globals_1.expect)(ParentEntity.loader(viewerContext).loadByIDNullableAsync(parent.getID())).resolves.toBeNull();
|
|
427
|
-
const loadedChild = await ChildEntity.loader(viewerContext).loadByIDAsync(child.getID());
|
|
428
|
-
(0, globals_1.expect)(loadedChild.getField('parent_id')).toBeNull();
|
|
429
|
-
const loadedGrandchild = await GrandChildEntity.loader(viewerContext).loadByIDAsync(grandchild.getID());
|
|
430
|
-
(0, globals_1.expect)(loadedGrandchild.getField('parent_id')).toEqual(loadedChild.getID());
|
|
431
|
-
// two calls for only parent trigger, one beforeDelete, one afterDelete
|
|
432
|
-
// when using set null the descendants aren't deleted
|
|
433
|
-
(0, globals_1.expect)(triggerExecutionCounts).toMatchObject({
|
|
434
|
-
ParentEntityDeletion: 2,
|
|
435
|
-
ChildEntityDeletion: 0,
|
|
436
|
-
GrandChildEntityDeletion: 0,
|
|
437
|
-
ParentEntityUpdate: 0,
|
|
438
|
-
ChildEntityUpdate: 2,
|
|
439
|
-
GrandChildEntityUpdate: 0,
|
|
440
|
-
});
|
|
441
|
-
(0, globals_1.expect)(privacyPolicyEvaluationRecords).toMatchObject({
|
|
442
|
-
ParentEntity: {
|
|
443
|
-
[EntityPrivacyPolicy_1.EntityAuthorizationAction.CREATE]: [],
|
|
444
|
-
[EntityPrivacyPolicy_1.EntityAuthorizationAction.READ]: [],
|
|
445
|
-
[EntityPrivacyPolicy_1.EntityAuthorizationAction.UPDATE]: [],
|
|
446
|
-
// one DELETE auth action for parent (since it's being deleted)
|
|
447
|
-
[EntityPrivacyPolicy_1.EntityAuthorizationAction.DELETE]: [{ cascadingDeleteCause: null }],
|
|
448
|
-
},
|
|
449
|
-
ChildEntity: {
|
|
450
|
-
[EntityPrivacyPolicy_1.EntityAuthorizationAction.CREATE]: [],
|
|
451
|
-
// two READs auth action for Child during parent deletion:
|
|
452
|
-
// 1. Read to initiate the SET_NULL (to update the entity)
|
|
453
|
-
// 1. Read automatically post-update
|
|
454
|
-
// no other entities are read since it is not cascaded past first entity
|
|
455
|
-
[EntityPrivacyPolicy_1.EntityAuthorizationAction.READ]: [
|
|
456
|
-
{
|
|
457
|
-
cascadingDeleteCause: {
|
|
458
|
-
entity: globals_1.expect.any(ParentEntity),
|
|
459
|
-
cascadingDeleteCause: null,
|
|
460
|
-
},
|
|
461
|
-
},
|
|
462
|
-
{
|
|
463
|
-
cascadingDeleteCause: {
|
|
464
|
-
entity: globals_1.expect.any(ParentEntity),
|
|
465
|
-
cascadingDeleteCause: null,
|
|
466
|
-
},
|
|
467
|
-
},
|
|
468
|
-
],
|
|
469
|
-
// one UPDATE to set null
|
|
470
|
-
[EntityPrivacyPolicy_1.EntityAuthorizationAction.UPDATE]: [
|
|
471
|
-
{
|
|
472
|
-
cascadingDeleteCause: {
|
|
473
|
-
entity: globals_1.expect.any(ParentEntity),
|
|
474
|
-
cascadingDeleteCause: null,
|
|
475
|
-
},
|
|
476
|
-
},
|
|
477
|
-
],
|
|
478
|
-
[EntityPrivacyPolicy_1.EntityAuthorizationAction.DELETE]: [],
|
|
479
|
-
},
|
|
480
|
-
GrandChildEntity: {
|
|
481
|
-
[EntityPrivacyPolicy_1.EntityAuthorizationAction.CREATE]: [],
|
|
482
|
-
[EntityPrivacyPolicy_1.EntityAuthorizationAction.READ]: [],
|
|
483
|
-
[EntityPrivacyPolicy_1.EntityAuthorizationAction.UPDATE]: [],
|
|
484
|
-
[EntityPrivacyPolicy_1.EntityAuthorizationAction.DELETE]: [],
|
|
485
|
-
},
|
|
486
|
-
});
|
|
487
|
-
});
|
|
488
|
-
});
|
|
489
|
-
(0, globals_1.describe)('EntityEdgeDeletionBehavior.SET_NULL_INVALIDATE_CACHE_ONLY', () => {
|
|
490
|
-
(0, globals_1.it)('invalidates the cache', async () => {
|
|
491
|
-
const { ParentEntity, ChildEntity, GrandChildEntity, triggerExecutionCounts, privacyPolicyEvaluationRecords, } = makeEntityClasses(EntityFieldDefinition_1.EntityEdgeDeletionBehavior.SET_NULL_INVALIDATE_CACHE_ONLY);
|
|
492
|
-
const companionProvider = (0, createUnitTestEntityCompanionProvider_1.createUnitTestEntityCompanionProvider)();
|
|
493
|
-
const viewerContext = new TestViewerContext_1.TestViewerContext(companionProvider);
|
|
494
|
-
const parent = await ParentEntity.creator(viewerContext).createAsync();
|
|
495
|
-
const child = await ChildEntity.creator(viewerContext)
|
|
496
|
-
.setField('parent_id', parent.getID())
|
|
497
|
-
.createAsync();
|
|
498
|
-
const grandchild = await GrandChildEntity.creator(viewerContext)
|
|
499
|
-
.setField('parent_id', child.getID())
|
|
500
|
-
.createAsync();
|
|
501
|
-
await (0, globals_1.expect)(ParentEntity.loader(viewerContext).loadByIDNullableAsync(parent.getID())).resolves.not.toBeNull();
|
|
502
|
-
await (0, globals_1.expect)(ChildEntity.loader(viewerContext).loadByFieldEqualingAsync('parent_id', parent.getID())).resolves.not.toBeNull();
|
|
503
|
-
await (0, globals_1.expect)(GrandChildEntity.loader(viewerContext).loadByFieldEqualingAsync('parent_id', child.getID())).resolves.not.toBeNull();
|
|
504
|
-
const childCacheAdapter = viewerContext.getViewerScopedEntityCompanionForClass(ChildEntity)['entityCompanion']['tableDataCoordinator']['cacheAdapter'];
|
|
505
|
-
const childCachedBefore = await childCacheAdapter.loadManyAsync(new SingleFieldHolder_1.SingleFieldHolder('parent_id'), [new SingleFieldHolder_1.SingleFieldValueHolder(parent.getID())]);
|
|
506
|
-
(0, globals_1.expect)(childCachedBefore.get(new SingleFieldHolder_1.SingleFieldValueHolder(parent.getID()))?.status).toEqual(ReadThroughEntityCache_1.CacheStatus.HIT);
|
|
507
|
-
const grandChildCacheAdapter = viewerContext.getViewerScopedEntityCompanionForClass(GrandChildEntity)['entityCompanion']['tableDataCoordinator']['cacheAdapter'];
|
|
508
|
-
const grandChildCachedBefore = await grandChildCacheAdapter.loadManyAsync(new SingleFieldHolder_1.SingleFieldHolder('parent_id'), [new SingleFieldHolder_1.SingleFieldValueHolder(child.getID())]);
|
|
509
|
-
(0, globals_1.expect)(grandChildCachedBefore.get(new SingleFieldHolder_1.SingleFieldValueHolder(child.getID()))?.status).toEqual(ReadThroughEntityCache_1.CacheStatus.HIT);
|
|
510
|
-
privacyPolicyEvaluationRecords.shouldRecord = true;
|
|
511
|
-
await ParentEntity.deleter(parent).deleteAsync();
|
|
512
|
-
privacyPolicyEvaluationRecords.shouldRecord = false;
|
|
513
|
-
const childCachedAfter = await childCacheAdapter.loadManyAsync(new SingleFieldHolder_1.SingleFieldHolder('parent_id'), [new SingleFieldHolder_1.SingleFieldValueHolder(parent.getID())]);
|
|
514
|
-
(0, globals_1.expect)(childCachedAfter.get(new SingleFieldHolder_1.SingleFieldValueHolder(parent.getID()))?.status).toEqual(ReadThroughEntityCache_1.CacheStatus.MISS);
|
|
515
|
-
const grandChildCachedAfter = await grandChildCacheAdapter.loadManyAsync(new SingleFieldHolder_1.SingleFieldHolder('parent_id'), [new SingleFieldHolder_1.SingleFieldValueHolder(child.getID())]);
|
|
516
|
-
(0, globals_1.expect)(grandChildCachedAfter.get(new SingleFieldHolder_1.SingleFieldValueHolder(child.getID()))?.status).toEqual(ReadThroughEntityCache_1.CacheStatus.HIT);
|
|
517
|
-
await (0, globals_1.expect)(ParentEntity.loader(viewerContext).loadByIDNullableAsync(parent.getID())).resolves.toBeNull();
|
|
518
|
-
const loadedChild = await ChildEntity.loader(viewerContext).loadByIDAsync(child.getID());
|
|
519
|
-
(0, globals_1.expect)(loadedChild).not.toBeNull();
|
|
520
|
-
const loadedGrandchild = await GrandChildEntity.loader(viewerContext).loadByIDAsync(grandchild.getID());
|
|
521
|
-
(0, globals_1.expect)(loadedGrandchild.getField('parent_id')).toEqual(loadedChild.getID());
|
|
522
|
-
// two calls for only parent trigger, one beforeDelete, one afterDelete
|
|
523
|
-
// when using set null the descendants aren't deleted
|
|
524
|
-
(0, globals_1.expect)(triggerExecutionCounts).toMatchObject({
|
|
525
|
-
ParentEntityDeletion: 2,
|
|
526
|
-
ChildEntityDeletion: 0,
|
|
527
|
-
GrandChildEntityDeletion: 0,
|
|
528
|
-
ParentEntityUpdate: 0,
|
|
529
|
-
ChildEntityUpdate: 2,
|
|
530
|
-
GrandChildEntityUpdate: 0,
|
|
531
|
-
});
|
|
532
|
-
(0, globals_1.expect)(privacyPolicyEvaluationRecords).toMatchObject({
|
|
533
|
-
ParentEntity: {
|
|
534
|
-
[EntityPrivacyPolicy_1.EntityAuthorizationAction.CREATE]: [],
|
|
535
|
-
[EntityPrivacyPolicy_1.EntityAuthorizationAction.READ]: [],
|
|
536
|
-
[EntityPrivacyPolicy_1.EntityAuthorizationAction.UPDATE]: [],
|
|
537
|
-
// one DELETE auth action for parent (since it's being deleted)
|
|
538
|
-
[EntityPrivacyPolicy_1.EntityAuthorizationAction.DELETE]: [{ cascadingDeleteCause: null }],
|
|
539
|
-
},
|
|
540
|
-
ChildEntity: {
|
|
541
|
-
[EntityPrivacyPolicy_1.EntityAuthorizationAction.CREATE]: [],
|
|
542
|
-
// two READs auth action for child in order to update via cascade
|
|
543
|
-
// no other entities are read since it is not cascaded past first entity
|
|
544
|
-
[EntityPrivacyPolicy_1.EntityAuthorizationAction.READ]: [
|
|
545
|
-
{
|
|
546
|
-
cascadingDeleteCause: {
|
|
547
|
-
entity: globals_1.expect.any(ParentEntity),
|
|
548
|
-
cascadingDeleteCause: null,
|
|
549
|
-
},
|
|
550
|
-
},
|
|
551
|
-
{
|
|
552
|
-
cascadingDeleteCause: {
|
|
553
|
-
entity: globals_1.expect.any(ParentEntity),
|
|
554
|
-
cascadingDeleteCause: null,
|
|
555
|
-
},
|
|
556
|
-
},
|
|
557
|
-
],
|
|
558
|
-
// one UPDATE to set null
|
|
559
|
-
[EntityPrivacyPolicy_1.EntityAuthorizationAction.UPDATE]: [
|
|
560
|
-
{
|
|
561
|
-
cascadingDeleteCause: {
|
|
562
|
-
entity: globals_1.expect.any(ParentEntity),
|
|
563
|
-
cascadingDeleteCause: null,
|
|
564
|
-
},
|
|
565
|
-
},
|
|
566
|
-
],
|
|
567
|
-
[EntityPrivacyPolicy_1.EntityAuthorizationAction.DELETE]: [],
|
|
568
|
-
},
|
|
569
|
-
GrandChildEntity: {
|
|
570
|
-
[EntityPrivacyPolicy_1.EntityAuthorizationAction.CREATE]: [],
|
|
571
|
-
[EntityPrivacyPolicy_1.EntityAuthorizationAction.READ]: [],
|
|
572
|
-
[EntityPrivacyPolicy_1.EntityAuthorizationAction.UPDATE]: [],
|
|
573
|
-
[EntityPrivacyPolicy_1.EntityAuthorizationAction.DELETE]: [],
|
|
574
|
-
},
|
|
575
|
-
});
|
|
576
|
-
});
|
|
577
|
-
});
|
|
578
|
-
(0, globals_1.describe)('EntityEdgeDeletionBehavior.CASCADE_DELETE_INVALIDATE_CACHE_ONLY', () => {
|
|
579
|
-
(0, globals_1.it)('invalidates the cache', async () => {
|
|
580
|
-
const { ParentEntity, ChildEntity, GrandChildEntity, triggerExecutionCounts, privacyPolicyEvaluationRecords, } = makeEntityClasses(EntityFieldDefinition_1.EntityEdgeDeletionBehavior.CASCADE_DELETE_INVALIDATE_CACHE_ONLY);
|
|
581
|
-
const companionProvider = (0, createUnitTestEntityCompanionProvider_1.createUnitTestEntityCompanionProvider)();
|
|
582
|
-
const viewerContext = new TestViewerContext_1.TestViewerContext(companionProvider);
|
|
583
|
-
const parent = await ParentEntity.creator(viewerContext).createAsync();
|
|
584
|
-
const child = await ChildEntity.creator(viewerContext)
|
|
585
|
-
.setField('parent_id', parent.getID())
|
|
586
|
-
.createAsync();
|
|
587
|
-
const grandchild = await GrandChildEntity.creator(viewerContext)
|
|
588
|
-
.setField('parent_id', child.getID())
|
|
589
|
-
.createAsync();
|
|
590
|
-
await (0, globals_1.expect)(ParentEntity.loader(viewerContext).loadByIDNullableAsync(parent.getID())).resolves.not.toBeNull();
|
|
591
|
-
await (0, globals_1.expect)(ChildEntity.loader(viewerContext).loadByFieldEqualingAsync('parent_id', parent.getID())).resolves.not.toBeNull();
|
|
592
|
-
await (0, globals_1.expect)(GrandChildEntity.loader(viewerContext).loadByFieldEqualingAsync('parent_id', child.getID())).resolves.not.toBeNull();
|
|
593
|
-
const childCacheAdapter = viewerContext.getViewerScopedEntityCompanionForClass(ChildEntity)['entityCompanion']['tableDataCoordinator']['cacheAdapter'];
|
|
594
|
-
const childCachedBefore = await childCacheAdapter.loadManyAsync(new SingleFieldHolder_1.SingleFieldHolder('parent_id'), [new SingleFieldHolder_1.SingleFieldValueHolder(parent.getID())]);
|
|
595
|
-
(0, globals_1.expect)(childCachedBefore.get(new SingleFieldHolder_1.SingleFieldValueHolder(parent.getID()))?.status).toEqual(ReadThroughEntityCache_1.CacheStatus.HIT);
|
|
596
|
-
const grandChildCacheAdapter = viewerContext.getViewerScopedEntityCompanionForClass(GrandChildEntity)['entityCompanion']['tableDataCoordinator']['cacheAdapter'];
|
|
597
|
-
const grandChildCachedBefore = await grandChildCacheAdapter.loadManyAsync(new SingleFieldHolder_1.SingleFieldHolder('parent_id'), [new SingleFieldHolder_1.SingleFieldValueHolder(child.getID())]);
|
|
598
|
-
(0, globals_1.expect)(grandChildCachedBefore.get(new SingleFieldHolder_1.SingleFieldValueHolder(child.getID()))?.status).toEqual(ReadThroughEntityCache_1.CacheStatus.HIT);
|
|
599
|
-
privacyPolicyEvaluationRecords.shouldRecord = true;
|
|
600
|
-
await ParentEntity.deleter(parent).deleteAsync();
|
|
601
|
-
privacyPolicyEvaluationRecords.shouldRecord = false;
|
|
602
|
-
const childCachedAfter = await childCacheAdapter.loadManyAsync(new SingleFieldHolder_1.SingleFieldHolder('parent_id'), [new SingleFieldHolder_1.SingleFieldValueHolder(parent.getID())]);
|
|
603
|
-
(0, globals_1.expect)(childCachedAfter.get(new SingleFieldHolder_1.SingleFieldValueHolder(parent.getID()))?.status).toEqual(ReadThroughEntityCache_1.CacheStatus.MISS);
|
|
604
|
-
const grandChildCachedAfter = await grandChildCacheAdapter.loadManyAsync(new SingleFieldHolder_1.SingleFieldHolder('parent_id'), [new SingleFieldHolder_1.SingleFieldValueHolder(child.getID())]);
|
|
605
|
-
(0, globals_1.expect)(grandChildCachedAfter.get(new SingleFieldHolder_1.SingleFieldValueHolder(child.getID()))?.status).toEqual(ReadThroughEntityCache_1.CacheStatus.MISS);
|
|
606
|
-
await (0, globals_1.expect)(ParentEntity.loader(viewerContext).loadByIDNullableAsync(parent.getID())).resolves.toBeNull();
|
|
607
|
-
await (0, globals_1.expect)(ChildEntity.loader(viewerContext).loadByIDNullableAsync(child.getID())).resolves.not.toBeNull();
|
|
608
|
-
await (0, globals_1.expect)(GrandChildEntity.loader(viewerContext).loadByIDNullableAsync(grandchild.getID())).resolves.not.toBeNull();
|
|
609
|
-
// two calls for each trigger, one beforeDelete, one afterDelete
|
|
610
|
-
(0, globals_1.expect)(triggerExecutionCounts).toMatchObject({
|
|
611
|
-
ParentEntityDeletion: 2,
|
|
612
|
-
ChildEntityDeletion: 2,
|
|
613
|
-
GrandChildEntityDeletion: 2,
|
|
614
|
-
ParentEntityUpdate: 0,
|
|
615
|
-
ChildEntityUpdate: 0,
|
|
616
|
-
GrandChildEntityUpdate: 0,
|
|
617
|
-
});
|
|
618
|
-
(0, globals_1.expect)(privacyPolicyEvaluationRecords).toMatchObject({
|
|
619
|
-
ParentEntity: {
|
|
620
|
-
[EntityPrivacyPolicy_1.EntityAuthorizationAction.CREATE]: [],
|
|
621
|
-
[EntityPrivacyPolicy_1.EntityAuthorizationAction.READ]: [],
|
|
622
|
-
[EntityPrivacyPolicy_1.EntityAuthorizationAction.UPDATE]: [],
|
|
623
|
-
// one DELETE auth action for parent (since it's being deleted)
|
|
624
|
-
[EntityPrivacyPolicy_1.EntityAuthorizationAction.DELETE]: [{ cascadingDeleteCause: null }],
|
|
625
|
-
},
|
|
626
|
-
ChildEntity: {
|
|
627
|
-
[EntityPrivacyPolicy_1.EntityAuthorizationAction.CREATE]: [],
|
|
628
|
-
// one READ auth action for child in order to delete via cascade
|
|
629
|
-
[EntityPrivacyPolicy_1.EntityAuthorizationAction.READ]: [
|
|
630
|
-
{
|
|
631
|
-
cascadingDeleteCause: {
|
|
632
|
-
entity: globals_1.expect.any(ParentEntity),
|
|
633
|
-
cascadingDeleteCause: null,
|
|
634
|
-
},
|
|
635
|
-
},
|
|
636
|
-
],
|
|
637
|
-
[EntityPrivacyPolicy_1.EntityAuthorizationAction.UPDATE]: [],
|
|
638
|
-
// one DELETE auth action for child (since it's being deleted via cascade)
|
|
639
|
-
[EntityPrivacyPolicy_1.EntityAuthorizationAction.DELETE]: [
|
|
640
|
-
{
|
|
641
|
-
cascadingDeleteCause: {
|
|
642
|
-
entity: globals_1.expect.any(ParentEntity),
|
|
643
|
-
cascadingDeleteCause: null,
|
|
644
|
-
},
|
|
645
|
-
},
|
|
646
|
-
],
|
|
647
|
-
},
|
|
648
|
-
GrandChildEntity: {
|
|
649
|
-
[EntityPrivacyPolicy_1.EntityAuthorizationAction.CREATE]: [],
|
|
650
|
-
// one READ auth action for grandchild in order to delete via cascade
|
|
651
|
-
[EntityPrivacyPolicy_1.EntityAuthorizationAction.READ]: [
|
|
652
|
-
{
|
|
653
|
-
cascadingDeleteCause: {
|
|
654
|
-
entity: globals_1.expect.any(ChildEntity),
|
|
655
|
-
cascadingDeleteCause: {
|
|
656
|
-
entity: globals_1.expect.any(ParentEntity),
|
|
657
|
-
cascadingDeleteCause: null,
|
|
658
|
-
},
|
|
659
|
-
},
|
|
660
|
-
},
|
|
661
|
-
],
|
|
662
|
-
[EntityPrivacyPolicy_1.EntityAuthorizationAction.UPDATE]: [],
|
|
663
|
-
// one DELETE auth action for grandchild (since it's being deleted via cascade)
|
|
664
|
-
[EntityPrivacyPolicy_1.EntityAuthorizationAction.DELETE]: [
|
|
665
|
-
{
|
|
666
|
-
cascadingDeleteCause: {
|
|
667
|
-
entity: globals_1.expect.any(ChildEntity),
|
|
668
|
-
cascadingDeleteCause: {
|
|
669
|
-
entity: globals_1.expect.any(ParentEntity),
|
|
670
|
-
cascadingDeleteCause: null,
|
|
671
|
-
},
|
|
672
|
-
},
|
|
673
|
-
},
|
|
674
|
-
],
|
|
675
|
-
},
|
|
676
|
-
});
|
|
677
|
-
});
|
|
678
|
-
});
|
|
679
|
-
});
|
|
680
|
-
//# sourceMappingURL=EntityEdges-test.js.map
|