Snurra is a way of writing functions that isolates side-effects, in order to get automated regression testing.
This is a Snurra Receiver:
let (createBus, call) = require('snurra')
const bus = createBus()
bus
.receive('get-user', ({ id }) =>
ok
.state({ id })
.call('load-db-entity', {
collection: 'users',
id
})
.callback('load-db-entity', ({ facebook_id, email }) =>
ok
.state({ email })
.call('get-user-from-facebook', {
id: facebook_id
}))
.callback('get-user-from-facebook', ({ picture }, { email, id }) =>
({ email, id, picture }))
)
bus.sandbox('get-user', { id: 'user123' })
sandbox-result.js
bus
.when.receiver('get-user')
.receive({ id: 'user1' })
// receive cannot have state
.then
.state({ user_id: '1' })
.call('get-friends', { user_id: 'user1' })
bus
.when.receiver('get-user')
.callback('decorate-user')
.state({
"friends": {
"user5": {},
"user4": {},
"user3": { "name": "wallace" },
"user2": { "name": "katja" },
}
})
.call({ user_id: 'user4', name: 'nina' })
.then
.state({
"friends": {
"user5": {},
"user4": { "name": "nina" },
"user3": { "name": "wallace" },
"user2": { "name": "katja" },
}
})
.request('get-name', { user_id: 'user5' })