specgen
Version:
Angular - Jasmine Unit Test Spec file Generator
62 lines (51 loc) • 2.03 kB
JavaScript
;
const fs = require('fs');
const path = require('path');
const yargs = require('yargs');
const ejs = require('ejs');
const parseTypescript = require('./src/lib/parse-typescript.js');
const util = require('./src/lib/util.js');
const getDirectiveData = require('./src/get-directive-data.js');
const getInjectableData = require('./src/get-injectable-data.js');
const getPipeData = require('./src/get-pipe-data.js');
const getDefaultData = require('./src/get-default-data.js');
const argv = yargs.usage('Usage: $0 <angular-typescript-file> [options]')
.options({
's': { alias: 'spec', describe: 'write the spec file along with source file', type: 'boolean' }
})
.example('$0 my.component.ts', 'generate Angular unit test for my.component.ts')
.help('h')
.argv;
const tsFile = '' + argv._;
const typescript = fs.readFileSync(path.resolve(tsFile), 'utf8');
const specFilePath = path.resolve(tsFile.replace(/\.ts$/, '.spec.ts'));
const existingItBlocks = {};
parseTypescript(typescript).then(tsParsed => {
const angularType = util.getAngularType(typescript); // Component, Directive, Injectable, Pipe, or undefined
const ejsTemplate = util.getEjsTemplate(angularType);
let ejsData;
switch(angularType) {
case 'Component':
case 'Directive':
ejsData = getDirectiveData(tsParsed, tsFile, angularType);
break;
case 'Injectable':
ejsData = getInjectableData(tsParsed, tsFile);
break;
case 'Pipe':
ejsData = getPipeData(tsParsed, tsFile);
break;
default:
ejsData = getDefaultData(tsParsed, tsFile);
break;
}
ejsData.functionTests = Object.assign({}, ejsData.functionTests, existingItBlocks);
const generated = ejs.render(ejsTemplate, ejsData).replace(/\n\s+$/gm, '\n');
if(fs.existsSync(specFilePath)) {
util.createBackupFile(specFilePath, generated);
} else {
fs.writeFileSync(specFilePath, generated);
console.log('Generated unit test for', argv._[0], 'to', specFilePath);
}
});