123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554 |
- /**
- * Module dependencies
- */
- var util = require('util');
- var _ = require('@sailshq/lodash');
- var assert = require('assert');
- var Machine = require('../');
- var runSuite = require('../node_modules/rttc/spec/helpers/run-suite');
- var TEST_SUITE = require('../node_modules/rttc/spec/coercion.spec.js');
- var toRunTest = require('./util/test-exit-coercion.helper');
- var expandSuite = require('../node_modules/rttc/spec/helpers/expand-suite');
- describe('output coercion (for exits)', function (){
- describe('using exhaustive fixtures from RTTC', function (){
- // Take the array of tests and extend them with some derivative
- // tests automatically. Then run them.
- runSuite(expandSuite(TEST_SUITE), toRunTest );
- });//</using exhaustive fixtures from RTTC>
- describe('additional test cases specific to the machine runner', function() {
- it('should pass through expected data', function(done) {
- Machine.build({
- inputs: {
- foo: {
- example: 'foo bar'
- }
- },
- exits: {
- success: {
- example: 'hello'
- },
- error: {
- example: 'world'
- }
- },
- fn: function (inputs, exits, deps) {
- exits(null, 'foo');
- }
- })
- .configure({
- foo: 'hello'
- })
- .exec(function(err, result) {
- if(err) { return done(err); }
- assert(result === 'foo');
- done();
- });
- });
- it('should coerce invalid exit data into the correct types', function(done) {
- Machine.build({
- inputs: {
- foo: {
- example: 'foo bar'
- }
- },
- exits: {
- success: {
- example: 4
- },
- error: {
- example: 'world'
- }
- },
- fn: function (inputs, exits, deps) {
- exits(null, '100');
- }
- })
- .configure({
- foo: 'hello'
- })
- .exec(function(err, result) {
- if(err) { return done(err); }
- assert.strictEqual(result,100);
- done();
- });
- });
- it('should provide base types for values not present in the exit data', function(done) {
- Machine.build({
- inputs: {
- foo: {
- example: 'foo bar'
- }
- },
- exits: {
- success: {
- example: 4
- },
- error: {
- example: 'world'
- }
- },
- fn: function (inputs, exits, deps) {
- exits(null);
- }
- })
- .configure({
- foo: 'hello'
- })
- .exec(function(err, result) {
- if(err) { return done(err); }
- assert.strictEqual(result,0);
- done();
- });
- });
- it('should coerce string to number', function(done) {
- Machine.build({
- inputs: {},
- exits: {
- success: {
- example: 4
- }
- },
- fn: function (inputs, exits, deps) {
- exits.success('whatever');
- }
- }).exec(function(err, result) {
- if(err) { return done(err); }
- assert.strictEqual(result,0);
- done();
- });
- });
- it('should coerce boolean to number', function(done) {
- Machine.build({
- inputs: {},
- exits: {
- success: {
- example: 4
- }
- },
- fn: function (inputs, exits, deps) {
- exits.success(true);
- }
- }).exec(function(err, result) {
- if(err) { return done(err); }
- assert.strictEqual(result,1);
- done();
- });
- });
- it('should coerce undefined to example ({})', function(done) {
- Machine.build({
- inputs: {},
- exits: {
- success: {
- example: {}
- }
- },
- fn: function (inputs, exits, deps) {
- exits.success();
- }
- }).exec(function(err, result) {
- if(err) { return done(err); }
- assert.deepEqual(result,{});
- done();
- });
- });
- it('should coerce 0 to example ({})', function(done) {
- Machine.build({
- inputs: {},
- exits: {
- success: {
- example: {}
- }
- },
- fn: function (inputs, exits, deps) {
- exits.success(0);
- }
- }).exec(function(err, result) {
- if(err) { return done(err); }
- assert.deepEqual(result,{});
- done();
- });
- });
- it('should coerce 0 to example ({foo: ""})', function(done) {
- Machine.build({
- inputs: {},
- exits: {
- success: {
- example: {foo: 'bar'}
- }
- },
- fn: function (inputs, exits, deps) {
- exits.success(0);
- }
- }).exec(function(err, result) {
- if(err) { return done(err); }
- assert.deepEqual(result,{foo:''});
- done();
- });
- });
- it('should coerce 0 to example ({foo: [""], bar: {}})', function(done) {
- Machine.build({
- inputs: {},
- exits: {
- success: {
- example: {foo: ['stuff'], bar: {}}
- }
- },
- fn: function (inputs, exits, deps) {
- exits.success(0);
- }
- }).exec(function(err, result) {
- if(err) { return done(err); }
- assert.deepEqual(result,{foo:[], bar: {}});
- done();
- });
- });
- it('should coerce 0 to example ({foo: [""], bar: {baz: 0}})', function(done) {
- Machine.build({
- inputs: {},
- exits: {
- success: {
- example: {foo: ['stuff'], bar: {baz: 12412}}
- }
- },
- fn: function (inputs, exits, deps) {
- exits.success(0);
- }
- }).exec(function(err, result) {
- if(err) { return done(err); }
- assert.deepEqual(result,{foo:[], bar: {baz: 0}});
- done();
- });
- });
- it('should coerce 0 to example ({foo: [""], someArray: []})', function(done) {
- Machine.build({
- inputs: {},
- exits: {
- success: {
- example: {foo: ['stuff'], someArray: []}
- }
- },
- fn: function (inputs, exits, deps) {
- exits.success(0);
- }
- }).exec(function(err, result) {
- if(err) { return done(err); }
- assert.deepEqual(result,{foo:[], someArray: []});
- done();
- });
- });
- it('should coerce 0 to example ({foo: [""], someArray: []}) with someArray in example => ["*"]', function(done) {
- Machine.build({
- inputs: {},
- exits: {
- success: {
- example: {foo: ['stuff'], someArray: ['*']}
- }
- },
- fn: function (inputs, exits, deps) {
- exits.success(0);
- }
- }).exec(function(err, result) {
- if(err) { return done(err); }
- assert.deepEqual(result,{foo:[], someArray: []});
- done();
- });
- });
- it('should coerce `{foo: ["hi"], someArray: [1234]}` to `{foo: ["hi"], someArray: [1234]}` with someArray in example => ["*"]', function(done) {
- Machine.build({
- inputs: {},
- exits: {
- success: {
- example: {foo: ['stuff'], someArray: ['*']}
- }
- },
- fn: function (inputs, exits, deps) {
- exits.success({foo: ['hi'], someArray: [1234]});
- }
- }).exec(function(err, result) {
- if(err) { return done(err); }
- assert.deepEqual(result,{foo:['hi'], someArray: [1234]});
- done();
- });
- });
- it('should coerce undefined to example ([])', function(done) {
- Machine.build({
- inputs: {},
- exits: {
- success: {
- example: []
- }
- },
- fn: function (inputs, exits, deps) {
- exits.success();
- }
- }).exec(function(err, result) {
- if(err) { return done(err); }
- assert.deepEqual(result,[]);
- done();
- });
- });
- it('should coerce null to example ([])', function(done) {
- Machine.build({
- inputs: {},
- exits: {
- success: {
- example: []
- }
- },
- fn: function (inputs, exits, deps) {
- exits.success(null);
- }
- }).exec(function(err, result) {
- if(err) { return done(err); }
- assert.deepEqual(result,[]);
- done();
- });
- });
- it('should coerce 0 to example ([])', function(done) {
- Machine.build({
- inputs: {},
- exits: {
- success: {
- example: []
- }
- },
- fn: function (inputs, exits, deps) {
- exits.success(0);
- }
- }).exec(function(err, result) {
- if(err) { return done(err); }
- assert.deepEqual(result,[]);
- done();
- });
- });
- it('should coerce 0 to example ([0])', function(done) {
- Machine.build({
- inputs: {},
- exits: {
- success: {
- example: [123]
- }
- },
- fn: function (inputs, exits, deps) {
- exits.success(0);
- }
- }).exec(function(err, result) {
- if(err) { return done(err); }
- assert.deepEqual(result,[]);
- done();
- });
- });
- it('should coerce 0 to example ([""])', function(done) {
- Machine.build({
- inputs: {},
- exits: {
- success: {
- example: ['stuff']
- }
- },
- fn: function (inputs, exits, deps) {
- exits.success(0);
- }
- }).exec(function(err, result) {
- if(err) { return done(err); }
- assert.deepEqual(result,[]);
- done();
- });
- });
- it('should coerce 0 to example ([false])', function(done) {
- Machine.build({
- inputs: {},
- exits: {
- success: {
- example: [true]
- }
- },
- fn: function (inputs, exits, deps) {
- exits.success(0);
- }
- }).exec(function(err, result) {
- if(err) { return done(err); }
- assert.deepEqual(result,[]);
- done();
- });
- });
- ///////////////////////////////////////////////////////////////////////////////////////////////
- // Some edge cases:
- ///////////////////////////////////////////////////////////////////////////////////////////////
- var edgeCaseMachineDef = {
- inputs: {
- criteria: {
- friendlyName: 'criteria',
- typeclass: 'dictionary',
- description: 'Waterline search criteria to use in retrieving Job instances'
- }
- },
- exits: {
- success: {
- friendlyName: 'then',
- example: {
- title: 'scott',
- description: 'scott',
- votes: 123,
- id: 123
- }
- },
- error: {
- example: undefined
- },
- notFound: {
- void: true
- }
- },
- fn: function(inputs, exits, env) {
- function Thing(){}
- var thing = new Thing();
- thing.id=1;
- thing.votes=null;
- thing.description='stuff';
- thing.title='thing';
- // return exits(null, thing);
- return exits.success(thing);
- },
- identity: 'findOne_job'
- };
- // Same as edgeCaseMachine but w/ a slightly different fn that uses switchback-style usage:
- var edgeCaseMachineDef2 = _.cloneDeep(edgeCaseMachineDef);
- edgeCaseMachineDef2.fn = function(inputs, exits, env) {
- function Thing(){}
- var thing = new Thing();
- thing.id=1;
- thing.votes=null;
- thing.description='stuff';
- thing.title='thing';
- return exits(null, thing);
- };
- it('should coerce output properly (null=>0 in this case) when using normal `exits.success(result)` from within the machine `fn`', function (done){
- Machine.build(edgeCaseMachineDef).configure({criteria: {id: 1}}).exec({
- error: function (err){
- return done(err);
- },
- success: function (result){
- assert.equal(result.votes, 0, 'Expected `votes` property of result to equal zero, but check out the result:'+util.inspect(result));
- return done();
- }
- });
- });
- it('should coerce output properly (null=>0 in this case) when using implementor switchback (`exits(err, result)`) within the machine `fn`', function (done){
- Machine.build(edgeCaseMachineDef2).configure({criteria: {id: 1}}).exec({
- error: function (err){
- return done(err);
- },
- success: function (result){
- assert.equal(result.votes, 0, 'Expected `votes` property of result to equal zero, but check out the result:'+util.inspect(result));
- return done();
- }
- });
- });
- it('should reject `null` exit example', function (done){
- Machine.build({
- inputs: {},
- exits: {
- success: {
- friendlyName: 'then',
- example: {
- title: 'scott',
- description: 'scott',
- votes: null,
- id: 123
- }
- }
- },
- fn: function (inputs, exits) {
- exits.success();
- }
- }).exec({
- error: function (err){
- return done();
- },
- success: function (result){
- return done(new Error('Expected error exit to be traversed because exit example contains a null value.'));
- }
- });
- });
- });//</additional test cases specific to the machine runner>
- });
|