Episode 7 📺
Enhanced sequencing of asynchronous code with ES6 generators.
A tiny module created to solve one problem in a generalized way.
No more HTTP mocks 🚫🕸
Write concise tests for an asynchronous story. Skip execution of side-effects. Instead, assert their call arguments, and mock their plain return value.
See: "Easily test yielded calls, mock their return values"
Functional in nature 🌲
Inspired by the test-friendly generator architecture of redux-saga
and the pure side-effects of Elm.
Requires
ES6/Generator support.
- Known to work in Node.js 6.2
- Should work in any ES6-compliant JavaScript environment
Install
npm install episode-7 --save
Changes
See: CHANGELOG
Usage
const Episode7 = require('episode-7');
const fetch = require('node-fetch');
function fetchJson(url) {
return fetch(url).then( response => response.json() );
}
function* findFirstMovie(searchTerm) {
let results = yield Episode7.call(
fetchJson, `http://www.omdbapi.com/?s=${searchTerm}`
);
let movie = yield Episode7.call(
fetchJson, `http://www.omdbapi.com/?i=${results.Search[0].imdbID}`
);
return Promise.resolve(movie);
}
Episode7.run(findFirstMovie, 'Episode 7')
.then( movie => console.log(movie.Title) )
Background
How many times can a person write web service API calls in a dependent sequence, e.g. authenticate, fetch identity, query for records, then create or update those records? So many variations of this theme are created everyday, frequently involving multiple services.
I created this module to make it easy to code sequences of web service API requests interleaved with programmatic logic. I'm pulling the essence of redux-saga
into the smallest, plainest surface area conceivable.