123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633 |
- /**
- * Module dependencies
- */
- var assert = require('assert');
- var Machine = require('../');
- // ███████╗██╗ ██╗███████╗ ██████╗ ██╗██╗
- // ██╔════╝╚██╗██╔╝██╔════╝██╔════╝██╔╝╚██╗
- // █████╗ ╚███╔╝ █████╗ ██║ ██║ ██║
- // ██╔══╝ ██╔██╗ ██╔══╝ ██║ ██║ ██║
- // ██╗███████╗██╔╝ ██╗███████╗╚██████╗╚██╗██╔╝
- // ╚═╝╚══════╝╚═╝ ╚═╝╚══════╝ ╚═════╝ ╚═╝╚═╝
- //
- describe('Machine.prototype.exec()', function (){
- // ██╗ ██╗██╗████████╗██╗ ██╗ █████╗ ██╗ ██╗
- // ██║ ██║██║╚══██╔══╝██║ ██║ ██╔══██╗██║ ██║
- // ██║ █╗ ██║██║ ██║ ███████║ ███████║██║ ██║
- // ██║███╗██║██║ ██║ ██╔══██║ ██╔══██║██║ ██║
- // ╚███╔███╔╝██║ ██║ ██║ ██║ ██║ ██║███████╗███████╗
- // ╚══╝╚══╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝╚══════╝╚══════╝
- //
- // ██████╗ ███████╗ ██████╗ ██╗ ██╗██╗██████╗ ███████╗██████╗
- // ██╔══██╗██╔════╝██╔═══██╗██║ ██║██║██╔══██╗██╔════╝██╔══██╗
- // ██████╔╝█████╗ ██║ ██║██║ ██║██║██████╔╝█████╗ ██║ ██║
- // ██╔══██╗██╔══╝ ██║▄▄ ██║██║ ██║██║██╔══██╗██╔══╝ ██║ ██║
- // ██║ ██║███████╗╚██████╔╝╚██████╔╝██║██║ ██║███████╗██████╔╝
- // ╚═╝ ╚═╝╚══════╝ ╚══▀▀═╝ ╚═════╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═════╝
- //
- // █████╗ ██████╗ ██████╗ ██╗███╗ ██╗███████╗
- // ██╔══██╗██╔══██╗██╔════╝ ██║████╗ ██║██╔════╝
- // ███████║██████╔╝██║ ███╗██║██╔██╗ ██║███████╗
- // ██╔══██║██╔══██╗██║ ██║██║██║╚██╗██║╚════██║
- // ██║ ██║██║ ██║╚██████╔╝██║██║ ╚████║███████║
- // ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝ ╚═╝╚═╝ ╚═══╝╚══════╝
- //
- // ██████╗ ██████╗ ██████╗ ██╗ ██╗██╗██████╗ ███████╗██████╗
- // ██╔══██╗██╔══██╗██╔═══██╗██║ ██║██║██╔══██╗██╔════╝██╔══██╗
- // ██████╔╝██████╔╝██║ ██║██║ ██║██║██║ ██║█████╗ ██║ ██║
- // ██╔═══╝ ██╔══██╗██║ ██║╚██╗ ██╔╝██║██║ ██║██╔══╝ ██║ ██║
- // ██║ ██║ ██║╚██████╔╝ ╚████╔╝ ██║██████╔╝███████╗██████╔╝
- // ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═══╝ ╚═╝╚═════╝ ╚══════╝╚═════╝
- //
- describe('when all required argins are provided', function () {
- var NM_DEF_FIXTURE = {
- inputs: {
- foo: { example: 'wat', required: true }
- },
- fn: function (inputs, exits){
- throw new Error('Surprise! This one always fails.');
- }
- };
- describe('calling naked .exec()', function () {
- it('should not hang forever, go into an infinite loop, or crash the process -- instead, throw a predictable error', function (){
- var m = Machine.build(NM_DEF_FIXTURE);
- try {
- m({ foo: 'bar' }).exec();
- } catch (e) {
- // (Note: In past versions, this was indicated by a code of 'E_NO_ERROR_CALLBACK_CONFIGURED'.)
- if (e.name === 'UsageError') {
- return;
- }
- else { throw e; }
- }//</catch>
- });
- });//</describe :: calling naked .exec()>
- describe('calling .exec(cb)', function () {
- it('should trigger the callback with the appropriate error', function (done){
- var m = Machine.build(NM_DEF_FIXTURE);
- // Save a reference to the original machine instance for comparison below.
- var _origMachineInstance = m({ foo: 'bar' });
- try {
- _origMachineInstance.exec(function (err) {
- if (err) {
- // if (err.exit !== 'error') { return done(new Error('The error should have had a `exit` property set to `error`-- but instead, got `'+err.exit+'`. Here\'s the whole stack:\n '+err.stack)); }
- // ^^ Not actually guaranteed-- and not officially part of the spec. TODO: investigate this for next major version.
- if (!err.stack.match('Surprise! This one always fails.')) { return done(new Error('Got the wrong error! Here\'s the whole stack:\n '+err.stack)); }
- return done();
- }
- else { return done(new Error('There should have been an error provided to this callback!')); }
- });
- } catch (e) { return done(e); }
- });
- });//</describe :: calling .exec(cb)>
- describe('calling .exec(perExitCallbacks)', function () {
- describe('with an `error` callback provided', function () {
- it('should not hang forever, go into an infinite loop, or crash the process -- instead, throw a predictable UsageError', function (done){
- var m = Machine.build(NM_DEF_FIXTURE);
- // Save a reference to the original machine instance for comparison below.
- var _origMachineInstance = m({ foo: 'bar' });
- try {
- _origMachineInstance.exec({
- error: function (err) {
- return done(new Error('Should never have made it here'));
- },
- success: function (){
- return done(new Error('Should never have made it here'));
- }
- });
- } catch (e) {
- if (e.name === 'UsageError') { return done(); }
- return done(e);
- }
- return done(new Error('Should have thrown a UsageError'));
- });
- });//</describe :: with an `error` callback provided>
- describe('WITHOUT providing an `error` callback', function () {
- it('should not hang forever, go into an infinite loop, or crash the process -- instead, throw a predictable UsageError', function (done){
- var m = Machine.build(NM_DEF_FIXTURE);
- try {
- m({ foo: 'bar' }).exec({
- success: function (){
- return done(new Error('Should never have called this callback!'));
- }
- });
- } catch (e) {
- if (e.name === 'UsageError') { return done(); }
- return done(e);
- }
- return done(new Error('Should have thrown a UsageError'));
- });
- });//</describe :: WITHOUT providing an `error` callback>
- });//</describe :: calling .exec(perExitCallbacks)>
- describe('calling .switch(perExitCallbacks)', function () {
- describe('with an `error` callback provided', function () {
- it('should trigger the `error` callback', function (done){
- var m = Machine.build(NM_DEF_FIXTURE);
- // Save a reference to the original machine instance for comparison below.
- var _origMachineInstance = m({ foo: 'bar' });
- try {
- _origMachineInstance.switch({
- error: function (err) {
- if (err) {
- // if (err.exit !== 'error') { return done(new Error('The error should have had a `exit` property set to `error`. Here\'s the whole stack:\n '+err.stack)); }
- // ^^ Not actually guaranteed-- and not officially part of the spec. TODO: investigate this for next major version.
- if (!err.stack.match('Surprise! This one always fails.')) { return done(new Error('Got the wrong error! Here\'s the whole stack:\n '+err.stack)); }
- return done();
- }
- else { return done(new Error('There should have been an error provided to this callback!')); }
- },
- success: function (){
- return done(new Error('Should have called the `error` callback-- not this one!'));
- }
- });
- } catch (e) { return done(e); }
- });
- });//</describe :: with an `error` callback provided>
- describe('WITHOUT providing an `error` callback', function () {
- it('should not hang forever, go into an infinite loop, or crash the process -- instead, throw a predictable error', function (done){
- var m = Machine.build(NM_DEF_FIXTURE);
- try {
- m({ foo: 'bar' }).switch({
- success: function (){
- return done(new Error('Should never have called this callback!'));
- }
- });
- } catch (e) {
- // (Note: In past versions, this was indicated by a code of 'E_NO_ERROR_CALLBACK_CONFIGURED'.)
- if (e.name === 'UsageError') {
- return done();
- }
- else { return done(e); }
- }//</catch>
- });
- });//</describe :: WITHOUT providing an `error` callback>
- });//</describe :: calling .switch(perExitCallbacks)>
- });//</describe :: when all required argins are provided>
- // ██╗ ██╗██╗████████╗██╗ ██╗
- // ██║ ██║██║╚══██╔══╝██║ ██║
- // ██║ █╗ ██║██║ ██║ ███████║
- // ██║███╗██║██║ ██║ ██╔══██║
- // ╚███╔███╔╝██║ ██║ ██║ ██║
- // ╚══╝╚══╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝
- //
- // ██████╗ ███████╗ ██████╗ ██╗ ██╗██╗██████╗ ███████╗██████╗
- // ██╔══██╗██╔════╝██╔═══██╗██║ ██║██║██╔══██╗██╔════╝██╔══██╗
- // ██████╔╝█████╗ ██║ ██║██║ ██║██║██████╔╝█████╗ ██║ ██║
- // ██╔══██╗██╔══╝ ██║▄▄ ██║██║ ██║██║██╔══██╗██╔══╝ ██║ ██║
- // ██║ ██║███████╗╚██████╔╝╚██████╔╝██║██║ ██║███████╗██████╔╝
- // ╚═╝ ╚═╝╚══════╝ ╚══▀▀═╝ ╚═════╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═════╝
- //
- // █████╗ ██████╗ ██████╗ ██╗███╗ ██╗███████╗
- // ██╔══██╗██╔══██╗██╔════╝ ██║████╗ ██║██╔════╝
- // ███████║██████╔╝██║ ███╗██║██╔██╗ ██║███████╗
- // ██╔══██║██╔══██╗██║ ██║██║██║╚██╗██║╚════██║
- // ██║ ██║██║ ██║╚██████╔╝██║██║ ╚████║███████║
- // ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝ ╚═╝╚═╝ ╚═══╝╚══════╝
- //
- // ██████╗ ███╗ ███╗██╗████████╗████████╗███████╗██████╗
- // ██╔═══██╗████╗ ████║██║╚══██╔══╝╚══██╔══╝██╔════╝██╔══██╗
- // ██║ ██║██╔████╔██║██║ ██║ ██║ █████╗ ██║ ██║
- // ██║ ██║██║╚██╔╝██║██║ ██║ ██║ ██╔══╝ ██║ ██║
- // ╚██████╔╝██║ ╚═╝ ██║██║ ██║ ██║ ███████╗██████╔╝
- // ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚══════╝╚═════╝
- //
- describe('when argins are omitted for 1 or more required inputs', function () {
- var NM_DEF_FIXTURE = {
- inputs: {
- foo: { example: 'wat', required: true }
- },
- fn: function (inputs, exits){ return exits.success(); }
- };
- describe('calling naked .exec()', function () {
- it('should not hang forever, go into an infinite loop, or crash the process -- instead, throw a predictable error', function (){
- var m = Machine.build(NM_DEF_FIXTURE);
- try {
- m().exec();
- } catch (e) {
- // (Note: In past versions, this was indicated by a code of 'E_NO_ERROR_CALLBACK_CONFIGURED'.)
- if (e.name === 'UsageError') {
- return;
- }
- else { throw e; }
- }//</catch>
- });
- });//</describe :: calling naked .exec()>
- describe('calling .exec(cb)', function () {
- it('should trigger the callback with the appropriate error', function (done){
- var m = Machine.build(NM_DEF_FIXTURE);
- // Save a reference to the original machine instance for comparison below.
- var _origMachineInstance = m();
- try {
- _origMachineInstance.exec(function (err) {
- if (err) {
- if (err.code === 'E_INVALID_ARGINS') {
- if (err.machineInstance !== _origMachineInstance) { return done(new Error('The `E_INVALID_ARGINS` error should have had a `machineInstance` property which is the same reference as the original machine instance-- but instead, got: '+util.inspect(err.machineInstance, {depth: null}))); }
- else { return done(); }
- }
- else { return done(new Error('Error should have had `code: \'E_INVALID_ARGINS\', but instead, got: `'+err.code+'`. Here is the stack:'+err.stack)); }
- }
- else { return done(new Error('There should have been a validation error provided to this callback!')); }
- });
- } catch (e) { return done(e); }
- });
- });//</describe :: calling .exec(cb)>
- describe('calling .exec(perExitCallbacks)', function () {
- describe('with an `error` callback provided', function () {
- it('should trigger the `error` callback', function (done){
- var m = Machine.build(NM_DEF_FIXTURE);
- // Save a reference to the original machine instance for comparison below.
- var _origMachineInstance = m();
- try {
- _origMachineInstance.exec({
- error: function (err) {
- if (err) {
- if (err.code === 'E_INVALID_ARGINS') {
- if (err.machineInstance !== _origMachineInstance) { return done(new Error('The `E_INVALID_ARGINS` error should have had a `machineInstance` property which is the same reference as the original machine instance-- but instead, got: '+util.inspect(err.machineInstance, {depth: null}))); }
- else { return done(); }
- }
- else { return done(new Error('Error should have had `code: \'E_INVALID_ARGINS\', but instead, got: `'+err.code+'`. Here is the stack:'+err.stack)); }
- }
- else { return done(new Error('There should have been a validation error provided to this callback!')); }
- },
- success: function (){
- return done(new Error('Should have called the `error` callback-- not this one!'));
- }
- });
- } catch (e) { return done(e); }
- });
- });//</describe :: with an `error` callback provided>
- describe('WITHOUT providing an `error` callback', function () {
- it('should not hang forever, go into an infinite loop, or crash the process -- instead, throw a predictable error', function (done){
- var m = Machine.build(NM_DEF_FIXTURE);
- try {
- m().exec({
- success: function (){
- return done(new Error('Should never have called this callback!'));
- }
- });
- } catch (e) {
- // (Note: In past versions, this was indicated by a code of 'E_NO_ERROR_CALLBACK_CONFIGURED'.)
- if (e.name === 'UsageError') {
- return done();
- }
- else { return done(e); }
- }//</catch>
- });
- });//</describe :: WITHOUT providing an `error` callback>
- });//</describe :: calling .exec(perExitCallbacks)>
- });//</describe :: when argins are omitted for 1 or more required inputs>
- // ██╗ ██╗██╗████████╗██╗ ██╗ ███████╗███╗ ███╗██████╗ ████████╗██╗ ██╗
- // ██║ ██║██║╚══██╔══╝██║ ██║ ██╔════╝████╗ ████║██╔══██╗╚══██╔══╝╚██╗ ██╔╝
- // ██║ █╗ ██║██║ ██║ ███████║ █████╗ ██╔████╔██║██████╔╝ ██║ ╚████╔╝
- // ██║███╗██║██║ ██║ ██╔══██║ ██╔══╝ ██║╚██╔╝██║██╔═══╝ ██║ ╚██╔╝
- // ╚███╔███╔╝██║ ██║ ██║ ██║ ███████╗██║ ╚═╝ ██║██║ ██║ ██║
- // ╚══╝╚══╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝
- //
- // ███████╗████████╗██████╗ ██╗███╗ ██╗ ██████╗ ███████╗ ██████╗ ██████╗
- // ██╔════╝╚══██╔══╝██╔══██╗██║████╗ ██║██╔════╝ ██╔════╝██╔═══██╗██╔══██╗
- // ███████╗ ██║ ██████╔╝██║██╔██╗ ██║██║ ███╗ █████╗ ██║ ██║██████╔╝
- // ╚════██║ ██║ ██╔══██╗██║██║╚██╗██║██║ ██║ ██╔══╝ ██║ ██║██╔══██╗
- // ███████║ ██║ ██║ ██║██║██║ ╚████║╚██████╔╝ ██║ ╚██████╔╝██║ ██║
- // ╚══════╝ ╚═╝ ╚═╝ ╚═╝╚═╝╚═╝ ╚═══╝ ╚═════╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝
- //
- // ██████╗ ███████╗ ██████╗ ██╗ ██╗██╗██████╗ ███████╗██████╗
- // ██╔══██╗██╔════╝██╔═══██╗██║ ██║██║██╔══██╗██╔════╝██╔══██╗
- // ██████╔╝█████╗ ██║ ██║██║ ██║██║██████╔╝█████╗ ██║ ██║
- // ██╔══██╗██╔══╝ ██║▄▄ ██║██║ ██║██║██╔══██╗██╔══╝ ██║ ██║
- // ██║ ██║███████╗╚██████╔╝╚██████╔╝██║██║ ██║███████╗██████╔╝
- // ╚═╝ ╚═╝╚══════╝ ╚══▀▀═╝ ╚═════╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═════╝
- //
- // ███████╗████████╗██████╗ ██╗███╗ ██╗ ██████╗ ██╗███╗ ██╗██████╗ ██╗ ██╗████████╗
- // ██╔════╝╚══██╔══╝██╔══██╗██║████╗ ██║██╔════╝ ██║████╗ ██║██╔══██╗██║ ██║╚══██╔══╝
- // ███████╗ ██║ ██████╔╝██║██╔██╗ ██║██║ ███╗ ██║██╔██╗ ██║██████╔╝██║ ██║ ██║
- // ╚════██║ ██║ ██╔══██╗██║██║╚██╗██║██║ ██║ ██║██║╚██╗██║██╔═══╝ ██║ ██║ ██║
- // ███████║ ██║ ██║ ██║██║██║ ╚████║╚██████╔╝ ██║██║ ╚████║██║ ╚██████╔╝ ██║
- // ╚══════╝ ╚═╝ ╚═╝ ╚═╝╚═╝╚═╝ ╚═══╝ ╚═════╝ ╚═╝╚═╝ ╚═══╝╚═╝ ╚═════╝ ╚═╝
- //
- describe('when empty string is provided for a required string input', function () {
- var NM_DEF_FIXTURE = {
- inputs: {
- foo: { example: 'wat', required: true }
- },
- fn: function (inputs, exits){ return exits.success(); }
- };
- describe('calling naked .exec()', function () {
- it('should not hang forever, go into an infinite loop, or crash the process -- instead, throw a predictable error', function (){
- var m = Machine.build(NM_DEF_FIXTURE);
- try {
- m({foo: ''}).exec();
- } catch (e) {
- // (Note: In past versions, this was indicated by a code of 'E_NO_ERROR_CALLBACK_CONFIGURED'.)
- if (e.name === 'UsageError') {
- return;
- }
- else { throw e; }
- }//</catch>
- });
- });//</describe :: calling naked .exec()>
- describe('calling .exec(cb)', function () {
- it('should trigger the callback with the appropriate error', function (done){
- var m = Machine.build(NM_DEF_FIXTURE);
- // Save a reference to the original machine instance for comparison below.
- var _origMachineInstance = m({foo: ''});
- try {
- _origMachineInstance.exec(function (err) {
- if (err) {
- if (err.code === 'E_INVALID_ARGINS') {
- if (err.machineInstance !== _origMachineInstance) { return done(new Error('The `E_INVALID_ARGINS` error should have had a `machineInstance` property which is the same reference as the original machine instance-- but instead, got: '+util.inspect(err.machineInstance, {depth: null}))); }
- else { return done(); }
- }
- else { return done(new Error('Error should have had `code: \'E_INVALID_ARGINS\', but instead, got: `'+err.code+'`. Here is the stack:'+err.stack)); }
- }
- else { return done(new Error('There should have been a validation error provided to this callback!')); }
- });
- } catch (e) { return done(e); }
- });
- });//</describe :: calling .exec(cb)>
- describe('calling .exec(perExitCallbacks)', function () {
- describe('with an `error` callback provided', function () {
- it('should trigger the `error` callback', function (done){
- var m = Machine.build(NM_DEF_FIXTURE);
- // Save a reference to the original machine instance for comparison below.
- var _origMachineInstance = m({foo: ''});
- try {
- _origMachineInstance.exec({
- error: function (err) {
- if (err) {
- if (err.code === 'E_INVALID_ARGINS') {
- if (err.machineInstance !== _origMachineInstance) { return done(new Error('The `E_INVALID_ARGINS` error should have had a `machineInstance` property which is the same reference as the original machine instance-- but instead, got: '+util.inspect(err.machineInstance, {depth: null}))); }
- else { return done(); }
- }
- else { return done(new Error('Error should have had `code: \'E_INVALID_ARGINS\', but instead, got: `'+err.code+'`. Here is the stack:'+err.stack)); }
- }
- else { return done(new Error('There should have been a validation error provided to this callback!')); }
- },
- success: function (){
- return done(new Error('Should have called the `error` callback-- not this one!'));
- }
- });
- } catch (e) { return done(e); }
- });
- });//</describe :: with an `error` callback provided>
- describe('WITHOUT providing an `error` callback', function () {
- it('should not hang forever, go into an infinite loop, or crash the process -- instead, throw a predictable error', function (done){
- var m = Machine.build(NM_DEF_FIXTURE);
- try {
- m({foo: ''}).exec({
- success: function (){
- return done(new Error('Should never have called this callback!'));
- }
- });
- } catch (e) {
- // (Note: In past versions, this was indicated by a code of 'E_NO_ERROR_CALLBACK_CONFIGURED'.)
- if (e.name === 'UsageError') {
- return done();
- }
- else { return done(e); }
- }//</catch>
- });
- });//</describe :: WITHOUT providing an `error` callback>
- });//</describe :: calling .exec(perExitCallbacks)>
- });//</describe :: when argins are omitted for 1 or more required inputs>
- // ███╗ ██╗██╗ ██╗██╗ ██╗ ██╗ ██╗ █████╗ ██╗ ██╗ ██╗███████╗███████╗
- // ████╗ ██║██║ ██║██║ ██║ ██║ ██║██╔══██╗██║ ██║ ██║██╔════╝██╔════╝
- // ██╔██╗ ██║██║ ██║██║ ██║ ██║ ██║███████║██║ ██║ ██║█████╗ ███████╗
- // ██║╚██╗██║██║ ██║██║ ██║ ╚██╗ ██╔╝██╔══██║██║ ██║ ██║██╔══╝ ╚════██║
- // ██║ ╚████║╚██████╔╝███████╗███████╗ ╚████╔╝ ██║ ██║███████╗╚██████╔╝███████╗███████║
- // ╚═╝ ╚═══╝ ╚═════╝ ╚══════╝╚══════╝ ╚═══╝ ╚═╝ ╚═╝╚══════╝ ╚═════╝ ╚══════╝╚══════╝
- //
- // ██╗███╗ ██╗ ██╗███╗ ██╗██████╗ ██╗ ██╗████████╗███████╗
- // ██║████╗ ██║ ██║████╗ ██║██╔══██╗██║ ██║╚══██╔══╝██╔════╝
- // ██║██╔██╗ ██║ ██║██╔██╗ ██║██████╔╝██║ ██║ ██║ ███████╗
- // ██║██║╚██╗██║ ██║██║╚██╗██║██╔═══╝ ██║ ██║ ██║ ╚════██║
- // ██║██║ ╚████║ ██║██║ ╚████║██║ ╚██████╔╝ ██║ ███████║
- // ╚═╝╚═╝ ╚═══╝ ╚═╝╚═╝ ╚═══╝╚═╝ ╚═════╝ ╚═╝ ╚══════╝
- //
- // ██╗ ██╗██╗████████╗██╗ ██╗
- // ██║ ██║██║╚══██╔══╝██║ ██║
- // ██║ █╗ ██║██║ ██║ ███████║
- // ██║███╗██║██║ ██║ ██╔══██║
- // ╚███╔███╔╝██║ ██║ ██║ ██║
- // ╚══╝╚══╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝
- //
- // █████╗ ██╗ ██╗ ██████╗ ██╗ ██╗███╗ ██╗██╗ ██╗██╗ ██╗
- // ██╔══██╗██║ ██║ ██╔═══██╗██║ ██║████╗ ██║██║ ██║██║ ██║
- // ███████║██║ ██║ ██║ ██║██║ █╗ ██║██╔██╗ ██║██║ ██║██║ ██║
- // ██╔══██║██║ ██║ ██║ ██║██║███╗██║██║╚██╗██║██║ ██║██║ ██║
- // ██║ ██║███████╗███████╗╚██████╔╝╚███╔███╔╝██║ ╚████║╚██████╔╝███████╗███████╗
- // ╚═╝ ╚═╝╚══════╝╚══════╝ ╚═════╝ ╚══╝╚══╝ ╚═╝ ╚═══╝ ╚═════╝ ╚══════╝╚══════╝
- //
- describe('with null values in required inputs that have `allowNull: true`', function() {
- var NM_DEF_FIXTURE = {
- inputs: {
- str: { example: 'wat', allowNull: true },
- num: { example: 123, allowNull: true },
- bool: { example: true, allowNull: true }
- },
- fn: function (inputs, exits){ return exits.success(); }
- };
- describe('calling .exec(cb)', function () {
- it('should not trigger any errors', function (done){
- var m = Machine.build(NM_DEF_FIXTURE);
- m({str: null, num: null, bool: null}).exec(done);
- });
- });//</describe :: calling .exec(cb)>
- });
- // ███╗ ██╗██╗ ██╗██╗ ██╗ ██╗ ██╗ █████╗ ██╗ ██╗ ██╗███████╗
- // ████╗ ██║██║ ██║██║ ██║ ██║ ██║██╔══██╗██║ ██║ ██║██╔════╝
- // ██╔██╗ ██║██║ ██║██║ ██║ ██║ ██║███████║██║ ██║ ██║█████╗
- // ██║╚██╗██║██║ ██║██║ ██║ ╚██╗ ██╔╝██╔══██║██║ ██║ ██║██╔══╝
- // ██║ ╚████║╚██████╔╝███████╗███████╗ ╚████╔╝ ██║ ██║███████╗╚██████╔╝███████╗
- // ╚═╝ ╚═══╝ ╚═════╝ ╚══════╝╚══════╝ ╚═══╝ ╚═╝ ╚═╝╚══════╝ ╚═════╝ ╚══════╝
- //
- // ██╗███╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗ ██╗██╗██████╗ ███████╗██████╗
- // ██║████╗ ██║ ██╔══██╗██╔════╝██╔═══██╗██║ ██║██║██╔══██╗██╔════╝██╔══██╗
- // ██║██╔██╗ ██║ ██████╔╝█████╗ ██║ ██║██║ ██║██║██████╔╝█████╗ ██║ ██║
- // ██║██║╚██╗██║ ██╔══██╗██╔══╝ ██║▄▄ ██║██║ ██║██║██╔══██╗██╔══╝ ██║ ██║
- // ██║██║ ╚████║ ██║ ██║███████╗╚██████╔╝╚██████╔╝██║██║ ██║███████╗██████╔╝
- // ╚═╝╚═╝ ╚═══╝ ╚═╝ ╚═╝╚══════╝ ╚══▀▀═╝ ╚═════╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═════╝
- //
- // ██╗███████╗ ██████╗ ███╗ ██╗ ██╗███╗ ██╗██████╗ ██╗ ██╗████████╗
- // ██║██╔════╝██╔═══██╗████╗ ██║ ██║████╗ ██║██╔══██╗██║ ██║╚══██╔══╝
- // ██║███████╗██║ ██║██╔██╗ ██║ ██║██╔██╗ ██║██████╔╝██║ ██║ ██║
- // ██ ██║╚════██║██║ ██║██║╚██╗██║ ██║██║╚██╗██║██╔═══╝ ██║ ██║ ██║
- // ╚█████╔╝███████║╚██████╔╝██║ ╚████║ ██║██║ ╚████║██║ ╚██████╔╝ ██║
- // ╚════╝ ╚══════╝ ╚═════╝ ╚═╝ ╚═══╝ ╚═╝╚═╝ ╚═══╝╚═╝ ╚═════╝ ╚═╝
- //
- describe('with null value in required json input', function() {
- var NM_DEF_FIXTURE = {
- inputs: {
- foo: { example: '*', required: true }
- },
- fn: function (inputs, exits){ return exits.success(); }
- };
- describe('calling .exec(cb)', function () {
- it('should trigger the callback with the appropriate error', function (done){
- var m = Machine.build(NM_DEF_FIXTURE);
- // Save a reference to the original machine instance for comparison below.
- var _origMachineInstance = m({foo: null});
- try {
- _origMachineInstance.exec(function (err) {
- if (err) {
- if (err.code === 'E_INVALID_ARGINS') {
- if (err.machineInstance !== _origMachineInstance) { return done(new Error('The `E_INVALID_ARGINS` error should have had a `machineInstance` property which is the same reference as the original machine instance-- but instead, got: '+util.inspect(err.machineInstance, {depth: null}))); }
- else { return done(); }
- }
- else { return done(new Error('Error should have had `code: \'E_INVALID_ARGINS\', but instead, got: `'+err.code+'`. Here is the stack:'+err.stack)); }
- }
- else { return done(new Error('There should have been a validation error provided to this callback!')); }
- });
- } catch (e) { return done(e); }
- });
- });//</describe :: calling .exec(cb)>
- });
- // ███╗ ██╗██╗ ██╗██╗ ██╗ ██╗ ██╗ █████╗ ██╗ ██╗ ██╗███████╗
- // ████╗ ██║██║ ██║██║ ██║ ██║ ██║██╔══██╗██║ ██║ ██║██╔════╝
- // ██╔██╗ ██║██║ ██║██║ ██║ ██║ ██║███████║██║ ██║ ██║█████╗
- // ██║╚██╗██║██║ ██║██║ ██║ ╚██╗ ██╔╝██╔══██║██║ ██║ ██║██╔══╝
- // ██║ ╚████║╚██████╔╝███████╗███████╗ ╚████╔╝ ██║ ██║███████╗╚██████╔╝███████╗
- // ╚═╝ ╚═══╝ ╚═════╝ ╚══════╝╚══════╝ ╚═══╝ ╚═╝ ╚═╝╚══════╝ ╚═════╝ ╚══════╝
- //
- // ██╗███╗ ██╗ ██████╗ ███████╗ ██████╗ ██╗ ██╗██╗██████╗ ███████╗██████╗
- // ██║████╗ ██║ ██╔══██╗██╔════╝██╔═══██╗██║ ██║██║██╔══██╗██╔════╝██╔══██╗
- // ██║██╔██╗ ██║ ██████╔╝█████╗ ██║ ██║██║ ██║██║██████╔╝█████╗ ██║ ██║
- // ██║██║╚██╗██║ ██╔══██╗██╔══╝ ██║▄▄ ██║██║ ██║██║██╔══██╗██╔══╝ ██║ ██║
- // ██║██║ ╚████║ ██║ ██║███████╗╚██████╔╝╚██████╔╝██║██║ ██║███████╗██████╔╝
- // ╚═╝╚═╝ ╚═══╝ ╚═╝ ╚═╝╚══════╝ ╚══▀▀═╝ ╚═════╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═════╝
- //
- // ██████╗ ███████╗███████╗ ██╗███╗ ██╗██████╗ ██╗ ██╗████████╗
- // ██╔══██╗██╔════╝██╔════╝ ██║████╗ ██║██╔══██╗██║ ██║╚══██╔══╝
- // ██████╔╝█████╗ █████╗ ██║██╔██╗ ██║██████╔╝██║ ██║ ██║
- // ██╔══██╗██╔══╝ ██╔══╝ ██║██║╚██╗██║██╔═══╝ ██║ ██║ ██║
- // ██║ ██║███████╗██║ ██║██║ ╚████║██║ ╚██████╔╝ ██║
- // ╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝╚═╝ ╚═══╝╚═╝ ╚═════╝ ╚═╝
- //
- describe('with null value in required ref input', function() {
- var NM_DEF_FIXTURE = {
- inputs: {
- foo: { example: '===', required: true }
- },
- fn: function (inputs, exits){ return exits.success(); }
- };
- describe('calling .exec(cb)', function () {
- it('should trigger the callback with the appropriate error', function (done){
- var m = Machine.build(NM_DEF_FIXTURE);
- // Save a reference to the original machine instance for comparison below.
- var _origMachineInstance = m({foo: null});
- try {
- _origMachineInstance.exec(function (err) {
- if (err) {
- if (err.code === 'E_INVALID_ARGINS') {
- if (err.machineInstance !== _origMachineInstance) { return done(new Error('The `E_INVALID_ARGINS` error should have had a `machineInstance` property which is the same reference as the original machine instance-- but instead, got: '+util.inspect(err.machineInstance, {depth: null}))); }
- else { return done(); }
- }
- else { return done(new Error('Error should have had `code: \'E_INVALID_ARGINS\', but instead, got: `'+err.code+'`. Here is the stack:'+err.stack)); }
- }
- else { return done(new Error('There should have been a validation error provided to this callback!')); }
- });
- } catch (e) { return done(e); }
- });
- });//</describe :: calling .exec(cb)>
- });
- });//</describe :: Machine.prototype.exec()>
|