UNPKG

@cycle/most-run

Version:

The Cycle run() function to be used with most.js

92 lines (80 loc) 2.54 kB
// tslint:disable-next-line import 'mocha'; import * as assert from 'assert'; import * as sinon from 'sinon'; import {run, setup} from '../src/index'; import * as most from 'most'; describe('run()', function() { it('should be a function', function() { assert.strictEqual(typeof run, 'function'); }); it('should throw if first argument is not a function', function() { assert.throws(() => { (run as any)('not a function'); }, /First argument given to Cycle must be the 'main' function/i); }); it('should throw if second argument is not an object', function() { assert.throws(() => { (run as any)(() => {}, 'not an object'); }, /Second argument given to Cycle must be an object with driver functions/i); }); it('should throw if second argument is an empty object', function() { assert.throws(() => { run(() => ({}), {}); }, /Second argument given to Cycle must be an object with at least one/i); }); it('should return a dispose function', function() { const sandbox = sinon.createSandbox(); const spy = sandbox.spy(); function app(sources: any) { return { other: sources.other.take(1).startWith('a'), }; } function driver() { return most.of('b').tap(spy); } const dispose = run(app, {other: driver}); assert.strictEqual(typeof dispose, 'function'); setTimeout(() => { sinon.assert.calledOnce(spy); }); dispose(); }); it('should report errors from main() in the console', function(done) { const sandbox = sinon.createSandbox(); sandbox.stub(console, 'error'); function main(sources: any): any { return { other: sources.other.map(() => { throw new Error('malfunction'); }), }; } function driver(xsSink: any) { most .from(xsSink) .drain() .catch(() => {}); return most.of('b'); } let caught = false; try { run(main, {other: driver}); } catch (err) { assert.strictEqual(err.message, 'malfunction'); caught = true; } setTimeout(() => { sinon.assert.calledOnce(console.error as any); sinon.assert.calledWithExactly( console.error as any, sinon.match((err: any) => err.message === 'malfunction') ); // Should be false because the error was already reported in the console. // Otherwise we would have double reporting of the error. assert.strictEqual(caught, false); done(); }, 100); }); });