import { join } from 'path'; import { dest, src, task } from 'gulp'; import { DIST_VENDOR_ROOT, NPM_VENDOR_FILES, PROJECT_ROOT, SCRIPTS_ROOT } from '../constants'; task('test', ['test.assembleVendorJs', 'compile.karma'], (done: Function) => { karmaTest(false, done); }); task('test.fast', ['compile.karma'], (done: Function) => { karmaTest(false, done); }); task('test.watch', ['test.assembleVendorJs', 'compile.karma'], (done: Function) => { karmaTest(true, done); }); task('test.coverage', ['test.assembleVendorJs', 'compile.karma'], (done: Function) => { karmaTest(false, () => { createKarmaCoverageReport(done); }); }); task('test.imageserver', () => { const http = require('http'); const url = require('url'); const port = 8900; const requestedUrls = []; let start = Date.now(); function handleRequest(req, res) { const urlParse = url.parse(req.url, true); res.setHeader('Access-Control-Allow-Origin', '*'); res.setHeader('Access-Control-Allow-Methods', 'GET'); res.setHeader('Connection', 'keep-alive'); res.setHeader('Age', '0'); res.setHeader('cache-control', 'no-store'); if (urlParse.pathname === '/reset') { console.log('Image Server Reset'); console.log('---------------------------'); requestedUrls.length = 0; start = Date.now(); res.setHeader('Content-Type', 'text/plain'); res.end('reset'); return; } const delay = urlParse.query.d || 1000; const id = urlParse.query.id || Math.round(Math.random() * 1000); const width = urlParse.query.w || 80; const height = urlParse.query.h || 80; const color = urlParse.query.c || 'yellow'; requestedUrls.push(req.url); console.log(`id: ${id}, requested: ${requestedUrls.filter(f => f === req.url).length}, timestamp: ${Date.now() - start}`); setTimeout(() => { res.setHeader('Content-Type', 'image/svg+xml'); res.end(` ${id} `); }, delay); } http.globalAgent.maxSockets = 1; http.createServer(handleRequest).listen(port, () => { console.log(` Mock image server listening on: http://localhost:${port}/?d=2000&id=99`); console.log(` Possible querystrings:`); console.log(` id: the text to go in the svg image, defaults to a random number`); console.log(` d: how many milliseconds it should take to respond, defaults to 1000`); console.log(` w: image width, defaults to 80`); console.log(` h: image height, defaults to 80`); console.log(` c: image color, defaults to yellow`); }); }); function karmaTest(watch: boolean, done: Function) { const karma = require('karma'); const argv = require('yargs').argv; let karmaConfig = { configFile: join(SCRIPTS_ROOT, 'karma/karma.conf.js'), singleRun: true, }; if (watch) { (karmaConfig as any).singleRun = false; } if (argv.testGrep) { (karmaConfig).client = { args: ['--grep', argv.testGrep] }; } if (typeof argv.debug !== 'undefined') { karmaConfig.singleRun = false; } new karma.Server(karmaConfig, done).start(); } task('test.assembleVendorJs', () => { const files = NPM_VENDOR_FILES.map((root) => { const glob = join(root, '**/*.+(js|js.map)'); return src(join('node_modules', glob)) .pipe(dest(join(DIST_VENDOR_ROOT, root))); }); const gulpMerge = require('merge2'); return gulpMerge(files); }); /* creates a karma code coverage report */ function createKarmaCoverageReport(done: Function) { console.log('Generating Unit Test Coverage Report...'); let exec = require('child_process').exec; let command = `node_modules/.bin/remap-istanbul -i coverage/coverage-final.json -o coverage -t html`; exec(command, function(err: any, stdout: any, stderr: any) { console.log(`file://${PROJECT_ROOT}/coverage/index.html`); done(err); }); }