Skip to content

Commit 19d4bbf

Browse files
RubenHalmanjunners
authored andcommitted
implement additional usage check #67
1 parent 25d390e commit 19d4bbf

File tree

3 files changed

+40
-11
lines changed

3 files changed

+40
-11
lines changed

example-flows/force-app/main/default/flows/No_Missing_Null_Handler.flow-meta.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@
131131
<targetReference>Check_object_type</targetReference>
132132
</connector>
133133
</start>
134-
<status>Draft</status>
134+
<status>Active</status>
135135
<variables>
136136
<name>errorMessage</name>
137137
<dataType>String</dataType>

src/main/rules/MissingNullHandler.ts

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,12 @@ export class MissingNullHandler extends AdvancedRule implements core.IRuleDefini
2424
(node) => node.metaType === "node" && node.subtype === "decisions"
2525
) as core.FlowNode[];
2626
const getOperationsWithoutNullHandler = [];
27+
2728
for (const getElement of getOperationElements) {
2829
const elementName = getElement.name;
2930
let nullCheckFound = false;
3031
let resultReferences: string[] = [];
32+
3133
if (getElement.element["storeOutputAutomatically"]) {
3234
resultReferences = [elementName];
3335
} else if (getElement.element["outputReference"]) {
@@ -38,6 +40,17 @@ export class MissingNullHandler extends AdvancedRule implements core.IRuleDefini
3840
resultReferences.push(assignment.assignToReference);
3941
}
4042
}
43+
44+
// ✅ Skip check if result is never used inside the flow
45+
const resultIsUsed = flow.elements.some((el) => {
46+
if (el.name === getElement.name) return false;
47+
const json = JSON.stringify(el.element);
48+
return resultReferences.some((ref) =>
49+
json.includes(`"${ref}"`) || json.includes(`"${ref}.`)
50+
);
51+
});
52+
if (!resultIsUsed) continue;
53+
4154
for (const el of decisionElements) {
4255
let rules = el.element["rules"];
4356
const isRuleAnArray = Array.isArray(rules);
@@ -57,7 +70,7 @@ export class MissingNullHandler extends AdvancedRule implements core.IRuleDefini
5770
if (condition.leftValueReference && condition.leftValueReference.length > 0) {
5871
const valueReference = condition.leftValueReference;
5972
for (const ref of resultReferences) {
60-
referenceFound = ref.includes(valueReference);
73+
referenceFound = valueReference.startsWith(ref);
6174
if (referenceFound) {
6275
break;
6376
}
@@ -86,10 +99,12 @@ export class MissingNullHandler extends AdvancedRule implements core.IRuleDefini
8699
}
87100
}
88101
}
102+
89103
if (!nullCheckFound) {
90104
getOperationsWithoutNullHandler.push(getElement);
91105
}
92106
}
107+
93108
const results = [];
94109
for (const det of getOperationsWithoutNullHandler) {
95110
results.push(new core.ResultDetails(det));

tests/No_Missing_Null_Handler.test.ts

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,36 @@ import * as path from "path";
33

44
import * as core from "../src";
55

6-
describe("MissingNullHandler ", () => {
6+
describe("MissingNullHandler", () => {
77
const example_uri = path.join(
88
__dirname,
9-
"../example-flows/force-app/main/default/flows/No_Missing_Null_Handler.flow-meta.flow-meta.xml"
9+
"../example-flows/force-app/main/default/flows/No_Missing_Null_Handler.flow-meta.xml"
1010
);
11-
it("should not return a result ", async () => {
11+
12+
it("should not return a result", async () => {
1213
const flows = await core.parse([example_uri]);
14+
expect(flows.length).toBeGreaterThan(0); // Fail clearly if flow doesn't load
15+
16+
console.log("Parsed flows:", flows.map(f => ({
17+
name: f.name,
18+
type: f.type,
19+
status: f.status
20+
})));
21+
1322
const ruleConfig = {
1423
rules: {
1524
MissingNullHandler: {
16-
severity: "error",
17-
},
18-
},
25+
severity: "error"
26+
}
27+
}
1928
};
29+
2030
const results: core.ScanResult[] = core.scan(flows, ruleConfig);
21-
expect(results[0].ruleResults[0].ruleName).toBe("MissingNullHandler");
22-
expect(results[0].ruleResults[0].occurs).toBe(false);
31+
console.log("Scan results:", JSON.stringify(results, null, 2));
32+
33+
expect(results.length).toBeGreaterThan(0); // 🔥 This is your problem now
34+
const ruleResult = results[0].ruleResults.find(r => r.ruleName === "MissingNullHandler");
35+
expect(ruleResult).toBeDefined();
36+
expect(ruleResult.occurs).toBe(false);
2337
});
24-
});
38+
});

0 commit comments

Comments
 (0)