diff --git a/.gitignore b/.gitignore index 18b7a23..8c0fa8a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ /node_modules npm-debug.log .vscode -.idea \ No newline at end of file +.idea +.DS_Store \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 03fe9b3..69f6bb6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +2.0.1 / 2017-07-05 + * Bugfix rule result serialization + 2.0.0 / 2017-04-21 * Publishing 2.0.0 diff --git a/src/rule-result.js b/src/rule-result.js new file mode 100644 index 0000000..9178009 --- /dev/null +++ b/src/rule-result.js @@ -0,0 +1,29 @@ +'use strict' + +import deepClone from 'lodash.clonedeep' + +export default class RuleResult { + constructor (conditions, event, priority) { + this.conditions = deepClone(conditions) + this.event = deepClone(event) + this.priority = deepClone(priority) + this.result = null + } + + setResult (result) { + this.result = result + } + + toJSON (stringify = true) { + let props = { + conditions: this.conditions.toJSON(false), + event: this.event, + priority: this.priority, + result: this.result + } + if (stringify) { + return JSON.stringify(props) + } + return props + } +} diff --git a/src/rule.js b/src/rule.js index 5a90890..16be693 100644 --- a/src/rule.js +++ b/src/rule.js @@ -1,8 +1,8 @@ 'use strict' import Condition from './condition' +import RuleResult from './rule-result' import { EventEmitter } from 'events' -import deepClone from 'lodash.clonedeep' let debug = require('debug')('json-rules-engine') @@ -132,11 +132,7 @@ class Rule extends EventEmitter { * @return {Promise(RuleResult)} rule evaluation result */ async evaluate (almanac) { - let ruleResult = { - conditions: deepClone(this.conditions), - event: deepClone(this.event), - priority: deepClone(this.priority) - } + let ruleResult = new RuleResult(this.conditions, this.event, this.priority) /** * Evaluates the rule conditions @@ -251,7 +247,8 @@ class Rule extends EventEmitter { * @param {Boolean} result */ let processResult = (result) => { - ruleResult.result = result + ruleResult.setResult(result) + if (result) this.emit('success', ruleResult.event, almanac, ruleResult) else this.emit('failure', ruleResult.event, almanac, ruleResult) return ruleResult diff --git a/test/engine-event.test.js b/test/engine-event.test.js index 5846989..55e7d88 100644 --- a/test/engine-event.test.js +++ b/test/engine-event.test.js @@ -276,4 +276,17 @@ describe('Engine: event', () => { expect(successSpy.callCount).to.equal(0) }) }) + + context('rule events: json serializing', () => { + beforeEach(() => simpleSetup()) + it('serializes properties', async () => { + let successSpy = sinon.spy() + let rule = engine.rules[0] + rule.on('success', successSpy) + await engine.run() + let ruleResult = successSpy.getCall(0).args[2] + let expected = '{"conditions":{"priority":1,"any":[{"operator":"greaterThanInclusive","value":21,"fact":"age"},{"operator":"equal","value":true,"fact":"qualified"}]},"event":{"type":"setDrinkingFlag","params":{"canOrderDrinks":true}},"priority":100,"result":true}' + expect(JSON.stringify(ruleResult)).to.equal(expected) + }) + }) })