Support Node.js 0.10–6 (#132)

* Update dependencies

* Switch from jsdom to cheerio

* Update the supported Node.js versions

* Recompile the client-side CSS and JS
This commit is contained in:
Rowan Manning
2016-05-26 15:33:58 +01:00
committed by Andrew Mee
parent 6bfb4f72d9
commit ae6208d87e
18 changed files with 177 additions and 183 deletions

View File

@@ -3,16 +3,11 @@
language: node_js
matrix:
include:
# Run tests in Node.js 0.10 (unsupported)
- node_js: '0.10'
# Run tests in Node.js 0.12
- node_js: '0.12'
# Allow Node.js 0.10 to fail it's unsupported
allow_failures:
- node_js: '0.10'
- node_js: '4'
- node_js: '5'
- node_js: '6'
# Build only master (and pull-requests)
branches:

View File

@@ -138,6 +138,6 @@ Copyright © 20132016, Springer Nature
[info-node]: package.json
[info-build]: https://travis-ci.org/pa11y/pa11y-dashboard
[shield-license]: https://img.shields.io/badge/license-GPL%203.0-blue.svg
[shield-node]: https://img.shields.io/badge/node.js%20support-0.10-brightgreen.svg
[shield-node]: https://img.shields.io/badge/node.js%20support-0.106-brightgreen.svg
[shield-version]: https://img.shields.io/badge/version-1.11.0-blue.svg
[shield-build]: https://img.shields.io/travis/pa11y/pa11y-dashboard/master.svg

27
app.js
View File

@@ -15,6 +15,8 @@
'use strict';
var bodyParser = require('body-parser');
var compression = require('compression');
var createClient = require('pa11y-webservice-client-node');
var EventEmitter = require('events').EventEmitter;
var express = require('express');
@@ -40,7 +42,7 @@ function initApp(config, callback) {
app.webservice = createClient(webserviceUrl);
// Compression
app.express.use(express.compress());
app.express.use(compression());
// Public files
app.express.use(express.static(__dirname + '/public', {
@@ -49,26 +51,28 @@ function initApp(config, callback) {
// General express config
app.express.disable('x-powered-by');
app.express.use(express.bodyParser());
app.express.use(bodyParser.urlencoded({
extended: true
}));
// View engine
app.express.set('views', __dirname + '/view');
app.express.engine('html', hbs.express3({
app.express.engine('html', hbs.express4({
extname: '.html',
contentHelperName: 'content',
layoutsDir: __dirname + '/view/layout',
partialsDir: __dirname + '/view/partial',
defaultLayout: __dirname + '/view/layout/default'
}));
app.express.set('views', __dirname + '/view');
app.express.set('view engine', 'html');
// View helpers
require('./view/helper/date')(hbs.registerHelper);
require('./view/helper/string')(hbs.registerHelper);
require('./view/helper/url')(hbs.registerHelper);
require('./view/helper/date')(hbs);
require('./view/helper/string')(hbs);
require('./view/helper/url')(hbs);
// Populate view locals
app.express.locals({
app.express.locals = {
lang: 'en',
year: (new Date()).getFullYear(),
version: pkg.version,
@@ -76,12 +80,13 @@ function initApp(config, callback) {
bugtracker: pkg.bugs,
noindex: config.noindex,
readonly: config.readonly,
siteMessage: config.siteMessage
});
siteMessage: config.siteMessage,
settings: {}
};
app.express.use(function(req, res, next) {
res.locals.isHomePage = (req.path === '/');
res.locals.host = req.host;
res.locals.host = req.hostname;
next();
});

View File

@@ -21,24 +21,26 @@
"node": ">=0.10"
},
"dependencies": {
"chalk": "~0.2",
"express": "~3.4",
"express-hbs": "~0.2",
"moment": "~2.2",
"pa11y-webservice": "~1.10",
"pa11y-webservice-client-node": "~1.1",
"underscore": "~1.5"
"body-parser": "~1.15",
"chalk": "~1.1",
"compression": "~1.6",
"express": "~4.13",
"express-hbs": "~1.0",
"moment": "~2.13",
"pa11y-webservice": "~1.11",
"pa11y-webservice-client-node": "~1.2",
"underscore": "~1.8"
},
"devDependencies": {
"bower": "~1.2",
"bower": "~1.7",
"cheerio": "~0.20",
"jscs": "^2",
"jsdom": "^3",
"jshint": "^2",
"less": "~1.5",
"less": "~2.7",
"mocha": "^2",
"proclaim": "^3",
"request": "~2.27",
"uglify-js": "~2.4"
"request": "^2",
"uglify-js": "~2.6"
},
"scripts": {

File diff suppressed because one or more lines are too long

12
public/js/site.min.js vendored

File diff suppressed because one or more lines are too long

View File

@@ -15,7 +15,7 @@
'use strict';
var jsdom = require('jsdom');
var cheerio = require('cheerio');
var request = require('request');
module.exports = createNavigator;
@@ -29,13 +29,12 @@ function createNavigator(baseUrl, store) {
store.request = null;
store.response = null;
store.status = null;
store.window = null;
request({
url: baseUrl + opts.endpoint,
method: opts.method || 'GET',
body: opts.body,
json: true,
form: opts.form,
json: opts.json || false,
qs: opts.query,
followAllRedirects: true
}, function(err, res, body) {
@@ -46,19 +45,11 @@ function createNavigator(baseUrl, store) {
store.status = res.statusCode;
if (opts.nonDom) {
store.window = null;
store.dom = null;
callback();
} else {
jsdom.env(
store.body,
function(err, window) {
store.window = window;
store.dom = window.document;
callback();
}
);
store.dom = cheerio.load(store.body);
}
callback();
});

View File

@@ -17,7 +17,7 @@
var assert = require('proclaim');
describe('GET /', function() {
describe.only('GET /', function() {
beforeEach(function(done) {
var req = {
@@ -32,61 +32,61 @@ describe('GET /', function() {
});
it('should display an "Add new URL" button', function() {
var elem = this.last.dom.querySelectorAll('[data-test=add-task]');
var elem = this.last.dom('[data-test=add-task]');
assert.strictEqual(elem.length, 1);
assert.strictEqual(elem[0].getAttribute('href'), '/new');
assert.strictEqual(elem.eq(0).attr('href'), '/new');
});
it('should display all of the expected tasks', function() {
var tasks = this.last.dom.querySelectorAll('[data-test=task]');
var tasks = this.last.dom('[data-test=task]');
assert.strictEqual(tasks.length, 3);
assert.match(tasks[0].textContent, /npg home\s+\(wcag2aa\)/i);
assert.match(tasks[1].textContent, /npg home\s+\(wcag2aaa\)/i);
assert.match(tasks[2].textContent, /nature news\s+\(section508\)/i);
assert.match(tasks.eq(0).text(), /npg home\s+\(wcag2aa\)/i);
assert.match(tasks.eq(1).text(), /npg home\s+\(wcag2aaa\)/i);
assert.match(tasks.eq(2).text(), /nature news\s+\(section508\)/i);
});
it('should have links to each task', function() {
var tasks = this.last.dom.querySelectorAll('[data-test=task]');
assert.strictEqual(tasks[0].querySelectorAll('[href="/abc000000000000000000001"]').length, 1);
assert.strictEqual(tasks[1].querySelectorAll('[href="/abc000000000000000000002"]').length, 1);
assert.strictEqual(tasks[2].querySelectorAll('[href="/abc000000000000000000003"]').length, 1);
var tasks = this.last.dom('[data-test=task]');
assert.strictEqual(tasks.eq(0).find('[href="/abc000000000000000000001"]').length, 1);
assert.strictEqual(tasks.eq(1).find('[href="/abc000000000000000000002"]').length, 1);
assert.strictEqual(tasks.eq(2).find('[href="/abc000000000000000000003"]').length, 1);
});
it('should display an "Edit" button for each task', function() {
var tasks = this.last.dom.querySelectorAll('[data-test=task]');
assert.strictEqual(tasks[0].querySelectorAll('[href="/abc000000000000000000001/edit"]').length, 1);
assert.strictEqual(tasks[1].querySelectorAll('[href="/abc000000000000000000002/edit"]').length, 1);
assert.strictEqual(tasks[2].querySelectorAll('[href="/abc000000000000000000003/edit"]').length, 1);
var tasks = this.last.dom('[data-test=task]');
assert.strictEqual(tasks.eq(0).find('[href="/abc000000000000000000001/edit"]').length, 1);
assert.strictEqual(tasks.eq(1).find('[href="/abc000000000000000000002/edit"]').length, 1);
assert.strictEqual(tasks.eq(2).find('[href="/abc000000000000000000003/edit"]').length, 1);
});
it('should display a "Delete" button for each task', function() {
var tasks = this.last.dom.querySelectorAll('[data-test=task]');
assert.strictEqual(tasks[0].querySelectorAll('[href="/abc000000000000000000001/delete"]').length, 1);
assert.strictEqual(tasks[1].querySelectorAll('[href="/abc000000000000000000002/delete"]').length, 1);
assert.strictEqual(tasks[2].querySelectorAll('[href="/abc000000000000000000003/delete"]').length, 1);
var tasks = this.last.dom('[data-test=task]');
assert.strictEqual(tasks.eq(0).find('[href="/abc000000000000000000001/delete"]').length, 1);
assert.strictEqual(tasks.eq(1).find('[href="/abc000000000000000000002/delete"]').length, 1);
assert.strictEqual(tasks.eq(2).find('[href="/abc000000000000000000003/delete"]').length, 1);
});
it('should display a "Run" button for each task', function() {
var tasks = this.last.dom.querySelectorAll('[data-test=task]');
assert.strictEqual(tasks[0].querySelectorAll('[href="/abc000000000000000000001/run"]').length, 1);
assert.strictEqual(tasks[1].querySelectorAll('[href="/abc000000000000000000002/run"]').length, 1);
assert.strictEqual(tasks[2].querySelectorAll('[href="/abc000000000000000000003/run"]').length, 1);
var tasks = this.last.dom('[data-test=task]');
assert.strictEqual(tasks.eq(0).find('[href="/abc000000000000000000001/run"]').length, 1);
assert.strictEqual(tasks.eq(1).find('[href="/abc000000000000000000002/run"]').length, 1);
assert.strictEqual(tasks.eq(2).find('[href="/abc000000000000000000003/run"]').length, 1);
});
it('should display the task result counts if the task has been run', function() {
var tasks = this.last.dom.querySelectorAll('[data-test=task]');
assert.match(tasks[0].textContent, /1\s*errors/i);
assert.match(tasks[0].textContent, /2\s*warnings/i);
assert.match(tasks[0].textContent, /3\s*notices/i);
var tasks = this.last.dom('[data-test=task]');
assert.match(tasks.eq(0).text(), /1\s*errors/i);
assert.match(tasks.eq(0).text(), /2\s*warnings/i);
assert.match(tasks.eq(0).text(), /3\s*notices/i);
});
it('should display a message indicating that there are no results if the task has not been run', function() {
var tasks = this.last.dom.querySelectorAll('[data-test=task]');
assert.match(tasks[2].textContent, /no results/i);
var tasks = this.last.dom('[data-test=task]');
assert.match(tasks.eq(2).text(), /no results/i);
});
it('should not display an alert message', function() {
assert.strictEqual(this.last.dom.querySelectorAll('[data-test=alert]').length, 0);
assert.strictEqual(this.last.dom('[data-test=alert]').length, 0);
});
});

View File

@@ -32,65 +32,65 @@ describe('GET /new', function() {
});
it('should not display an error message', function() {
assert.strictEqual(this.last.dom.querySelectorAll('[data-test=error]').length, 0);
assert.strictEqual(this.last.dom('[data-test=error]').length, 0);
});
it('should have an "Add new URL" form', function() {
var form = this.last.dom.querySelectorAll('[data-test=new-url-form]')[0];
var form = this.last.dom('[data-test=new-url-form]').eq(0);
assert.isDefined(form);
assert.strictEqual(form.getAttribute('action'), '/new');
assert.strictEqual(form.getAttribute('method'), 'post');
assert.strictEqual(form.attr('action'), '/new');
assert.strictEqual(form.attr('method'), 'post');
});
describe('"Add New URL" form', function() {
beforeEach(function() {
this.form = this.last.dom.querySelectorAll('[data-test=new-url-form]')[0];
this.form = this.last.dom('[data-test=new-url-form]').eq(0);
});
it('should have a "name" field', function() {
var field = this.form.querySelectorAll('input[name=name]')[0];
var field = this.form.find('input[name=name]').eq(0);
assert.isDefined(field);
assert.strictEqual(field.getAttribute('type'), 'text');
assert.strictEqual(field.getAttribute('value'), '');
assert.strictEqual(field.attr('type'), 'text');
assert.strictEqual(field.attr('value'), '');
});
it('should have a "url" field', function() {
var field = this.form.querySelectorAll('input[name=url]')[0];
var field = this.form.find('input[name=url]').eq(0);
assert.isDefined(field);
assert.strictEqual(field.getAttribute('type'), 'url');
assert.strictEqual(field.getAttribute('value'), '');
assert.strictEqual(field.attr('type'), 'url');
assert.strictEqual(field.attr('value'), '');
});
it('should have a "wait" field', function() {
var field = this.form.querySelectorAll('input[name=wait]')[0];
var field = this.form.find('input[name=wait]').eq(0);
assert.isDefined(field);
assert.strictEqual(field.getAttribute('type'), 'text');
assert.strictEqual(field.getAttribute('value'), '');
assert.strictEqual(field.attr('type'), 'text');
assert.strictEqual(field.attr('value'), '');
});
it('should have a "username" field', function() {
var field = this.form.querySelectorAll('input[name=username]')[0];
var field = this.form.find('input[name=username]').eq(0);
assert.isDefined(field);
assert.strictEqual(field.getAttribute('type'), 'text');
assert.strictEqual(field.getAttribute('value'), '');
assert.strictEqual(field.attr('type'), 'text');
assert.strictEqual(field.attr('value'), '');
});
it('should have a "password" field', function() {
var field = this.form.querySelectorAll('input[name=password]')[0];
var field = this.form.find('input[name=password]').eq(0);
assert.isDefined(field);
assert.strictEqual(field.getAttribute('type'), 'text');
assert.strictEqual(field.getAttribute('value'), '');
assert.strictEqual(field.attr('type'), 'text');
assert.strictEqual(field.attr('value'), '');
});
it('should have a "standard" field', function() {
var field = this.form.querySelectorAll('select[name=standard]')[0];
var field = this.form.find('select[name=standard]').eq(0);
assert.isDefined(field);
assert.strictEqual(field.querySelectorAll('option').length, 4);
assert.strictEqual(field.find('option').length, 4);
});
it('should have "ignore" fields', function() {
var fields = this.form.querySelectorAll('input[name="ignore[]"]');
var fields = this.form.find('input[name="ignore[]"]');
assert.isDefined(fields);
assert.notStrictEqual(fields.length, 0);
});
@@ -107,7 +107,7 @@ describe('POST /new', function() {
var req = {
method: 'POST',
endpoint: '/new',
body: {
form: {
name: '',
url: ''
}
@@ -120,7 +120,7 @@ describe('POST /new', function() {
});
it('should display an error message', function() {
assert.strictEqual(this.last.dom.querySelectorAll('[data-test=error]').length, 1);
assert.strictEqual(this.last.dom('[data-test=error]').length, 1);
});
});
@@ -131,7 +131,7 @@ describe('POST /new', function() {
var req = {
method: 'POST',
endpoint: '/new',
body: {
form: {
name: 'Example',
url: 'http://example.com/',
standard: 'WCAG2AA'
@@ -156,11 +156,11 @@ describe('POST /new', function() {
});
it('should not display an error message', function() {
assert.strictEqual(this.last.dom.querySelectorAll('[data-test=error]').length, 0);
assert.strictEqual(this.last.dom('[data-test=error]').length, 0);
});
it('should display a success message', function() {
var alert = this.last.dom.querySelectorAll('[data-test=alert]')[0];
var alert = this.last.dom('[data-test=alert]').eq(0);
assert.isDefined(alert);
assert.match(alert.textContent, /url has been added/i);
});

View File

@@ -44,7 +44,8 @@ describe('GET /<task-id>/<result-id>.json', function() {
var req = {
method: 'GET',
endpoint: '/abc000000000000000000001/def000000000000000000001.json',
nonDom: true
nonDom: true,
json: true
};
this.navigate(req, done);
});

View File

@@ -32,37 +32,37 @@ describe('GET /<task-id>/<result-id>', function() {
});
it('should display a "Download CSV" button', function() {
var elem = this.last.dom.querySelectorAll('[data-test=download-csv]');
var elem = this.last.dom('[data-test=download-csv]');
assert.strictEqual(elem.length, 1);
assert.strictEqual(elem[0].getAttribute('href'), '/abc000000000000000000001/def000000000000000000001.csv');
assert.strictEqual(elem.eq(0).attr('href'), '/abc000000000000000000001/def000000000000000000001.csv');
});
it('should display a "Download JSON" button', function() {
var elem = this.last.dom.querySelectorAll('[data-test=download-json]');
var elem = this.last.dom('[data-test=download-json]');
assert.strictEqual(elem.length, 1);
assert.strictEqual(elem[0].getAttribute('href'), '/abc000000000000000000001/def000000000000000000001.json');
assert.strictEqual(elem.eq(0).attr('href'), '/abc000000000000000000001/def000000000000000000001.json');
});
it('should display a link back to the task', function() {
assert.isDefined(this.last.dom.querySelectorAll('[href="/abc000000000000000000001"]')[0]);
assert.isDefined(this.last.dom('[href="/abc000000000000000000001"]').eq(0));
});
it('should display errors', function() {
var elem = this.last.dom.querySelectorAll('[data-test=task-errors]')[0];
var elem = this.last.dom('[data-test=task-errors]').eq(0);
assert.isDefined(elem);
assert.match(elem.textContent, /errors \( 1 \)/i);
assert.match(elem.text(), /errors \( 1 \)/i);
});
it('should display warnings', function() {
var elem = this.last.dom.querySelectorAll('[data-test=task-warnings]')[0];
var elem = this.last.dom('[data-test=task-warnings]').eq(0);
assert.isDefined(elem);
assert.match(elem.textContent, /warnings \( 2 \)/i);
assert.match(elem.text(), /warnings \( 2 \)/i);
});
it('should display notices', function() {
var elem = this.last.dom.querySelectorAll('[data-test=task-notices]')[0];
var elem = this.last.dom('[data-test=task-notices]').eq(0);
assert.isDefined(elem);
assert.match(elem.textContent, /notices \( 3 \)/i);
assert.match(elem.text(), /notices \( 3 \)/i);
});
});

View File

@@ -32,14 +32,14 @@ describe('GET /<task-id>/delete', function() {
});
it('should have a "Delete URL" form', function() {
var form = this.last.dom.querySelectorAll('[data-test=delete-url-form]')[0];
var form = this.last.dom('[data-test=delete-url-form]').eq(0);
assert.isDefined(form);
assert.strictEqual(form.getAttribute('action'), '/abc000000000000000000001/delete');
assert.strictEqual(form.getAttribute('method'), 'post');
assert.strictEqual(form.attr('action'), '/abc000000000000000000001/delete');
assert.strictEqual(form.attr('method'), 'post');
});
it('should display a link back to the task page', function() {
assert.greaterThan(this.last.dom.querySelectorAll('[href="/abc000000000000000000001"]').length, 0);
assert.greaterThan(this.last.dom('[href="/abc000000000000000000001"]').length, 0);
});
});
@@ -70,9 +70,9 @@ describe('POST /<task-id>/delete', function() {
});
it('should display a success message', function() {
var alert = this.last.dom.querySelectorAll('[data-test=alert]')[0];
var alert = this.last.dom('[data-test=alert]').eq(0);
assert.isDefined(alert);
assert.match(alert.textContent, /been deleted/i);
assert.match(alert.text(), /been deleted/i);
});
});

View File

@@ -32,66 +32,66 @@ describe('GET /<task-id>/edit', function() {
});
it('should have an "Edit URL" form', function() {
var form = this.last.dom.querySelectorAll('[data-test=edit-url-form]')[0];
var form = this.last.dom('[data-test=edit-url-form]').eq(0);
assert.isDefined(form);
assert.strictEqual(form.getAttribute('action'), '/abc000000000000000000001/edit');
assert.strictEqual(form.getAttribute('method'), 'post');
assert.strictEqual(form.attr('action'), '/abc000000000000000000001/edit');
assert.strictEqual(form.attr('method'), 'post');
});
it('should display a link back to the task page', function() {
assert.greaterThan(this.last.dom.querySelectorAll('[href="/abc000000000000000000001"]').length, 0);
assert.greaterThan(this.last.dom('[href="/abc000000000000000000001"]').length, 0);
});
describe('"Edit URL" form', function() {
beforeEach(function() {
this.form = this.last.dom.querySelectorAll('[data-test=edit-url-form]')[0];
this.form = this.last.dom('[data-test=edit-url-form]').eq(0);
});
it('should have a "name" field', function() {
var field = this.form.querySelectorAll('input[name=name]')[0];
var field = this.form.find('input[name=name]').eq(0);
assert.isDefined(field);
assert.strictEqual(field.getAttribute('type'), 'text');
assert.strictEqual(field.getAttribute('value'), 'NPG Home');
assert.strictEqual(field.attr('type'), 'text');
assert.strictEqual(field.attr('value'), 'NPG Home');
});
it('should have a disabled "url" field', function() {
var field = this.form.querySelectorAll('input[name=url]')[0];
var field = this.form.find('input[name=url]').eq(0);
assert.isDefined(field);
assert.strictEqual(field.getAttribute('type'), 'url');
assert.strictEqual(field.getAttribute('value'), 'nature.com');
assert.isDefined(field.getAttribute('disabled'));
assert.strictEqual(field.attr('type'), 'url');
assert.strictEqual(field.attr('value'), 'nature.com');
assert.isDefined(field.attr('disabled'));
});
it('should have a "wait" field', function() {
var field = this.form.querySelectorAll('input[name=wait]')[0];
var field = this.form.find('input[name=wait]').eq(0);
assert.isDefined(field);
assert.strictEqual(field.getAttribute('type'), 'text');
assert.strictEqual(field.getAttribute('value'), '0');
assert.strictEqual(field.attr('type'), 'text');
assert.strictEqual(field.attr('value'), '0');
});
it('should have a disabled "standard" field', function() {
var field = this.form.querySelectorAll('select[name=standard]')[0];
var field = this.form.find('select[name=standard]').eq(0);
assert.isDefined(field);
assert.isDefined(field.getAttribute('disabled'));
assert.isDefined(field.attr('disabled'));
});
it('should have a "username" field', function() {
var field = this.form.querySelectorAll('input[name=username]')[0];
var field = this.form.find('input[name=username]').eq(0);
assert.isDefined(field);
assert.strictEqual(field.getAttribute('type'), 'text');
assert.strictEqual(field.getAttribute('value'), 'user');
assert.strictEqual(field.attr('type'), 'text');
assert.strictEqual(field.attr('value'), 'user');
});
it('should have a "password" field', function() {
var field = this.form.querySelectorAll('input[name=password]')[0];
var field = this.form.find('input[name=password]').eq(0);
assert.isDefined(field);
assert.strictEqual(field.getAttribute('type'), 'text');
assert.strictEqual(field.getAttribute('value'), 'access');
assert.strictEqual(field.attr('type'), 'text');
assert.strictEqual(field.attr('value'), 'access');
});
it('should have "ignore" fields', function() {
var fields = this.form.querySelectorAll('input[name="ignore[]"]');
var fields = this.form.find('input[name="ignore[]"]');
assert.isDefined(fields);
assert.notStrictEqual(fields.length, 0);
});
@@ -106,7 +106,7 @@ describe('POST /<task-id>/edit', function() {
var req = {
method: 'POST',
endpoint: '/abc000000000000000000001/edit',
body: {
form: {
name: 'foo',
username: 'newuser',
password: 'secure',
@@ -131,9 +131,9 @@ describe('POST /<task-id>/edit', function() {
});
it('should display a success message', function() {
var alert = this.last.dom.querySelectorAll('[data-test=alert]')[0];
var alert = this.last.dom('[data-test=alert]').eq(0);
assert.isDefined(alert);
assert.match(alert.textContent, /been saved/i);
assert.match(alert.text(), /been saved/i);
});
});

View File

@@ -34,46 +34,46 @@ describe('GET /<task-id>', function() {
});
it('should display an "Edit" button', function() {
assert.strictEqual(this.last.dom.querySelectorAll('[href="/abc000000000000000000001/edit"]').length, 1);
assert.strictEqual(this.last.dom('[href="/abc000000000000000000001/edit"]').length, 1);
});
it('should display a "Delete" button', function() {
assert.strictEqual(this.last.dom.querySelectorAll('[href="/abc000000000000000000001/delete"]').length, 1);
assert.strictEqual(this.last.dom('[href="/abc000000000000000000001/delete"]').length, 1);
});
it('should display a "Run" button', function() {
assert.strictEqual(this.last.dom.querySelectorAll('[href="/abc000000000000000000001/run"]').length, 1);
assert.strictEqual(this.last.dom('[href="/abc000000000000000000001/run"]').length, 1);
});
it('should display a "Download CSV" button for the latest result', function() {
assert.strictEqual(this.last.dom.querySelectorAll('[href="/abc000000000000000000001/def000000000000000000001.csv"]').length, 1);
assert.strictEqual(this.last.dom('[href="/abc000000000000000000001/def000000000000000000001.csv"]').length, 1);
});
it('should display a "Download JSON" button for the latest result', function() {
assert.strictEqual(this.last.dom.querySelectorAll('[href="/abc000000000000000000001/def000000000000000000001.json"]').length, 1);
assert.strictEqual(this.last.dom('[href="/abc000000000000000000001/def000000000000000000001.json"]').length, 1);
});
it('should display links to all results', function() {
assert.isDefined(this.last.dom.querySelectorAll('[href="/abc000000000000000000001/def000000000000000000001"]')[0]);
assert.isDefined(this.last.dom.querySelectorAll('[href="/abc000000000000000000001/def000000000000000000003"]')[0]);
assert.isDefined(this.last.dom('[href="/abc000000000000000000001/def000000000000000000001"]').eq(0));
assert.isDefined(this.last.dom('[href="/abc000000000000000000001/def000000000000000000003"]').eq(0));
});
it('should display errors', function() {
var elem = this.last.dom.querySelectorAll('[data-test=task-errors]')[0];
var elem = this.last.dom('[data-test=task-errors]').eq(0);
assert.isDefined(elem);
assert.match(elem.textContent, /errors \( 1 \)/i);
assert.match(elem.text(), /errors \( 1 \)/i);
});
it('should display warnings', function() {
var elem = this.last.dom.querySelectorAll('[data-test=task-warnings]')[0];
var elem = this.last.dom('[data-test=task-warnings]').eq(0);
assert.isDefined(elem);
assert.match(elem.textContent, /warnings \( 2 \)/i);
assert.match(elem.text(), /warnings \( 2 \)/i);
});
it('should display notices', function() {
var elem = this.last.dom.querySelectorAll('[data-test=task-notices]')[0];
var elem = this.last.dom('[data-test=task-notices]').eq(0);
assert.isDefined(elem);
assert.match(elem.textContent, /notices \( 3 \)/i);
assert.match(elem.text(), /notices \( 3 \)/i);
});
});
@@ -93,15 +93,15 @@ describe('GET /<task-id>', function() {
});
it('should display a "Run" button', function() {
var elem = this.last.dom.querySelectorAll('[data-test=run-task]');
var elem = this.last.dom('[data-test=run-task]');
assert.strictEqual(elem.length, 1);
assert.strictEqual(elem[0].getAttribute('href'), '/abc000000000000000000003/run');
assert.strictEqual(elem.eq(0).attr('href'), '/abc000000000000000000003/run');
});
it('should display a message indicating that there are no results', function() {
var alert = this.last.dom.querySelectorAll('[data-test=alert]')[0];
var alert = this.last.dom('[data-test=alert]').eq(0);
assert.isDefined(alert);
assert.match(alert.textContent, /there are no results to show/i);
assert.match(alert.text(), /there are no results to show/i);
});
});

View File

@@ -36,9 +36,9 @@ describe('GET /<task-id>/run', function() {
});
it('should display a success message', function() {
var alert = this.last.dom.querySelectorAll('[data-test=alert]')[0];
var alert = this.last.dom('[data-test=alert]').eq(0);
assert.isDefined(alert);
assert.match(alert.textContent, /new results are being generated/i);
assert.match(alert.text(), /new results are being generated/i);
});
});

View File

@@ -19,20 +19,20 @@ var moment = require('moment');
module.exports = helper;
function helper(register) {
function helper(hbs) {
// Format a date with Moment
register('date-format', function(context, block) {
hbs.registerHelper('date-format', function(context, block) {
var format = block.hash.format || 'YYYY-MM-DD HH:mm:ss';
return moment(context).format(format);
});
// Get a relative date
register('date-relative', function(context) {
hbs.registerHelper('date-relative', function(context) {
return moment(context).fromNow();
});
register('date-timestamp', function(context) {
hbs.registerHelper('date-timestamp', function(context) {
return moment(context).valueOf();
});

View File

@@ -2,10 +2,10 @@
module.exports = helper;
function helper(register) {
function helper(hbs) {
// Convert a string to lower-case
register('lowercase', function(context) {
hbs.registerHelper('lowercase', function(context) {
return context.toLowerCase();
});

View File

@@ -17,10 +17,10 @@
module.exports = helper;
function helper(register) {
function helper(hbs) {
// Simplify url by removing (eg http://, https://, trailing slashes) from url
register('simplify-url', function(context) {
hbs.registerHelper('simplify-url', function(context) {
return context.replace(/^https?:\/\//i, '').replace(/\/$/, '').toLowerCase();
});