Skip to content

Instantly share code, notes, and snippets.

@mpj
Created March 30, 2017 08:33
Show Gist options
  • Save mpj/2671023881d6bd74c37908211259b5c2 to your computer and use it in GitHub Desktop.
Save mpj/2671023881d6bd74c37908211259b5c2 to your computer and use it in GitHub Desktop.

Snurra

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' })
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment