Skip to content

Commit

Permalink
after state change event
Browse files Browse the repository at this point in the history
  • Loading branch information
mihaidma committed Jan 28, 2016
1 parent 643bf7d commit d5c97a6
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 79 deletions.
15 changes: 5 additions & 10 deletions lib/rules.js
Original file line number Diff line number Diff line change
Expand Up @@ -65,26 +65,21 @@ module.exports = {
},

retrieve_events: function (config, state) {
var events = config.states.events
// local event handlers
var events = config.states[state].events
if (events) {
return events
}
events = config.states[state].events

// global event handlers
events = config.states.events
if (events) {
return events
}

return null
},

retrieve_before_command: function (config, state) {
var events = this.retrieve_events(config, state)
if (events.before) {
return events.before
}

return null
},
retrieve_after_command: function (config, state) {
var events = this.retrieve_events(config, state)
if (events.after) {
Expand Down
19 changes: 7 additions & 12 deletions lib/sm.js
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,11 @@ module.exports = function (options) {
}

StateHelper.change(context, args.state)
var afterCommand = ConfigurationHelper.retrieve_after_command(context.config, context.current_status)
if (!afterCommand) {
}
seneca.act(afterCommand.pattern, function(err, result) {
})

return done(null, _.clone(context))
}
Expand All @@ -98,21 +103,11 @@ module.exports = function (options) {
var seneca = this
var context = internals[args.role]
var command = ConfigurationHelper.retrieve_command(context.config, context.current_status, args.cmd)
var beforeCommand = ConfigurationHelper.retrieve_before_command(context.config)
var afterCommand = ConfigurationHelper.retrieve_after_command(context.config)

delete args.role
delete args.cmd

Async.series({
before_command: function(callback) {
if (!beforeCommand) {
return callback()
}
seneca.act(beforeCommand.pattern, function(err, data) {
callback(err, data)
})
},
command: function (callback) {
seneca.act(command.pattern, args, function (err, data) {
StateHelper.findNextState(command, err, data, function (state_err, nextState) {
Expand All @@ -125,6 +120,7 @@ module.exports = function (options) {
})
},
after_command: function (callback) {
var afterCommand = ConfigurationHelper.retrieve_after_command(context.config, context.current_status)
if (!afterCommand) {
return callback()
}
Expand All @@ -133,8 +129,7 @@ module.exports = function (options) {
})
}
}, function (err, results) {
// console.log('### results: ', results)
// the command results returned, before and after data not returned
// the "command" results are returned, the "after_command" ones not returned
done(err, results.command)
})
}
Expand Down
51 changes: 14 additions & 37 deletions test/events.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ var expect = Code.expect

var Util = require('./util.js')

suite('test before and after events', function () {
suite('test local and global after state change events', function () {
var seneca

before({}, function (done) {
Expand All @@ -35,20 +35,10 @@ suite('test before and after events', function () {
})
}

test('test global before and after events', function (done) {
var beforeEventRaised = false
test('test global after state change event', function (done) {
var afterEventRaised = false

// actions to be called by the global before and after patterns from config
seneca.add({role: 'transport', execute: 'before_state_change'}, function (args, done) {
beforeEventRaised = true

if (args.shouldFail) {
return done('Some error')
}
done(null, {data: 'OK', before: true})
})

// action to be called by the global after state change event pattern from config
seneca.add({role: 'transport', execute: 'after_state_change'}, function (args, done) {
afterEventRaised = true

Expand All @@ -67,18 +57,17 @@ suite('test before and after events', function () {
})
},
init: function (callback) { verifyState('INIT', Util.config.name, callback) },
before_and_after: function (callback) {
// go to the NOT_CONFIGURED state, this should fire the before and after events
seneca.act("role: '" + Util.config.name + "', cmd: 'execute'", {shouldFail: false}, function (err, data) {
expect(beforeEventRaised).to.be.true()
after_event_trigger: function (callback) {
// go to the CONNECTED state, this fires the global after state change event pattern
var loadState = 'CONNECTED'
seneca.act('role: ' + Util.config.name + ', load: state', {sm_name: Util.config.name, state: loadState}, function (err, context) {
expect(context).to.exist()
expect(context.current_status).to.equal(loadState)

expect(err).to.not.exist()
expect(data).to.exist()
expect(data.connect).to.exist()
callback(err)
})
},
notconfigured: function (callback) { verifyState('NOT_CONFIGURED', Util.config.name, callback) },
notconfigured: function (callback) { verifyState('CONNECTED', Util.config.name, callback) },
verify_after_event: function (callback) {
expect(afterEventRaised).to.be.true()

Expand All @@ -91,20 +80,10 @@ suite('test before and after events', function () {
})
})

test('test local before and after events', function (done) {
var localBeforeEventRaised = false
test('test local after state change event', function (done) {
var localAfterEventRaised = false

// actions to be called by the global before and after patterns from config
seneca.add({role: 'transport', execute: 'before_notconfigured_state_change'}, function (args, done) {
localBeforeEventRaised = true

if (args.shouldFail) {
return done('Some error')
}
done(null, {data: 'OK', before_notconfigured: true})
})

// actions to be called by the global after state change event patterns from config
seneca.add({role: 'transport', execute: 'after_notconfigured_state_change'}, function (args, done) {
localAfterEventRaised = true

Expand All @@ -125,11 +104,9 @@ suite('test before and after events', function () {
})
},
init: function (callback) { verifyState('INIT', sm2Config.name, callback) },
before_and_after: function (callback) {
// go to the NOT_CONFIGURED state, this should fire the before and after events
after_event_trigger: function (callback) {
// go to the NOT_CONFIGURED state, this fires the after state change event
seneca.act("role: '" + sm2Config.name + "', cmd: 'execute'", {shouldFail: false}, function (err, data) {
expect(localBeforeEventRaised).to.be.true()

expect(err).to.not.exist()
expect(data).to.exist()
expect(data.connect).to.exist()
Expand Down
20 changes: 0 additions & 20 deletions test/util.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,6 @@ exports.config = {

states: {
events: {
before: {
pattern: "role: 'transport', execute: 'before_state_change'"
},
after: {
pattern: "role: 'transport', execute: 'after_state_change'"
}
Expand Down Expand Up @@ -58,9 +55,6 @@ exports.config = {
}
},
events: {
before: {
pattern: "role: 'transport', execute: 'before_notconfigured_state_change'"
},
after: {
pattern: "role: 'transport', execute: 'after_notconfigured_state_change'"
}
Expand Down Expand Up @@ -129,27 +123,13 @@ exports.init = function (options, cb) {
done(null, {data: 'OK', command: true})
})

si.add({role: 'transport', execute: 'before_state_change'}, function (args, done) {
if (args.shouldFail) {
return done('Some error')
}
done(null, {data: 'OK', before: true})
})

si.add({role: 'transport', execute: 'after_state_change'}, function (args, done) {
if (args.shouldFail) {
return done('Some error')
}
done(null, {data: 'OK', after: true})
})

si.add({role: 'transport', execute: 'before_notconfigured_state_change'}, function (args, done) {
if (args.shouldFail) {
return done('Some error')
}
done(null, {data: 'OK', before_notconfigured: true})
})

si.add({role: 'transport', execute: 'after_notconfigured_state_change'}, function (args, done) {
if (args.shouldFail) {
return done('Some error')
Expand Down

0 comments on commit d5c97a6

Please sign in to comment.