Skip to content

Commit 497d252

Browse files
author
Cache Hamm
committed
Add failureEvents to engine results
1 parent f061af3 commit 497d252

File tree

6 files changed

+66
-39
lines changed

6 files changed

+66
-39
lines changed

src/almanac.js

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export default class Almanac {
2222
this.factResultsCache = new Map() // { cacheKey: Promise<factValu> }
2323
this.allowUndefinedFacts = Boolean(options.allowUndefinedFacts)
2424
this.pathResolver = options.pathResolver || defaultPathResolver
25-
this.successEvents = []
25+
this.events = { success: [], failure: [] }
2626
this.ruleResults = []
2727

2828
for (const factId in runtimeFacts) {
@@ -42,15 +42,17 @@ export default class Almanac {
4242
* Adds a success event
4343
* @param {Object} event
4444
*/
45-
addSuccessEvent (event) {
46-
this.successEvents.push(event)
45+
addEvent (event, outcome) {
46+
if (!outcome) throw new Error('outcome required: "success" | "failure"]')
47+
this.events[outcome].push(event)
4748
}
4849

4950
/**
5051
* retrieve successful events
5152
*/
52-
getSuccessEvents () {
53-
return this.successEvents
53+
getEvents (outcome = '') {
54+
if (outcome) return this.events[outcome]
55+
return this.events.success.concat(this.events.failure)
5456
}
5557

5658
/**

src/engine.js

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -193,10 +193,11 @@ class Engine extends EventEmitter {
193193
debug(`engine::run ruleResult:${ruleResult.result}`)
194194
almanac.addRuleResult(ruleResult)
195195
if (ruleResult.result) {
196-
almanac.addSuccessEvent(ruleResult.event)
196+
almanac.addEvent(ruleResult.event, 'success')
197197
return this.emitAsync('success', ruleResult.event, almanac, ruleResult)
198198
.then(() => this.emitAsync(ruleResult.event.type, ruleResult.event.params, almanac, ruleResult))
199199
} else {
200+
almanac.addEvent(ruleResult.event, 'failure')
200201
return this.emitAsync('failure', ruleResult.event, almanac, ruleResult)
201202
}
202203
})
@@ -231,8 +232,6 @@ class Engine extends EventEmitter {
231232
cursor.then(() => {
232233
this.status = FINISHED
233234
debug('engine::run completed')
234-
return almanac.getSuccessEvents()
235-
}).then(events => {
236235
const ruleResults = almanac.getRuleResults()
237236
const { results, failureResults } = ruleResults.reduce((hash, ruleResult) => {
238237
const group = ruleResult.result ? 'results' : 'failureResults'
@@ -241,12 +240,11 @@ class Engine extends EventEmitter {
241240
}, { results: [], failureResults: [] })
242241

243242
resolve({
243+
almanac,
244244
results,
245245
failureResults,
246-
almanac,
247-
248-
// deprecated:
249-
events
246+
events: almanac.getEvents('success'),
247+
failureEvents: almanac.getEvents('failure')
250248
})
251249
}).catch(reject)
252250
})

test/acceptance/acceptance.js

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -146,11 +146,16 @@ describe('Acceptance', () => {
146146
lowPriorityValue: [2]
147147
})
148148

149-
const engineResult = await engine.run({ baseIndex: 1 })
149+
const {
150+
results,
151+
failureResults,
152+
events,
153+
failureEvents
154+
} = await engine.run({ baseIndex: 1 })
150155

151156
// results
152-
expect(engineResult.results.length).to.equal(2)
153-
expect(engineResult.results[0]).to.deep.equal({
157+
expect(results.length).to.equal(2)
158+
expect(results[0]).to.deep.equal({
154159
conditions: {
155160
all: [
156161
{
@@ -189,7 +194,7 @@ describe('Acceptance', () => {
189194
priority: 10,
190195
result: true
191196
})
192-
expect(engineResult.results[1]).to.deep.equal({
197+
expect(results[1]).to.deep.equal({
193198
conditions: {
194199
all: [
195200
{
@@ -219,12 +224,13 @@ describe('Acceptance', () => {
219224
priority: 1,
220225
result: true
221226
})
222-
expect(engineResult.failureResults).to.be.empty()
227+
expect(failureResults).to.be.empty()
223228

224229
// events
225-
expect(engineResult.events.length).to.equal(2)
226-
expect(engineResult.events[0]).to.deep.equal(event1)
227-
expect(engineResult.events[1]).to.deep.equal(event2)
230+
expect(failureEvents.length).to.equal(0)
231+
expect(events.length).to.equal(2)
232+
expect(events[0]).to.deep.equal(event1)
233+
expect(events[1]).to.deep.equal(event2)
228234

229235
// callbacks
230236
expect(successSpy).to.have.been.calledTwice()
@@ -240,13 +246,19 @@ describe('Acceptance', () => {
240246
lowPriorityValue: [3] // falsey
241247
})
242248

243-
const engineResult = await engine.run({ baseIndex: 1, 'rule-created-fact': '' })
249+
const {
250+
results,
251+
failureResults,
252+
events,
253+
failureEvents
254+
} = await engine.run({ baseIndex: 1, 'rule-created-fact': '' })
244255

245-
expect(engineResult.results.length).to.equal(0)
246-
expect(engineResult.failureResults.length).to.equal(2)
247-
expect(engineResult.failureResults.every(rr => rr.result === false)).to.be.true()
256+
expect(results.length).to.equal(0)
257+
expect(failureResults.length).to.equal(2)
258+
expect(failureResults.every(rr => rr.result === false)).to.be.true()
248259

249-
expect(engineResult.events.length).to.equal(0)
260+
expect(events.length).to.equal(0)
261+
expect(failureEvents.length).to.equal(2)
250262
expect(failureSpy).to.have.been.calledTwice()
251263
expect(failureSpy).to.have.been.calledWith(event1)
252264
expect(failureSpy).to.have.been.calledWith(event2)

test/almanac.test.js

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -41,14 +41,25 @@ describe('Almanac', () => {
4141
})
4242
})
4343

44-
describe('addSuccessEvent() / getSuccessEvents()', () => {
45-
it('manages success events', () => {
46-
const event = {}
47-
almanac = new Almanac()
48-
expect(almanac.getSuccessEvents()).to.be.empty()
49-
almanac.addSuccessEvent(event)
50-
expect(almanac.getSuccessEvents()).to.have.a.lengthOf(1)
51-
expect(almanac.getSuccessEvents()[0]).to.equal(event)
44+
describe('addEvent() / getEvents()', () => {
45+
const event = {};
46+
['success', 'failure'].forEach(outcome => {
47+
it(`manages ${outcome} events`, () => {
48+
almanac = new Almanac()
49+
expect(almanac.getEvents(outcome)).to.be.empty()
50+
almanac.addEvent(event, outcome)
51+
expect(almanac.getEvents(outcome)).to.have.a.lengthOf(1)
52+
expect(almanac.getEvents(outcome)[0]).to.equal(event)
53+
})
54+
55+
it('getEvent() filters when outcome provided, or returns all events', () => {
56+
almanac = new Almanac()
57+
almanac.addEvent(event, 'success')
58+
almanac.addEvent(event, 'failure')
59+
expect(almanac.getEvents('success')).to.have.a.lengthOf(1)
60+
expect(almanac.getEvents('failure')).to.have.a.lengthOf(1)
61+
expect(almanac.getEvents()).to.have.a.lengthOf(2)
62+
})
5263
})
5364
})
5465

test/engine-run.test.js

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

33
import engineFactory from '../src/index'
4+
import Almanac from '../src/almanac'
45
import sinon from 'sinon'
56

67
describe('Engine: run', () => {
@@ -62,11 +63,12 @@ describe('Engine: run', () => {
6263
})
6364

6465
describe('returns', () => {
65-
it('activated events', () => {
66-
return engine.run({ age: 30 }).then(results => {
67-
expect(results.events.length).to.equal(1)
68-
expect(results.events).to.deep.include(rule.event)
69-
})
66+
it('activated events', async () => {
67+
const { events, failureEvents } = await engine.run({ age: 30 })
68+
expect(events.length).to.equal(1)
69+
expect(events).to.deep.include(rule.event)
70+
expect(failureEvents.length).to.equal(1)
71+
expect(failureEvents).to.deep.include(rule2.event)
7072
})
7173

7274
it('multiple activated events', () => {
@@ -85,7 +87,7 @@ describe('Engine: run', () => {
8587

8688
it('includes the almanac', () => {
8789
return engine.run({ age: 10 }).then(results => {
88-
// expect(results.almanac).assert.instanceOf
90+
expect(results.almanac).to.be.an.instanceOf(Almanac)
8991
return results.almanac.factValue('age')
9092
}).then(ageFact => expect(ageFact).to.equal(10))
9193
})

types/index.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ export interface EngineOptions {
66
export interface EngineResult {
77
events: Event[];
88
almanac: Almanac;
9+
results: RuleResult[];
10+
failureResults: RuleResult[];
911
}
1012

1113
export default function engineFactory(

0 commit comments

Comments
 (0)