Skip to content

Commit 37e343f

Browse files
authored
Merge pull request #48 from CacheControl/bugfix/rule-result-serialization
Bugfix/rule result serialization
2 parents b94bbc6 + 6956082 commit 37e343f

File tree

5 files changed

+51
-8
lines changed

5 files changed

+51
-8
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
/node_modules
22
npm-debug.log
33
.vscode
4-
.idea
4+
.idea
5+
.DS_Store

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
2.0.1 / 2017-07-05
2+
* Bugfix rule result serialization
3+
14
2.0.0 / 2017-04-21
25
* Publishing 2.0.0
36

src/rule-result.js

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
'use strict'
2+
3+
import deepClone from 'lodash.clonedeep'
4+
5+
export default class RuleResult {
6+
constructor (conditions, event, priority) {
7+
this.conditions = deepClone(conditions)
8+
this.event = deepClone(event)
9+
this.priority = deepClone(priority)
10+
this.result = null
11+
}
12+
13+
setResult (result) {
14+
this.result = result
15+
}
16+
17+
toJSON (stringify = true) {
18+
let props = {
19+
conditions: this.conditions.toJSON(false),
20+
event: this.event,
21+
priority: this.priority,
22+
result: this.result
23+
}
24+
if (stringify) {
25+
return JSON.stringify(props)
26+
}
27+
return props
28+
}
29+
}

src/rule.js

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
'use strict'
22

33
import Condition from './condition'
4+
import RuleResult from './rule-result'
45
import { EventEmitter } from 'events'
5-
import deepClone from 'lodash.clonedeep'
66

77
let debug = require('debug')('json-rules-engine')
88

@@ -132,11 +132,7 @@ class Rule extends EventEmitter {
132132
* @return {Promise(RuleResult)} rule evaluation result
133133
*/
134134
async evaluate (almanac) {
135-
let ruleResult = {
136-
conditions: deepClone(this.conditions),
137-
event: deepClone(this.event),
138-
priority: deepClone(this.priority)
139-
}
135+
let ruleResult = new RuleResult(this.conditions, this.event, this.priority)
140136

141137
/**
142138
* Evaluates the rule conditions
@@ -251,7 +247,8 @@ class Rule extends EventEmitter {
251247
* @param {Boolean} result
252248
*/
253249
let processResult = (result) => {
254-
ruleResult.result = result
250+
ruleResult.setResult(result)
251+
255252
if (result) this.emit('success', ruleResult.event, almanac, ruleResult)
256253
else this.emit('failure', ruleResult.event, almanac, ruleResult)
257254
return ruleResult

test/engine-event.test.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -276,4 +276,17 @@ describe('Engine: event', () => {
276276
expect(successSpy.callCount).to.equal(0)
277277
})
278278
})
279+
280+
context('rule events: json serializing', () => {
281+
beforeEach(() => simpleSetup())
282+
it('serializes properties', async () => {
283+
let successSpy = sinon.spy()
284+
let rule = engine.rules[0]
285+
rule.on('success', successSpy)
286+
await engine.run()
287+
let ruleResult = successSpy.getCall(0).args[2]
288+
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}'
289+
expect(JSON.stringify(ruleResult)).to.equal(expected)
290+
})
291+
})
279292
})

0 commit comments

Comments
 (0)