123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961 |
- var assert = require('assert');
- var _ = require('@sailshq/lodash');
- var M = require('../');
- describe('Machine fn calling `exits()` (w/ different usages)', function() {
- describe('with success exit and error exit defined', function() {
- testDifferentUsages({
- exits: {
- success: {},
- error: {}
- }
- });
- }); // </with success exit and error exit defined>
- describe('with error exit defined, but no success exit', function() {
- testDifferentUsages({
- exits: {
- error: {}
- }
- });
- }); // </with error exit defined, but no success exit>
- describe('with success exit defined, but no error exit', function() {
- testDifferentUsages({
- exits: {
- success: {}
- }
- });
- }); // </with success exit defined, but no error exit>
- describe('with some other exit defined, but no success or error exit', function() {
- testDifferentUsages({
- exits: {
- somethingElse: {}
- }
- });
- }); // </with somethingElse exit defined, but no error exit>
- describe('with neither error nor success exit defined', function() {
- testDifferentUsages({
- exits: {}
- });
- }); // </with neither error nor success exit defined>
- describe('with no exits object defined in the machine def at all', function() {
- testDifferentUsages({});
- }); // </with no exits object defined in the machine def at all>
- describe('with success exit defined such that it has both an `example` and an `outputExample`', function() {
- testDifferentUsages(
- {
- exits: {
- success: {
- outputExample: 'foo',
- example: false
- }
- }
- },
- // If the following runtime value is returned through the success exit FROM INSIDE the machine `fn`:
- undefined,
- // ...then the following runtime value should be received on the OUTSIDE:
- ''
- );
- testDifferentUsages(
- {
- exits: {
- success: {
- outputExample: 'foo',
- example: undefined
- }
- }
- },
- // If the following runtime value is returned through the success exit FROM INSIDE the machine `fn`:
- undefined,
- // ...then the following runtime value should be received on the OUTSIDE:
- ''
- );
- }); // </with success exit defined such that it has both an `example` and an `outputExample`>
- describe('with an exit defined with an `outputExample`', function() {
- // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- // The following constants are used below:
- // =======================================
- //
- // To test regular expressions:
- var SOME_REGEXP = /^Sandwich/gi;
- //
- // To test functions:
- var SOME_ARBITRARY_FUNCTION = function foo (a, b, c){ console.log('stuff'); };
- //
- // To test circular references:
- var ERSTWHILE_PARTICLE = { x: 32, y: 49, z: -101, rgba: {r:255,g:255,b:255,a:100} };
- var DIFFUSE_PARTICLE = { x: -500, y: 871.5, z: 4.4, rgba: {r:0,g:0,b:0,a:255} };
- // DIFFUSE_PARTICLE.entangling = [ {}, {}, ERSTWHILE_PARTICLE, {}, {} ];
- DIFFUSE_PARTICLE.entangling = [ ERSTWHILE_PARTICLE ];
- ERSTWHILE_PARTICLE.entangledBy = { particleRef: DIFFUSE_PARTICLE };
- var ITERATOR_SAFE_VERSION_OF_ERSTWHILE_PARTICLE = {
- x: 32,
- y: 49,
- z: -101,
- rgba: { r:255, g:255, b:255, a:100 },
- entangledBy: {
- particleRef: {
- x: -500,
- y: 871.5,
- z: 4.4,
- rgba: { r:0, g:0, b:0, a:255 },
- // entangling: [ {}, {}, '[Circular ~.0]', {}, {} ]
- entangling: [ '[Circular ~.0]' ]
- }//</.entangledBy.particleRef>
- }//</.entangledBy>
- };
- // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- // Start with a few basic sanity checks to be sure that it builds properly:
- // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- testDifferentUsages({
- exits: {
- success: {
- outputExample: 'foo'
- }
- }
- });
- testDifferentUsages({
- exits: {
- success: { outputExample: 'foo' },
- somethingElse: { outputExample: true },
- somethingElse2: { outputExample: false },
- somethingElse3: { outputExample: -329.3 },
- somethingElse4: { outputExample: {} },
- somethingElse5: { outputExample: '*' },
- somethingElse6: { outputExample: '->' },
- somethingElse7: { outputExample: '===' },
- somethingElse8: { outputExample: [{opts: '*'}] },
- somethingElse9: { outputExample: [{fn: '->'}] },
- somethingElse10: { outputExample: [{meta: '==='}] },
- somethingElse11: { outputExample: [] },
- somethingElse12: { example: false },
- somethingElse13: { example: -329.3 },
- somethingElse14: { example: {} },
- somethingElse15: { example: '*' },
- somethingElse16: { example: '->' },
- somethingElse17: { example: '===' },
- somethingElse18: { example: [{opts: '*'}] },
- somethingElse19: { example: [{fn: '->'}] },
- somethingElse20: { example: [{meta: '==='}] },
- somethingElse21: { example: [] },
- error: {}
- }
- });
- testDifferentUsages({
- exits: {
- success: { outputExample: 'foo' },
- error: { outputExample: '===' }
- }
- });
- testDifferentUsages({
- exits: {
- success: { outputExample: 'foo' },
- error: { example: '===' }
- }
- });
- testDifferentUsages({
- exits: {
- success: { example: 'foo' },
- error: { outputExample: '===' }
- }
- });
- // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- // Then finish up with a few more tests to ensure the underlying runtime type
- // coercion is working properly and respecting the `outputExample` as the exemplar
- // that gets passed in to `rttc.coerce()`:
- // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- describe('when there is runtime output', function() {
- testDifferentUsages(
- { exits: { success: { outputExample: 'foo' } } },
- // If the following runtime value is returned through the success exit FROM INSIDE the machine `fn`:
- 'Butter sandwich',
- // ...then the following runtime value should be received on the OUTSIDE:
- 'Butter sandwich'
- );
- testDifferentUsages(
- { exits: { success: { outputExample: 123 } } },
- // If the following runtime value is returned through the success exit FROM INSIDE the machine `fn`:
- 'Butter sandwich',
- // ...then the following runtime value should be received on the OUTSIDE:
- 0
- );
- testDifferentUsages(
- { exits: { success: { outputExample: 123 } } },
- // If the following runtime value is returned through the success exit FROM INSIDE the machine `fn`:
- undefined,
- // ...then the following runtime value should be received on the OUTSIDE:
- 0
- );
- testDifferentUsages(
- { exits: { success: { outputExample: 'foo' } } },
- // If the following runtime value is returned through the success exit FROM INSIDE the machine `fn`:
- undefined,
- // ...then the following runtime value should be received on the OUTSIDE:
- ''
- );
- testDifferentUsages(
- { exits: { success: { outputExample: '*' } } },
- // If the following runtime value is returned through the success exit FROM INSIDE the machine `fn`:
- undefined,
- // ...then the following runtime value should be received on the OUTSIDE:
- null
- );
- testDifferentUsages(
- { exits: { success: { outputExample: '===' } } },
- // If the following runtime value is returned through the success exit FROM INSIDE the machine `fn`:
- undefined,
- // ...then the following runtime value should be received on the OUTSIDE:
- null
- );
- testDifferentUsages(
- { exits: { success: { outputExample: '===' } } },
- // If the following runtime value is returned through the success exit FROM INSIDE the machine `fn`:
- SOME_REGEXP,
- // ...then the following runtime value should be received on the OUTSIDE:
- SOME_REGEXP,
- true
- );
- testDifferentUsages(
- { exits: { success: { outputExample: ['==='] } } },
- // If the following runtime value is returned through the success exit FROM INSIDE the machine `fn`:
- undefined,
- // ...then the following runtime value should be received on the OUTSIDE:
- []
- );
- testDifferentUsages(
- { exits: { success: { outputExample: ['*'] } } },
- // If the following runtime value is returned through the success exit FROM INSIDE the machine `fn`:
- [null],
- // ...then the following runtime value should be received on the OUTSIDE:
- [null]
- );
- testDifferentUsages(
- { exits: { success: { outputExample: [] } } },
- // If the following runtime value is returned through the success exit FROM INSIDE the machine `fn`:
- [null],
- // ...then the following runtime value should be received on the OUTSIDE:
- [null]
- );
- testDifferentUsages(
- { exits: { success: { outputExample: [] } } },
- // If the following runtime value is returned through the success exit FROM INSIDE the machine `fn`:
- undefined,
- // ...then the following runtime value should be received on the OUTSIDE:
- []
- );
- testDifferentUsages(
- { exits: { success: { outputExample: ['*'] } } },
- // If the following runtime value is returned through the success exit FROM INSIDE the machine `fn`:
- SOME_REGEXP,
- // ...then the following runtime value should be received on the OUTSIDE:
- []
- );
- testDifferentUsages(
- { exits: { success: { outputExample: ['*'] } } },
- // If the following runtime value is returned through the success exit FROM INSIDE the machine `fn`:
- [ SOME_REGEXP ],
- // ...then the following runtime value should be received on the OUTSIDE:
- [ '/^Sandwich/gi' ] // << testing JSON stringification
- );
- testDifferentUsages(
- { exits: { success: { outputExample: [] } } },
- // If the following runtime value is returned through the success exit FROM INSIDE the machine `fn`:
- [ SOME_REGEXP ],
- // ...then the following runtime value should be received on the OUTSIDE:
- [ '/^Sandwich/gi' ] // << testing JSON stringification
- );
- // testDifferentUsages(
- // { exits: { success: { outputExample: [] } } },
- // // If the following runtime value is returned through the success exit FROM INSIDE the machine `fn`:
- // [ ERSTWHILE_PARTICLE ],
- // // ...then the following runtime value should be received on the OUTSIDE:
- // [ ITERATOR_SAFE_VERSION_OF_ERSTWHILE_PARTICLE ] // << testing JSON stringification
- // );
- // testDifferentUsages(
- // { exits: { success: { outputExample: ['==='] } } },
- // // If the following runtime value is returned through the success exit FROM INSIDE the machine `fn`:
- // [ SOME_REGEXP ],
- // // ...then the following runtime value should be received on the OUTSIDE:
- // [ SOME_REGEXP ],
- // true // .... welll, sort of-- need to do a strict equality check only on the array items...
- // );
- // testDifferentUsages(
- // { exits: { success: { outputExample: ['==='] } } },
- // // If the following runtime value is returned through the success exit FROM INSIDE the machine `fn`:
- // [ ERSTWHILE_PARTICLE ],
- // // ...then the following runtime value should be received on the OUTSIDE:
- // [ ERSTWHILE_PARTICLE ],
- // true // .... welll, sort of-- need to do a strict equality check only on the array items...
- // );
- testDifferentUsages(
- { exits: { success: { outputExample: '===' } } },
- // If the following runtime value is returned through the success exit FROM INSIDE the machine `fn`:
- SOME_ARBITRARY_FUNCTION,
- // ...then the following runtime value should be received on the OUTSIDE:
- SOME_ARBITRARY_FUNCTION,
- true
- );
- testDifferentUsages(
- { exits: { success: { outputExample: '===' } } },
- // If the following runtime value is returned through the success exit FROM INSIDE the machine `fn`:
- ERSTWHILE_PARTICLE,
- // ...then the following runtime value should be received on the OUTSIDE:
- ERSTWHILE_PARTICLE,
- true
- );
- // testDifferentUsages(
- // { exits: { success: { outputExample: '*' } } },
- // // If the following runtime value is returned through the success exit FROM INSIDE the machine `fn`:
- // ERSTWHILE_PARTICLE,
- // // ...then the following runtime value should be received on the OUTSIDE:
- // ITERATOR_SAFE_VERSION_OF_ERSTWHILE_PARTICLE
- // );
- testDifferentUsages(
- { exits: { success: { outputExample: [{meta: '==='}] } } },
- // If the following runtime value is returned through the success exit FROM INSIDE the machine `fn`:
- SOME_ARBITRARY_FUNCTION,
- // ...then the following runtime value should be received on the OUTSIDE:
- []
- );
- testDifferentUsages(
- { exits: { success: { outputExample: [{meta: '==='}] } } },
- // If the following runtime value is returned through the success exit FROM INSIDE the machine `fn`:
- [{meta: SOME_ARBITRARY_FUNCTION, foo: 12412, bar: 35132}],
- // ...then the following runtime value should be received on the OUTSIDE:
- [{meta: SOME_ARBITRARY_FUNCTION}]
- );
- testDifferentUsages(
- {
- exits: {
- success: { outputExample: 'foo' },
- somethingElse: { outputExample: true },
- somethingElse2: { outputExample: false },
- somethingElse3: { outputExample: -329.3 },
- somethingElse4: { outputExample: {} },
- somethingElse5: { outputExample: '*' },
- somethingElse6: { outputExample: '->' },
- somethingElse7: { outputExample: '===' },
- somethingElse8: { outputExample: [{opts: '*'}] },
- somethingElse9: { outputExample: [{fn: '->'}] },
- somethingElse10: { outputExample: [{meta: '==='}] },
- somethingElse11: { outputExample: [] },
- somethingElse12: { example: false },
- somethingElse13: { example: -329.3 },
- somethingElse14: { example: {} },
- somethingElse15: { example: '*' },
- somethingElse16: { example: '->' },
- somethingElse17: { example: '===' },
- somethingElse18: { example: [{opts: '*'}] },
- somethingElse19: { example: [{fn: '->'}] },
- somethingElse20: { example: [{meta: '==='}] },
- somethingElse21: { example: [] },
- error: {}
- }
- },
- // If the following runtime value is returned through the success exit FROM INSIDE the machine `fn`:
- 'Butter sandwich',
- // ...then the following runtime value should be received on the OUTSIDE:
- 'Butter sandwich'
- );
- testDifferentUsages(
- {
- exits: {
- success: { outputExample: 'foo' },
- somethingElse: { outputExample: true },
- somethingElse2: { outputExample: false },
- somethingElse3: { outputExample: -329.3 },
- somethingElse4: { outputExample: {} },
- somethingElse5: { outputExample: '*' },
- somethingElse6: { outputExample: '->' },
- somethingElse7: { outputExample: '===' },
- somethingElse8: { outputExample: [{opts: '*'}] },
- somethingElse9: { outputExample: [{fn: '->'}] },
- somethingElse10: { outputExample: [{meta: '==='}] },
- somethingElse11: { outputExample: [] },
- somethingElse12: { example: false },
- somethingElse13: { example: -329.3 },
- somethingElse14: { example: {} },
- somethingElse15: { example: '*' },
- somethingElse16: { example: '->' },
- somethingElse17: { example: '===' },
- somethingElse18: { example: [{opts: '*'}] },
- somethingElse19: { example: [{fn: '->'}] },
- somethingElse20: { example: [{meta: '==='}] },
- somethingElse21: { example: [] },
- error: {}
- }
- },
- // If the following runtime value is returned through the success exit FROM INSIDE the machine `fn`:
- undefined,
- // ...then the following runtime value should be received on the OUTSIDE:
- ''
- );
- testDifferentUsages(
- {
- exits: {
- success: { outputExample: 123 },
- error: { outputExample: '===' }
- }
- },
- // If the following runtime value is returned through the success exit FROM INSIDE the machine `fn`:
- undefined,
- // ...then the following runtime value should be received on the OUTSIDE:
- 0
- );
- testDifferentUsages(
- {
- exits: {
- success: { outputExample: 123 },
- error: { example: 'foo' }
- }
- },
- // If the following runtime value is returned through the success exit FROM INSIDE the machine `fn`:
- 999,
- // ...then the following runtime value should be received on the OUTSIDE:
- 999
- );
- testDifferentUsages(
- {
- exits: {
- success: { example: 123 },
- error: { outputExample: 'foo' }
- }
- },
- // If the following runtime value is returned through the success exit FROM INSIDE the machine `fn`:
- 999,
- // ...then the following runtime value should be received on the OUTSIDE:
- 999
- );
- }); // </when there is runtime output>
- }); // </with success exit defined, with an `outputExample`>
- });
- /**
- * This helper tests different usages of the specified machine def.
- * NOTE: The provided machine def SHOULD NOT specify a `fn` or `inputs`!
- *
- * Machine def should call its error exit when the `foo` input is set to
- * the string: "error"
- *
- * @param {===} machine - the machine def
- * @param {===?} runtimeValueToReturn - the runtime value that the machine's `fn` will return through the success exit.
- * @param {===?} expectedOutputIfSuccessExitIsCalled - the expected output if the success exit is called. Will be compared using Node's native `assert.deepEqual()`.
- * @param {Boolean} useStrictEq - if set to true, then a strict equality check (`assert.strictEqual()`) will be used instead of `assert.deepEqual()`
- */
- function testDifferentUsages (machine, runtimeValueToReturn, expectedOutputIfSuccessExitIsCalled, useStrictEq) {
- if (machine.fn || machine.inputs) {
- throw new Error('Test is invalid-- please do not provide a `fn` or `inputs` to this test helper.');
- }
- machine.inputs = {
- foo: {
- example: 'foo bar'
- }
- };
- machine.fn = function (inputs, exits, deps) {
- if (inputs.foo === 'error') {
- exits('ERROR!');
- }
- else {
- if (!_.isUndefined(runtimeValueToReturn)) {
- exits(undefined, runtimeValueToReturn);
- }
- else {
- exits();
- }
- }
- };
- ////////////////////////////////////////////////////////////////////
- // Trying to `.exec()` a machine with no callbacks
- ////////////////////////////////////////////////////////////////////
- it('should throw an error when when `fn` calls `exits()` and no callbacks are bound', function(done) {
- assert.throws(function (){
- M.build(machine)
- .configure({
- foo: 'hello'
- })
- .exec();
- });
- return done();
- });
- it('should throw an error when when `fn` calls `exits("ERROR!")` and no callbacks are bound', function(done) {
- assert.throws(function (){
- M.build(machine)
- .configure({
- foo: 'error'
- })
- .exec();
- });
- return done();
- });
- ////////////////////////////////////////////////////////////////////
- // Binding exit callbacks with second argument to .configure()
- ////////////////////////////////////////////////////////////////////
- it('should call the success exit when `fn` calls `exits()` and callbacks are bound using second argument to `configure()`', function(done) {
- M.build(machine)
- .configure({
- foo: 'hello'
- }, {
- success: function(resultMaybe) {
- // Verify the output, if expected output was provided to this test helper.
- if (!_.isUndefined(expectedOutputIfSuccessExitIsCalled)) {
- if (useStrictEq) {
- try { assert.strictEqual(resultMaybe, expectedOutputIfSuccessExitIsCalled); }
- catch (e) { return done(e); }
- }
- else {
- try { assert.deepEqual(resultMaybe, expectedOutputIfSuccessExitIsCalled); }
- catch (e) { return done(e); }
- }
- }
- return done();
- },
- error: function(err) {
- return done(new Error('Should NOT have called the error exit!'));
- }
- })
- .exec();
- });
- it('should call the error exit when `fn` calls `exits("ERROR!")` and callbacks are bound using second argument to `configure()`', function(done) {
- M.build(machine)
- .configure({
- foo: 'error'
- }, {
- success: function() {
- done(new Error('Should NOT have called the success exit!'));
- },
- error: function(err) {
- assert(err, 'expected `'+err+'` to be truthy');
- return done();
- }
- })
- .exec();
- });
- it('should call the error exit when `fn` calls `exits()` and ONLY an `error` callback is bound using second argument to `configure()`', function(done) {
- M.build(machine)
- .configure({
- foo: 'hello'
- }, {
- error: function(err) { return done(); }
- })
- .exec();
- });
- it('should call the error exit when `fn` calls `exits("ERROR!")` and ONLY an `error` callback is bound using second argument to `configure()`', function(done) {
- M.build(machine)
- .configure({
- foo: 'error'
- }, {
- error: function(err) { return done(); }
- })
- .exec();
- });
- it('should throw an error when no `error` callback is bound using second argument to `configure()`', function(done) {
- assert.throws(function (){
- M.build(machine)
- .configure({
- foo: 'hello'
- }, {
- success: function() {
- return done(new Error('Should have thrown, and not called any exit!'));
- }
- })
- .exec();
- });
- done();
- });
- ////////////////////////////////////////////////////////////////////
- // Binding Node callback with second argument to .configure()
- ////////////////////////////////////////////////////////////////////
- it('should call the success exit when `fn` calls `exits()` and a single Node callback is bound using second argument to `configure()`', function(done) {
- M.build(machine)
- .configure({
- foo: 'hello'
- }, function (err, resultMaybe){
- if (err) {
- return done(new Error('`err` should NOT have been set!'));
- }
- // Verify the output, if expected output was provided to this test helper.
- if (!_.isUndefined(expectedOutputIfSuccessExitIsCalled)) {
- // If the expected output cannot be stringified, then use a strict equality check.
- var useStrictEq;
- try { JSON.stringify(expectedOutputIfSuccessExitIsCalled); }
- catch (ignored) { useStrictEq = true; }
- if (useStrictEq) {
- try { assert.strictEqual(resultMaybe, expectedOutputIfSuccessExitIsCalled); }
- catch (e) { return done(e); }
- }
- else {
- try { assert.deepEqual(resultMaybe, expectedOutputIfSuccessExitIsCalled); }
- catch (e) { return done(e); }
- }
- }
- return done();
- })
- .exec();
- });
- it('should call the error exit when `fn` calls `exits("ERROR!")` and a single Node callback is bound using second argument to `configure()`', function(done) {
- M.build(machine)
- .configure({
- foo: 'error'
- },function (err){
- if (err) {
- return done();
- }
- return done(new Error('`err` should have been set!'));
- })
- .exec();
- });
- ////////////////////////////////////////////////////////////////////
- // Binding exit callbacks with .exec()
- ////////////////////////////////////////////////////////////////////
- it('should call the success exit when `fn` calls `exits()` and callbacks are bound using .exec()', function(done) {
- M.build(machine)
- .configure({
- foo: 'hello'
- }).exec({
- success: function(resultMaybe) {
- // Verify the output, if expected output was provided to this test helper.
- if (!_.isUndefined(expectedOutputIfSuccessExitIsCalled)) {
- if (useStrictEq) {
- try { assert.strictEqual(resultMaybe, expectedOutputIfSuccessExitIsCalled); }
- catch (e) { return done(e); }
- }
- else {
- try { assert.deepEqual(resultMaybe, expectedOutputIfSuccessExitIsCalled); }
- catch (e) { return done(e); }
- }
- }
- return done();
- },
- error: function(err) { return done(new Error('Should NOT have called the error exit!'));}
- });
- });
- it('should call the error exit when `fn` calls `exits("ERROR!")` and callbacks are bound using .exec()', function(done) {
- M.build(machine)
- .configure({
- foo: 'error'
- }).exec({
- success: function() { return done(new Error('Should NOT have called the success exit!'));},
- error: function(err) {
- assert(err, 'expected `'+err+'` to be truthy');
- return done();
- }
- });
- });
- it('should call the error exit when `fn` calls `exits()` and ONLY an `error` callback is bound using .exec()', function(done) {
- M.build(machine)
- .configure({
- foo: 'hello'
- }).exec({
- error: function(err) { return done(); }
- });
- });
- it('should call the error exit when `fn` calls `exits("ERROR!")` and ONLY an `error` callback is bound using .exec()', function(done) {
- M.build(machine)
- .configure({
- foo: 'error'
- }).exec({
- error: function(err) { return done(); }
- });
- });
- it('should throw an error when no `error` callback is bound using .exec()', function(done) {
- assert.throws(function (){
- M.build(machine)
- .configure({
- foo: 'hello'
- }).exec({
- success: function() {
- return done(new Error('Should have thrown, and not called any exit!'));
- }
- });
- });
- done();
- });
- ////////////////////////////////////////////////////////////////////
- // Binding Node callback with .exec()
- ////////////////////////////////////////////////////////////////////
- it('should call the success exit when `fn` calls `exits()` and a single Node callback is bound using .exec()', function(done) {
- M.build(machine)
- .configure({
- foo: 'hello'
- })
- .exec(function (err, resultMaybe){
- if (err) {
- return done(new Error('`err` should NOT have been set!'));
- }
- // Verify the output, if expected output was provided to this test helper.
- if (!_.isUndefined(expectedOutputIfSuccessExitIsCalled)) {
- // If the expected output cannot be stringified, then use a strict equality check.
- var useStrictEq;
- try { JSON.stringify(expectedOutputIfSuccessExitIsCalled); }
- catch (ignored) { useStrictEq = true; }
- if (useStrictEq) {
- try { assert.strictEqual(resultMaybe, expectedOutputIfSuccessExitIsCalled); }
- catch (e) { return done(e); }
- }
- else {
- try { assert.deepEqual(resultMaybe, expectedOutputIfSuccessExitIsCalled); }
- catch (e) { return done(e); }
- }
- }
- return done();
- });
- });
- it('should call the error exit when `fn` calls `exits("ERROR!")` and a single Node callback is bound using .exec()', function(done) {
- M.build(machine)
- .configure({
- foo: 'error'
- }).exec(function (err){
- if (err) {
- return done();
- }
- return done(new Error('`err` should have been set!'));
- });
- });
- ////////////////////////////////////////////////////////////////////
- // Binding exit callbacks with .configure()
- ////////////////////////////////////////////////////////////////////
- it('should call the success exit when `fn` calls `exits()` and callbacks are bound using .configure()', function(done) {
- M.build(machine)
- .configure({
- foo: 'hello'
- }, {
- success: function(resultMaybe) {
- // Verify the output, if expected output was provided to this test helper.
- if (!_.isUndefined(expectedOutputIfSuccessExitIsCalled)) {
- if (useStrictEq) {
- try { assert.strictEqual(resultMaybe, expectedOutputIfSuccessExitIsCalled); }
- catch (e) { return done(e); }
- }
- else {
- try { assert.deepEqual(resultMaybe, expectedOutputIfSuccessExitIsCalled); }
- catch (e) { return done(e); }
- }
- }
- return done();
- },
- error: function(err) { return done(new Error('Should NOT have called the error exit!')); }
- })
- .exec();
- });
- it('should call the error exit when `fn` calls `exits("ERROR!")` and callbacks are bound using .configure()', function(done) {
- M.build(machine)
- .configure({
- foo: 'error'
- }, {
- success: function() { return done(new Error('Should NOT have called the success exit!')); },
- error: function(err) {
- assert(err, 'expected `'+err+'` to be truthy');
- return done();
- }
- })
- .exec();
- });
- it('should call the error exit when `fn` calls `exits()` and ONLY an `error` callback is bound using .configure()', function(done) {
- M.build(machine)
- .configure({
- foo: 'hello'
- }, {
- error: function(err) { return done(); }
- })
- .exec();
- });
- it('should call the error exit when `fn` calls `exits("ERROR!")` and ONLY an `error` callback is bound using .configure()', function(done) {
- M.build(machine)
- .configure({
- foo: 'error'
- }, {
- error: function(err) { return done(); }
- })
- .exec();
- });
- it('should throw an error when no `error` callback is bound using .configure()', function(done) {
- assert.throws(function (){
- M.build(machine)
- .configure({
- foo: 'hello'
- }, {
- success: function() {
- return done(new Error('Should have thrown, and not called any exit!'));
- }
- })
- .exec();
- });
- return done();
- });
- ////////////////////////////////////////////////////////////////////
- // Binding Node callback with configure()
- ////////////////////////////////////////////////////////////////////
- it('should call the success exit when `fn` calls `exits()` and a single Node callback is bound using .configure()', function(done) {
- M.build(machine)
- .configure({
- foo: 'hello'
- }, function (err, resultMaybe){
- if (err) {
- return done(new Error('`err` should NOT have been set!'));
- }
- // Verify the output, if expected output was provided to this test helper.
- if (!_.isUndefined(expectedOutputIfSuccessExitIsCalled)) {
- // If the expected output cannot be stringified, then use a strict equality check.
- var useStrictEq;
- try { JSON.stringify(expectedOutputIfSuccessExitIsCalled); }
- catch (ignored) { useStrictEq = true; }
- if (useStrictEq) {
- try { assert.strictEqual(resultMaybe, expectedOutputIfSuccessExitIsCalled); }
- catch (e) { return done(e); }
- }
- else {
- try { assert.deepEqual(resultMaybe, expectedOutputIfSuccessExitIsCalled); }
- catch (e) { return done(e); }
- }
- }
- return done();
- })
- .exec();
- });
- it('should call the error exit when `fn` calls `exits("ERROR!")` and a single Node callback is bound using .configure()', function(done) {
- M.build(machine)
- .configure({
- foo: 'error'
- }, function (err){
- if (err) {
- return done();
- }
- return done(new Error('`err` should have been set!'));
- })
- .exec();
- });
- }
|