UNPKG

strider

Version:

Brilliant continuous deployment platform

106 lines 3.02 kB
// This file allows us to test views with mocked view data. // To test a view, add an entry to the `paths` variable. // The `fixture` string will be require()d relative to // `STRIDER_BASE/test/views/` // // The test fixture will be triggered when the appointed path is // requested with the querystring `?test`. const path = require('path'); const pathRegexp = require('path-to-regexp'); function matcher(path) { const params = []; const rx = pathRegexp(path, params); return function (pathname) { const match = rx.exec(pathname); const data = {}; if (!match) return false; for (let i = 0; i < params.length; i++) { data[params[i].name] = match[i + 1]; } return data; }; } const paths = [ { path: matcher('/:org/:repo/'), template: 'build.html', fixture: 'project' }, { path: matcher('/:org/:repo/job/:id'), template: 'build.html', fixture: 'project' }, { path: matcher('/:org/:repo/config'), template: 'project_config.html', fixture: 'config' }, { path: matcher('/'), template: 'index.html', fixture: 'dashboard' }, { path: matcher('/projects'), template: 'projects.html', fixture: 'projects' } ]; // spoof an api call function api(req, res, next) { // TODO parse the path and things console.log('Referrer! And things', req._parsedUrl.pathname); next(); } function handle(req, res, next) { const test = req.query.test; const pathname = req._parsedUrl.pathname; const referrer = req.get('referrer'); if ('undefined' === typeof test) { if (referrer && referrer.indexOf('?test') !== -1 && req.accepts('text, json') === 'json') { return api(req, res, next); } return next(); } let config; for (let i = 0; i < paths.length; i++) { var params = paths[i].path(pathname); if (params) { config = paths[i]; break; } } if (!config) { console.warn(`Looks like you're trying to test a route, but there's no config for '${req._parsedUrl.pathname}'.`); return next(); } const filename = path.join(__dirname, `../test/views/${config.fixture}`); if (require.cache[filename]) delete require.cache[filename]; let data; try { data = require(filename); } catch (e) { return res.send(`Failed to load fixture: ${e.message}`, e.stack); } function send(data) { res.render(config.template, data); } if ('function' === typeof data) { return data(test, params, req, function (err, data) { if (err) return res.send(`Failed to load data: ${err.message}`); send(data); }); } send(data); } module.exports = function (app) { app.use(handle); }; //# sourceMappingURL=views-test.js.map