Skip to content

Commit

Permalink
Merge pull request #1712 from mixonic/tests-without-auto-or-history
Browse files Browse the repository at this point in the history
Move /tests handler into its own middleware
  • Loading branch information
bcardarella committed Sep 23, 2014
2 parents c477ea9 + 5de132c commit ee901ce
Show file tree
Hide file tree
Showing 8 changed files with 92 additions and 20 deletions.
1 change: 1 addition & 0 deletions lib/models/project.js
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,7 @@ Project.prototype.buildAddonPackages = function() {

var internalMiddlewarePath = path.join(this.root, path.relative(this.root, path.join(__dirname, '../tasks/server/middleware')));

this.addIfAddon(path.join(internalMiddlewarePath, 'tests-server'));
this.addIfAddon(path.join(internalMiddlewarePath, 'history-support'));
this.addIfAddon(path.join(internalMiddlewarePath, 'serve-files'));
this.addIfAddon(path.join(internalMiddlewarePath, 'proxy-server'));
Expand Down
13 changes: 4 additions & 9 deletions lib/tasks/server/middleware/history-support/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,25 +16,20 @@ HistorySupportAddon.prototype.serverMiddleware = function(config) {
var watcher = options.watcher;

var baseURL = cleanBaseURL(options.baseURL);
var testsRegexp = new RegExp('^' + baseURL + 'tests');
var baseURLRegexp = new RegExp('^' + baseURL);
var locationType = this.project.config(options.environment).locationType;

if (['auto', 'history'].indexOf(locationType) !== -1) {
app.use(function(req, res, next) {
watcher.then(function(results) {

var acceptHeaders = req.headers.accept || [];
var hasHTMLHeader = acceptHeaders.indexOf('text/html') !== -1;
var hasWildcardHeader = acceptHeaders.indexOf('*/*') !== -1;
var assetPath = req.path.slice(baseURL.length);
var isAsset = fs.existsSync(path.join(results.directory, assetPath));
var isForTests = testsRegexp.test(req.path);
var isForBaseURL = baseURLRegexp.test(req.path);

if (isForBaseURL && req.method === 'GET') {
if (isForTests && (hasHTMLHeader || hasWildcardHeader)) {
req.url = baseURL + 'tests/index.html';
} else if (!isAsset && hasHTMLHeader) {
if (hasHTMLHeader && isForBaseURL && req.method === 'GET') {
var assetPath = req.path.slice(baseURL.length);
if (!fs.existsSync(path.join(results.directory, assetPath))) {
req.url = baseURL + 'index.html';
}
}
Expand Down
5 changes: 4 additions & 1 deletion lib/tasks/server/middleware/serve-files/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,8 @@
"name": "serve-files-middleware",
"keywords": [
"ember-addon"
]
],
"ember-addon": {
"before": "proxy-server-middleware"
}
}
41 changes: 41 additions & 0 deletions lib/tasks/server/middleware/tests-server/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
'use strict';

var cleanBaseURL = require('../../../../utilities/clean-base-url');

function TestsServerAddon(project) {
this.project = project;
this.name = 'tests-server-middleware';
}

TestsServerAddon.prototype.serverMiddleware = function(config) {
var app = config.app;
var options = config.options;
var watcher = options.watcher;

var baseURL = cleanBaseURL(options.baseURL);
var testsRegexp = new RegExp('^' + baseURL + 'tests');
var baseURLRegexp = new RegExp('^' + baseURL);

app.use(function(req, res, next) {
watcher.then(function() {

var acceptHeaders = req.headers.accept || [];
var hasHTMLHeader = acceptHeaders.indexOf('text/html') !== -1;
var hasWildcardHeader = acceptHeaders.indexOf('*/*') !== -1;

var isForTests = testsRegexp.test(req.path);

if (isForTests && (hasHTMLHeader || hasWildcardHeader) && req.method === 'GET') {
if (baseURLRegexp.test(req.path)) {
req.url = baseURL + 'tests/index.html';
} else {
req.url = '/tests/index.html';
}
}

next();
});
});
};

module.exports = TestsServerAddon;
9 changes: 9 additions & 0 deletions lib/tasks/server/middleware/tests-server/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"name": "tests-server-middleware",
"keywords": [
"ember-addon"
],
"ember-addon": {
"before": "history-support-middleware"
}
}
4 changes: 2 additions & 2 deletions tests/unit/models/addon-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ describe('models/addon.js', function() {

describe('generated addon no-export', function() {
before(function() {
addon = project.addons[6];
addon = project.addons[7];
});

it('sets it\'s project', function() {
Expand Down Expand Up @@ -204,7 +204,7 @@ describe('models/addon.js', function() {

describe('generated addon with-export', function() {
before(function() {
addon = project.addons[5];
addon = project.addons[6];
});

it('sets it\'s project', function() {
Expand Down
15 changes: 8 additions & 7 deletions tests/unit/models/project-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,7 @@ describe('models/project.js', function() {

it('returns a listing of all ember-cli-addons', function() {
var expected = [
'tests-server-middleware',
'history-support-middleware', 'serve-files-middleware',
'proxy-server-middleware', 'ember-random-addon', 'ember-non-root-addon',
'ember-generated-with-export-addon', 'ember-generated-no-export-addon',
Expand All @@ -168,19 +169,19 @@ describe('models/project.js', function() {
it('returns an instance of the addon', function() {
var addons = project.addons;

assert.equal(addons[3].name, 'Ember Non Root Addon');
assert.equal(addons[4].name, 'Ember Non Root Addon');
});

it('addons get passed the project instance', function() {
var addons = project.addons;

assert.equal(addons[0].project, project);
assert.equal(addons[1].project, project);
});

it('returns an instance of an addon that uses `ember-addon-main`', function() {
var addons = project.addons;

assert.equal(addons[4].name, 'Ember Random Addon');
assert.equal(addons[5].name, 'Ember Random Addon');
});

it('returns the default blueprints path', function() {
Expand Down Expand Up @@ -215,15 +216,15 @@ describe('models/project.js', function() {
it('returns an instance of an addon with an object export', function() {
var addons = project.addons;

assert.ok(addons[5] instanceof Addon);
assert.equal(addons[5].name, 'Ember CLI Generated with export');
assert.ok(addons[6] instanceof Addon);
assert.equal(addons[6].name, 'Ember CLI Generated with export');
});

it('returns an instance of a generated addon with no export', function() {
var addons = project.addons;

assert.ok(addons[6] instanceof Addon);
assert.equal(addons[6].name, '(generated ember-generated-no-export-addon addon)');
assert.ok(addons[7] instanceof Addon);
assert.equal(addons[7].name, '(generated ember-generated-no-export-addon addon)');
});
});

Expand Down
24 changes: 23 additions & 1 deletion tests/unit/tasks/server/express-server-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -218,7 +218,29 @@ describe('express-server', function() {
});
});

it('serves index.html for mime of */* when file not found with auto/history location', function(done) {
it('GET /tests serves tests/index.html for mime of */* (hash location)', function(done) {
project._config = {
baseURL: '/',
locationType: 'hash'
};

return startServer()
.then(function() {
request(subject.app)
.get('/tests')
.set('accept', '*/*')
.expect(200)
.expect('Content-Type', /html/)
.end(function(err) {
if (err) {
return done(err);
}
done();
});
});
});

it('GET /tests serves tests/index.html for mime of */* (auto location)', function(done) {
return startServer()
.then(function() {
request(subject.app)
Expand Down

0 comments on commit ee901ce

Please sign in to comment.