HackMyResume/test/scripts/test-verbs.js

217 lines
4.7 KiB
JavaScript

/**
High-level API test routines for HackMyResume. Test HackMyResume verbs such
as build, new, peek, etc., by creating and invoking a Verb object.
@module test-verbs.js
@license MIT. See LICENSE.md for details.
*/
var chai = require('chai')
, chaiAsPromised = require("chai-as-promised")
, path = require('path')
, _ = require('underscore')
, FRESHResume = require('../../src/core/fresh-resume')
, FCMD = require( '../../src/index')
, validator = require('is-my-json-valid')
, EXTEND = require('extend');
// Initialize Chai As Promised
chai.use(chaiAsPromised);
expect = chai.expect;
assert = chai.assert;
should = chai.should();
chai.config.includeStack = false;
var _sheet;
var opts = {
format: 'FRESH',
prettify: true,
silent: false,
assert: true // Causes validation errors to throw exceptions
};
var opts2 = {
format: 'JRS',
prettify: true,
silent: true
};
var sb = 'test/sandbox/';
var ft = 'node_modules/fresh-test-resumes/src/fresh/';
// Assemble an array of tests, taking the form of parameters we'll pass to
// each of the defined HackMyResume verbs.
var tests = [
[ 'new',
[sb + 'new-fresh-resume.json'],
[],
opts,
' (FRESH format)'
],
[ 'new',
[sb + 'new-jrs-resume.json'],
[],
opts2,
' (JRS format)'
],
[
'new',
[sb + 'new-1.json', sb + 'new-2.json', sb + 'new-3.json'],
[],
opts,
' (multiple FRESH resumes)'
],
[ 'new',
[sb + 'new-jrs-1.json', sb + 'new-jrs-2.json', sb + 'new-jrs-3.json'],
[],
opts,
' (multiple JRS resumes)'
],
[ '!new',
[],
[],
opts,
" (when a filename isn't specified)"
],
[ 'validate',
[ft + 'jane-fullstacker.json'],
[],
opts,
' (jane-q-fullstacker|FRESH)'
],
[ 'validate',
[ft + 'johnny-trouble.json'],
[],
opts,
' (johnny-trouble|FRESH)'
],
[ 'validate',
[sb + 'new-fresh-resume.json'],
[],
opts,
' (new-fresh-resume|FRESH)'
],
[ 'validate',
['node_modules/fresh-test-resumes/src/jrs/richard-hendriks.json'],
[],
opts2,
' (richard-hendriks.json|JRS)'
],
[ 'validate',
['node_modules/fresh-test-resumes/src/jrs/jane-incomplete.json'],
[],
opts2,
' (jane-incomplete.json|JRS)'
],
[ 'validate',
[sb + 'new-1.json', sb + 'new-jrs-resume.json', sb + 'new-1.json',
sb + 'new-2.json', sb + 'new-3.json'],
[],
opts,
' (5|BOTH)'
],
[ 'analyze',
[ft + 'jane-fullstacker.json'],
[],
opts,
' (jane-q-fullstacker|FRESH)'
],
[ 'analyze',
['node_modules/fresh-test-resumes/src/jrs/richard-hendriks.json'],
[],
opts2,
' (richard-hendriks|JRS)'
],
[ 'build',
[ ft + 'jane-fullstacker.json', ft + 'override/jane-fullstacker-override.fresh.json' ],
[ sb + 'merged/jane-fullstacker-gamedev.fresh.all'],
opts,
' (jane-q-fullstacker w/ override|FRESH)'
],
[ 'build',
[ ft + 'override/jane-partial-a.json', ft + 'override/jane-partial-b.json',
ft + 'override/jane-partial-c.json' ],
[ sb + 'merged/jane-abc.fresh.all'],
opts,
' (jane merge A + B + C|FRESH)',
function( r ) {
var expected = [
'name','meta','info', 'contact', 'location', 'projects', 'social',
'employment', 'education', 'affiliation', 'service', 'skills',
'samples', 'writing', 'reading', 'speaking', 'recognition',
'references', 'testimonials', 'languages', 'interests',
'extracurricular', 'governance'
];
Object.keys( _.pick( r, expected ) ).length
.should.equal( expected.length );
}
],
[ '!build',
[ ft + 'jane-fullstacker.json'],
[ sb + 'shouldnt-exist.pdf' ],
EXTEND(true, {}, opts, { theme: 'awesome' }),
' (jane-q-fullstacker + Awesome + PDF|FRESH)'
]
];
// Set up the main test suite for the API interface
describe('Testing API interface', function () {
this.timeout(5000);
function run( verb, src, dst, opts, msg, fnTest ) {
msg = msg || '.';
var shouldSucceed = true;
if( verb[0] === '!' ) {
verb = verb.substr(1);
shouldSucceed = false;
}
it( 'The ' + verb.toUpperCase() + ' command should ' +
(shouldSucceed ? ' SUCCEED' : ' FAIL') + msg, function (done) {
var v = new FCMD.verbs[verb]();
v.on('hmr:error', function(ex) {
assert(false);
});
var prom = v.invoke( src, dst, opts );
var fulfillMethod = shouldSucceed ? 'fulfilled' : 'rejected';
if( fnTest ) {
prom.should.be[ fulfillMethod ].then( function( obj ) {
fnTest(obj.sheet);
}).should.notify(done);
}
else {
prom.should.be[fulfillMethod].notify(done);
}
});
}
tests.forEach( function(a) {
run.apply( /* The players of */ null, a );
});
});