251 lines
5.2 KiB
JavaScript
251 lines
5.2 KiB
JavaScript
|
'use strict';
|
||
|
|
||
|
var sinon = require('sinon');
|
||
|
var historyApiFallback = require('../lib');
|
||
|
|
||
|
var tests = module.exports = {};
|
||
|
|
||
|
var middleware;
|
||
|
var req = null;
|
||
|
var requestedUrl;
|
||
|
var next;
|
||
|
|
||
|
tests.setUp = function(done) {
|
||
|
middleware = historyApiFallback();
|
||
|
requestedUrl = '/foo';
|
||
|
req = {
|
||
|
method: 'GET',
|
||
|
url: requestedUrl,
|
||
|
headers: {
|
||
|
accept: 'text/html, */*'
|
||
|
}
|
||
|
};
|
||
|
next = sinon.stub();
|
||
|
|
||
|
done();
|
||
|
};
|
||
|
|
||
|
|
||
|
['POST', 'PUT', 'DELETE', 'HEAD', 'OPTIONS'].forEach(function(method) {
|
||
|
tests['should ignore ' + method + ' requests'] = function(test) {
|
||
|
req.method = method;
|
||
|
|
||
|
middleware(req, null, next);
|
||
|
|
||
|
test.equal(req.url, requestedUrl);
|
||
|
test.ok(next.called);
|
||
|
test.done();
|
||
|
};
|
||
|
});
|
||
|
|
||
|
|
||
|
tests['should ignore requests that do not accept html'] = function(test) {
|
||
|
req.headers.accept = 'application/json';
|
||
|
|
||
|
middleware(req, null, next);
|
||
|
|
||
|
test.equal(req.url, requestedUrl);
|
||
|
test.ok(next.called);
|
||
|
test.done();
|
||
|
};
|
||
|
|
||
|
|
||
|
tests['should ignore file requests'] = function(test) {
|
||
|
var expected = req.url = 'js/app.js';
|
||
|
|
||
|
middleware(req, null, next);
|
||
|
|
||
|
test.equal(req.url, expected);
|
||
|
test.ok(next.called);
|
||
|
test.done();
|
||
|
};
|
||
|
|
||
|
|
||
|
tests['should rewrite requests when the . rule is disabled'] = function(test) {
|
||
|
req.url = 'js/app.js';
|
||
|
middleware = historyApiFallback({
|
||
|
disableDotRule: true
|
||
|
});
|
||
|
middleware(req, null, next);
|
||
|
|
||
|
test.equal(req.url, '/index.html');
|
||
|
test.ok(next.called);
|
||
|
test.done();
|
||
|
};
|
||
|
|
||
|
|
||
|
tests['should take JSON preference into account'] = function(test) {
|
||
|
req.headers.accept = 'application/json, text/plain, */*';
|
||
|
|
||
|
middleware(req, null, next);
|
||
|
|
||
|
test.equal(req.url, requestedUrl);
|
||
|
test.ok(next.called);
|
||
|
test.done();
|
||
|
};
|
||
|
|
||
|
|
||
|
tests['should rewrite valid requests'] = function(test) {
|
||
|
middleware(req, null, next);
|
||
|
|
||
|
test.equal(req.url, '/index.html');
|
||
|
test.ok(next.called);
|
||
|
test.done();
|
||
|
};
|
||
|
|
||
|
tests['should not fail for missing HTTP accept header'] = function(test) {
|
||
|
delete req.headers.accept;
|
||
|
|
||
|
middleware(req, null, next);
|
||
|
|
||
|
test.equal(req.url, requestedUrl);
|
||
|
test.ok(next.called);
|
||
|
test.done();
|
||
|
};
|
||
|
|
||
|
tests['should not fail for missing headers object'] = function(test) {
|
||
|
delete req.headers;
|
||
|
|
||
|
middleware(req, null, next);
|
||
|
|
||
|
test.equal(req.url, requestedUrl);
|
||
|
test.ok(next.called);
|
||
|
test.done();
|
||
|
};
|
||
|
|
||
|
tests['should work in verbose mode'] = function(test) {
|
||
|
var expected = req.url = 'js/app.js';
|
||
|
middleware = historyApiFallback({
|
||
|
verbose: true
|
||
|
});
|
||
|
|
||
|
middleware(req, null, next);
|
||
|
|
||
|
test.equal(req.url, expected);
|
||
|
test.ok(next.called);
|
||
|
test.done();
|
||
|
};
|
||
|
|
||
|
tests['should work with a custom logger'] = function(test) {
|
||
|
var expected = req.url = 'js/app.js';
|
||
|
var logger = sinon.stub();
|
||
|
middleware = historyApiFallback({
|
||
|
logger: logger
|
||
|
});
|
||
|
|
||
|
middleware(req, null, next);
|
||
|
|
||
|
test.equal(req.url, expected);
|
||
|
test.ok(next.called);
|
||
|
test.ok(logger.calledOnce);
|
||
|
test.done();
|
||
|
};
|
||
|
|
||
|
tests['should rewrite requested path according to rules'] = function(test) {
|
||
|
req.url = '/soccer';
|
||
|
middleware = historyApiFallback({
|
||
|
rewrites: [
|
||
|
{from: /\/soccer/, to: '/soccer.html'}
|
||
|
]
|
||
|
});
|
||
|
|
||
|
middleware(req, null, next);
|
||
|
|
||
|
test.equal(req.url, '/soccer.html');
|
||
|
test.ok(next.called);
|
||
|
test.done();
|
||
|
};
|
||
|
|
||
|
tests['should support functions as rewrite rule'] = function(test) {
|
||
|
middleware = historyApiFallback({
|
||
|
rewrites: [
|
||
|
{
|
||
|
from: /^\/libs\/(.*)$/,
|
||
|
to: function(context) {
|
||
|
return './bower_components' + context.parsedUrl.pathname;
|
||
|
}
|
||
|
}
|
||
|
]
|
||
|
});
|
||
|
|
||
|
req.url = '/libs/jquery/jquery.1.12.0.min.js';
|
||
|
middleware(req, null, next);
|
||
|
test.equal(req.url, './bower_components/libs/jquery/jquery.1.12.0.min.js');
|
||
|
test.ok(next.called);
|
||
|
|
||
|
next = sinon.stub();
|
||
|
var expected = req.url = '/js/main.js';
|
||
|
middleware(req, null, next);
|
||
|
test.equal(req.url, expected);
|
||
|
test.ok(next.called);
|
||
|
|
||
|
test.done();
|
||
|
};
|
||
|
|
||
|
tests['should test rewrite rules'] = function(test) {
|
||
|
req.url = '/socer';
|
||
|
middleware = historyApiFallback({
|
||
|
rewrites: [
|
||
|
{from: /\/soccer/, to: '/soccer.html'}
|
||
|
]
|
||
|
});
|
||
|
|
||
|
middleware(req, null, next);
|
||
|
|
||
|
test.equal(req.url, '/index.html');
|
||
|
test.ok(next.called);
|
||
|
test.done();
|
||
|
};
|
||
|
|
||
|
tests['should support custom index file'] = function(test) {
|
||
|
var index = 'default.html';
|
||
|
req.url = '/socer';
|
||
|
middleware = historyApiFallback({
|
||
|
index: index
|
||
|
});
|
||
|
|
||
|
middleware(req, null, next);
|
||
|
|
||
|
test.equal(req.url, index);
|
||
|
test.ok(next.called);
|
||
|
test.done();
|
||
|
};
|
||
|
|
||
|
tests['should accept html requests based on headers option'] = function(test) {
|
||
|
req.headers.accept = '*/*';
|
||
|
middleware = historyApiFallback({
|
||
|
htmlAcceptHeaders: ['text/html', 'application/xhtml+xml']
|
||
|
});
|
||
|
|
||
|
middleware(req, null, next);
|
||
|
|
||
|
test.equal(req.url, requestedUrl);
|
||
|
test.ok(next.called);
|
||
|
test.done();
|
||
|
};
|
||
|
|
||
|
tests['should support custom rewrite rules'] = function(test) {
|
||
|
req.headers.accept = '*/*';
|
||
|
var url = '/app/login/app.js';
|
||
|
req.url = url;
|
||
|
middleware = historyApiFallback({
|
||
|
rewrites: [
|
||
|
{
|
||
|
from: /\/app\/login/,
|
||
|
to: function onMatch(ctx) {
|
||
|
if (ctx.parsedUrl.path.indexOf('.js')) {
|
||
|
return ctx.parsedUrl.href;
|
||
|
}
|
||
|
return '/app/login/index.html';
|
||
|
}
|
||
|
}
|
||
|
]
|
||
|
});
|
||
|
|
||
|
middleware(req, null, next);
|
||
|
|
||
|
test.equal(req.url, url);
|
||
|
test.ok(next.called);
|
||
|
test.done();
|
||
|
};
|