fix: Correctly update trigger field dependency map (#15733)

This commit is contained in:
Favour Ohanekwu 2022-08-05 18:58:38 +01:00 committed by GitHub
parent f85cbb9938
commit 5c7f4009cb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 79 additions and 57 deletions

View File

@ -385,55 +385,6 @@ describe("DataTreeEvaluator", () => {
});
});
describe("triggerfield dependency map", () => {
beforeEach(() => {
// @ts-expect-error: Types are not available
dataTreeEvaluator.createFirstTree(lintingUnEvalTree as DataTree);
});
it("Creates correct triggerFieldDependencyMap", () => {
expect(dataTreeEvaluator.triggerFieldDependencyMap).toEqual({
"Button3.onClick": ["Api1", "Button2", "Api2"],
"Button2.onClick": ["Api2"],
});
});
it("Creates correct triggerFieldInverseDependencyMap", () => {
expect(dataTreeEvaluator.triggerFieldInverseDependencyMap).toEqual({
Api1: ["Button3.onClick"],
Api2: ["Button3.onClick", "Button2.onClick"],
Button2: ["Button3.onClick"],
});
});
it("Correctly updates triggerFieldDependencyMap and triggerFieldInverseDependencyMap", () => {
const newUnEvalTree = ({ ...lintingUnEvalTree } as unknown) as DataTree;
// delete Api2
delete newUnEvalTree["Api2"];
dataTreeEvaluator.updateDataTree(newUnEvalTree);
expect(dataTreeEvaluator.triggerFieldDependencyMap).toEqual({
"Button3.onClick": ["Api1", "Button2"],
"Button2.onClick": [],
});
expect(dataTreeEvaluator.triggerFieldInverseDependencyMap).toEqual({
Api1: ["Button3.onClick"],
Button2: ["Button3.onClick"],
});
// Add Api2
// @ts-expect-error: Types are not available
newUnEvalTree["Api2"] = { ...lintingUnEvalTree }["Api2"];
dataTreeEvaluator.updateDataTree(newUnEvalTree);
expect(dataTreeEvaluator.triggerFieldDependencyMap).toEqual({
"Button3.onClick": ["Api1", "Button2", "Api2"],
"Button2.onClick": ["Api2"],
});
expect(dataTreeEvaluator.triggerFieldInverseDependencyMap).toEqual({
Api1: ["Button3.onClick"],
Api2: ["Button3.onClick", "Button2.onClick"],
Button2: ["Button3.onClick"],
});
});
});
describe("lintTree", () => {
const dataTreeEvaluator = new DataTreeEvaluator(widgetConfigMap);
beforeEach(() => {
@ -538,4 +489,73 @@ describe("DataTreeEvaluator", () => {
).toEqual(expectedButton2LintError);
});
});
describe("triggerfield dependency map", () => {
beforeEach(() => {
// @ts-expect-error: Types are not available
dataTreeEvaluator.createFirstTree(lintingUnEvalTree as DataTree);
});
it("Creates correct triggerFieldDependencyMap", () => {
expect(dataTreeEvaluator.triggerFieldDependencyMap).toEqual({
"Button3.onClick": ["Api1", "Button2", "Api2"],
"Button2.onClick": ["Api2"],
});
});
it("Creates correct triggerFieldInverseDependencyMap", () => {
expect(dataTreeEvaluator.triggerFieldInverseDependencyMap).toEqual({
Api1: ["Button3.onClick"],
Api2: ["Button3.onClick", "Button2.onClick"],
Button2: ["Button3.onClick"],
});
});
it("Correctly updates triggerFieldDependencyMap and triggerFieldInverseDependencyMap", () => {
const newUnEvalTree = ({ ...lintingUnEvalTree } as unknown) as DataTree;
// delete Api2
delete newUnEvalTree["Api2"];
dataTreeEvaluator.updateDataTree(newUnEvalTree);
expect(dataTreeEvaluator.triggerFieldDependencyMap).toEqual({
"Button3.onClick": ["Api1", "Button2"],
"Button2.onClick": [],
});
expect(dataTreeEvaluator.triggerFieldInverseDependencyMap).toEqual({
Api1: ["Button3.onClick"],
Button2: ["Button3.onClick"],
});
// Add Api2
// @ts-expect-error: Types are not available
newUnEvalTree["Api2"] = { ...lintingUnEvalTree }["Api2"];
dataTreeEvaluator.updateDataTree(newUnEvalTree);
expect(dataTreeEvaluator.triggerFieldDependencyMap).toEqual({
"Button3.onClick": ["Api1", "Button2", "Api2"],
"Button2.onClick": ["Api2"],
});
expect(dataTreeEvaluator.triggerFieldInverseDependencyMap).toEqual({
Api1: ["Button3.onClick"],
Api2: ["Button3.onClick", "Button2.onClick"],
Button2: ["Button3.onClick"],
});
// self-reference Button2
const newButton2 = { ...lintingUnEvalTree }["Button2"];
newButton2.onClick = "{{Api2.run(); AbsentEntity.run(); Button2}}";
// @ts-expect-error: Types are not available
newUnEvalTree["Button2"] = newButton2;
dataTreeEvaluator.updateDataTree(newUnEvalTree);
// delete Button2
delete newUnEvalTree["Button2"];
dataTreeEvaluator.updateDataTree(newUnEvalTree);
expect(dataTreeEvaluator.triggerFieldDependencyMap).toEqual({
"Button3.onClick": ["Api1", "Api2"],
});
expect(dataTreeEvaluator.triggerFieldInverseDependencyMap).toEqual({
Api1: ["Button3.onClick"],
Api2: ["Button3.onClick"],
});
});
});
});

View File

@ -238,14 +238,6 @@ export const updateDependencyMap = ({
},
);
if (entityName === dataTreeDiff.payload.propertyPath) {
if (isWidget(entity)) {
entity.dynamicTriggerPathList?.forEach((triggerFieldName) => {
delete dataTreeEvalRef.triggerFieldDependencyMap[
`${entityName}.${triggerFieldName.key}`
];
didUpdateTriggerDependencyMap = true;
});
}
// When deleted entity is referenced in a trigger field, remove deleted entity from it's triggerfieldDependencyMap
if (
entityName in dataTreeEvalRef.triggerFieldInverseDependencyMap
@ -264,6 +256,16 @@ export const updateDependencyMap = ({
].filter((field) => field !== entityName);
});
}
// Remove deleted trigger fields from triggerFieldDependencyMap
if (isWidget(entity)) {
entity.dynamicTriggerPathList?.forEach((triggerFieldName) => {
delete dataTreeEvalRef.triggerFieldDependencyMap[
`${entityName}.${triggerFieldName.key}`
];
didUpdateTriggerDependencyMap = true;
});
}
}
break;