From 0d35a5812d4fb3243625d347f08d8b5963a23e53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?iago=20sardi=C3=B1a?= Date: Sat, 16 Nov 2024 18:42:33 +0100 Subject: [PATCH 1/6] Add factResult to fact-comparison values --- src/rule.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/rule.js b/src/rule.js index 39e5a32..035b8bd 100644 --- a/src/rule.js +++ b/src/rule.js @@ -231,6 +231,9 @@ class Rule extends EventEmitter { .then((evaluationResult) => { const passes = evaluationResult.result condition.factResult = evaluationResult.leftHandSideValue + if(typeof condition.value === 'object' && condition.value !== null){ + condition.value.factResult = evaluationResult.rightHandSideValue; + } condition.result = passes return passes }) From eeafc9406e38b5de348a86fd0c75a2bcc06603b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iago=20Sardi=C3=B1a?= Date: Sat, 16 Nov 2024 18:49:20 +0100 Subject: [PATCH 2/6] Fix test and comply with styling --- src/rule.js | 4 ++-- test/acceptance/acceptance.js | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/rule.js b/src/rule.js index 035b8bd..eb30080 100644 --- a/src/rule.js +++ b/src/rule.js @@ -231,8 +231,8 @@ class Rule extends EventEmitter { .then((evaluationResult) => { const passes = evaluationResult.result condition.factResult = evaluationResult.leftHandSideValue - if(typeof condition.value === 'object' && condition.value !== null){ - condition.value.factResult = evaluationResult.rightHandSideValue; + if (typeof condition.value === 'object' && condition.value !== null) { + condition.value.factResult = evaluationResult.rightHandSideValue } condition.result = passes return passes diff --git a/test/acceptance/acceptance.js b/test/acceptance/acceptance.js index fb68cc7..5b7b5c9 100644 --- a/test/acceptance/acceptance.js +++ b/test/acceptance/acceptance.js @@ -210,6 +210,7 @@ describe('Acceptance', () => { result: true, value: { fact: 'rule-created-fact', + factResult: 2, path: '$.array' } } From 33eb4d2282653601fdabcf7a50017e2df299ac32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iago=20Sardi=C3=B1a?= Date: Sun, 17 Nov 2024 12:45:26 +0100 Subject: [PATCH 3/6] Add valueResult unconditionally and more testing --- src/rule.js | 4 +--- test/acceptance/acceptance.js | 10 ++++++++-- types/index.d.ts | 1 + 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/rule.js b/src/rule.js index eb30080..3d52fbf 100644 --- a/src/rule.js +++ b/src/rule.js @@ -231,9 +231,7 @@ class Rule extends EventEmitter { .then((evaluationResult) => { const passes = evaluationResult.result condition.factResult = evaluationResult.leftHandSideValue - if (typeof condition.value === 'object' && condition.value !== null) { - condition.value.factResult = evaluationResult.rightHandSideValue - } + condition.valueResult = evaluationResult.rightHandSideValue condition.result = passes return passes }) diff --git a/test/acceptance/acceptance.js b/test/acceptance/acceptance.js index 5b7b5c9..ca470e2 100644 --- a/test/acceptance/acceptance.js +++ b/test/acceptance/acceptance.js @@ -36,6 +36,7 @@ describe('Acceptance', () => { path: '$.values', value: 2, factResult: [2], + valueResult: 2, result: true }, { @@ -43,6 +44,7 @@ describe('Acceptance', () => { operator: 'in', value: [2], factResult: 2, + valueResult: [2], result: true } ], @@ -169,7 +171,8 @@ describe('Acceptance', () => { }, path: '$.values', result: true, - value: 2 + value: 2, + valueResult: 2 }, { fact: 'low-priority', @@ -178,6 +181,9 @@ describe('Acceptance', () => { result: true, value: [ 2 + ], + valueResult: [ + 2 ] } ], @@ -202,6 +208,7 @@ describe('Acceptance', () => { factResult: [ 2 ], + valueResult: 2, operator: 'containsDivisibleValuesOf', params: { factParam: 1 @@ -210,7 +217,6 @@ describe('Acceptance', () => { result: true, value: { fact: 'rule-created-fact', - factResult: 2, path: '$.array' } } diff --git a/types/index.d.ts b/types/index.d.ts index 827e79f..6dea6b8 100644 --- a/types/index.d.ts +++ b/types/index.d.ts @@ -192,6 +192,7 @@ interface BooleanConditionResultProperties { interface ConditionResultProperties extends BooleanConditionResultProperties { factResult?: unknown + valueResult?: unknown } interface ConditionProperties { From babfb32f671617ce3f64b21104bf6f65c2438316 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iago=20Sardi=C3=B1a?= Date: Sun, 17 Nov 2024 12:56:18 +0100 Subject: [PATCH 4/6] Test for valueResult in factComparison suite --- test/engine-fact-comparison.test.js | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/test/engine-fact-comparison.test.js b/test/engine-fact-comparison.test.js index 39af590..feb08c8 100644 --- a/test/engine-fact-comparison.test.js +++ b/test/engine-fact-comparison.test.js @@ -118,4 +118,23 @@ describe('Engine: fact to fact comparison', () => { expect(eventSpy.callCount).to.equal(0) }) }) + + context('constant facts: checking valueResult and factResult', () => { + const constantCondition = { + all: [{ + fact: 'height', + operator: 'lessThanInclusive', + value: { + fact: 'width' + } + }] + } + it('result has the correct valueResult and factResult properties', async () => { + setup(constantCondition) + const result = await engine.run({ height: 1, width: 2 }) + + expect(result.results[0].conditions.all[0].factResult).to.equal(1) + expect(result.results[0].conditions.all[0].valueResult).to.equal(2) + }) + }) }) From 3678a58563b144e67b90fbda7e603a352bd6b568 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iago=20Sardi=C3=B1a?= Date: Sun, 17 Nov 2024 13:13:22 +0100 Subject: [PATCH 5/6] Add valueResult to condition serializer --- src/condition.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/condition.js b/src/condition.js index 28a86a3..5668959 100644 --- a/src/condition.js +++ b/src/condition.js @@ -62,6 +62,9 @@ export default class Condition { if (this.factResult !== undefined) { props.factResult = this.factResult } + if (this.valueResult !== undefined) { + props.valueResult = this.valueResult + } if (this.result !== undefined) { props.result = this.result } From 8e8b3f17a4f9042cff79f378c799ec4e4c3ddd34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iago=20Sardi=C3=B1a?= Date: Sun, 17 Nov 2024 13:15:05 +0100 Subject: [PATCH 6/6] Fix serialized tests --- test/engine-event.test.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/engine-event.test.js b/test/engine-event.test.js index d86f75c..a4035dd 100644 --- a/test/engine-event.test.js +++ b/test/engine-event.test.js @@ -642,7 +642,7 @@ describe('Engine: event', () => { await engine.run() const ruleResult = successSpy.getCall(0).args[2] const expected = - '{"conditions":{"priority":1,"any":[{"name":"over 21","operator":"greaterThanInclusive","value":21,"fact":"age","factResult":21,"result":true},{"operator":"equal","value":true,"fact":"qualified","factResult":false,"result":false}]},"event":{"type":"setDrinkingFlag","params":{"canOrderDrinks":true}},"priority":100,"result":true}' + '{"conditions":{"priority":1,"any":[{"name":"over 21","operator":"greaterThanInclusive","value":21,"fact":"age","factResult":21,"valueResult":21,"result":true},{"operator":"equal","value":true,"fact":"qualified","factResult":false,"valueResult":true,"result":false}]},"event":{"type":"setDrinkingFlag","params":{"canOrderDrinks":true}},"priority":100,"result":true}' expect(JSON.stringify(ruleResult)).to.equal(expected) }) }) @@ -651,7 +651,7 @@ describe('Engine: event', () => { beforeEach(() => setupWithConditionReference()) it('serializes properties', async () => { const { results: [ruleResult] } = await engine.run() - const expected = '{"conditions":{"priority":1,"any":[{"priority":1,"all":[{"name":"over 21","operator":"greaterThanInclusive","value":21,"fact":"age","factResult":21,"result":true}]}]},"event":{"type":"awesome"},"priority":100,"result":true}' + const expected = '{"conditions":{"priority":1,"any":[{"priority":1,"all":[{"name":"over 21","operator":"greaterThanInclusive","value":21,"fact":"age","factResult":21,"valueResult":21,"result":true}]}]},"event":{"type":"awesome"},"priority":100,"result":true}' expect(JSON.stringify(ruleResult)).to.equal(expected) }) }) @@ -662,7 +662,7 @@ describe('Engine: event', () => { const { results: [ruleResult] } = await engine.run() const { conditions: { any: [conditionReference] } } = ruleResult expect(conditionReference.result).to.equal(false) - const expected = '{"conditions":{"priority":1,"any":[{"name":"nameOfTheUndefinedConditionReference","condition":"conditionThatIsNotDefined"},{"name":"over 21","operator":"greaterThanInclusive","value":21,"fact":"age","factResult":21,"result":true}]},"event":{"type":"awesome"},"priority":100,"result":true}' + const expected = '{"conditions":{"priority":1,"any":[{"name":"nameOfTheUndefinedConditionReference","condition":"conditionThatIsNotDefined"},{"name":"over 21","operator":"greaterThanInclusive","value":21,"fact":"age","factResult":21,"valueResult":21,"result":true}]},"event":{"type":"awesome"},"priority":100,"result":true}' expect(JSON.stringify(ruleResult)).to.equal(expected) }) })