ember-cli-ajh
Version:
Command line tool for developing ambitious ember.js apps
224 lines (197 loc) • 7.08 kB
JavaScript
;
var expect = require('chai').expect;
var LiveReloadServer = require('../../../../lib/tasks/server/livereload-server');
var MockUI = require('../../../helpers/mock-ui');
var MockExpressServer = require('../../../helpers/mock-express-server');
var net = require('net');
var EOL = require('os').EOL;
var path = require('path');
var MockWatcher = require('../../../helpers/mock-watcher');
describe('livereload-server', function() {
var subject;
var ui;
var watcher;
var expressServer;
beforeEach(function() {
ui = new MockUI();
watcher = new MockWatcher();
expressServer = new MockExpressServer();
subject = new LiveReloadServer({
ui: ui,
watcher: watcher,
expressServer: expressServer,
analytics: { trackError: function() { } },
project: {
liveReloadFilterPatterns: [],
root: '/home/user/my-project'
}
});
});
afterEach(function() {
try {
if (subject._liveReloadServer) {
subject._liveReloadServer.close();
}
} catch (err) { }
});
describe('start', function() {
it('does not start the server if `liveReload` option is not true', function() {
return subject.start({
liveReloadPort: 1337,
liveReload: false,
}).then(function(output) {
expect(output).to.equal('Livereload server manually disabled.');
expect(!!subject._liveReloadServer).to.equal(false);
});
});
it('correctly indicates which port livereload is present on', function() {
return subject.start({
liveReloadPort: 1337,
liveReloadHost: 'localhost',
liveReload: true
}).then(function() {
expect(ui.output).to.equal('Livereload server on http://localhost:1337' + EOL);
});
});
it('informs of error during startup', function(done) {
var preexistingServer = net.createServer();
preexistingServer.listen(1337);
return subject.start({
liveReloadPort: 1337,
liveReload: true
})
.catch(function(reason) {
expect(reason).to.equal('Livereload failed on http://localhost:1337. It is either in use or you do not have permission.' + EOL);
})
.finally(function() {
preexistingServer.close(done);
});
});
it('starts with custom host', function() {
return subject.start({
liveReloadHost: '127.0.0.1',
liveReloadPort: 1337,
liveReload: true
}).then(function() {
expect(ui.output).to.equal('Livereload server on http://127.0.0.1:1337' + EOL);
});
});
});
describe('start with https', function() {
it('correctly indicates which port livereload is present on and running in https mode', function() {
return subject.start({
liveReloadPort: 1337,
liveReloadHost: 'localhost',
liveReload: true,
ssl: true,
sslKey: 'tests/fixtures/ssl/server.key',
sslCert: 'tests/fixtures/ssl/server.crt'
}).then(function() {
expect(ui.output).to.equal('Livereload server on https://localhost:1337' + EOL);
});
});
it('informs of error during startup', function(done) {
var preexistingServer = net.createServer();
preexistingServer.listen(1337);
return subject.start({
liveReloadPort: 1337,
liveReload: true,
ssl: true,
sslKey: 'tests/fixtures/ssl/server.key',
sslCert: 'tests/fixtures/ssl/server.crt'
})
.catch(function(reason) {
expect(reason).to.equal('Livereload failed on https://localhost:1337. It is either in use or you do not have permission.' + EOL);
})
.finally(function() {
preexistingServer.close(done);
});
});
});
describe('express server restart', function() {
it('triggers when the express server restarts', function() {
var calls = 0;
subject.didRestart = function () {
calls++;
};
return subject.start({
liveReloadPort: 1337,
liveReload: true
}).then(function () {
expressServer.emit('restart');
expect(calls).to.equal(1);
});
});
});
describe('livereload changes', function () {
var liveReloadServer;
var changedCount;
var oldChanged;
var stubbedChanged = function() {
changedCount += 1;
};
var trackCount;
var oldTrack;
var stubbedTrack = function() {
trackCount += 1;
};
beforeEach(function() {
liveReloadServer = subject.liveReloadServer();
changedCount = 0;
oldChanged = liveReloadServer.changed;
liveReloadServer.changed = stubbedChanged;
trackCount = 0;
oldTrack = subject.analytics.track;
subject.analytics.track = stubbedTrack;
});
afterEach(function() {
liveReloadServer.changed = oldChanged;
subject.analytics.track = oldTrack;
subject.project.liveReloadFilterPatterns = [];
});
describe('watcher events', function () {
function watcherEventTest(eventName, expectedCount) {
subject.project.liveReloadFilterPatterns = [];
return subject.start({
liveReloadPort: 1337,
liveReload: true,
}).then(function () {
watcher.emit(eventName, {
filePath: '/home/user/my-project/test/fixtures/proxy/file-a.js'
});
}).finally(function () {
expect(changedCount).to.equal(expectedCount);
});
}
it('triggers a livereload change on a watcher change event', function () {
return watcherEventTest('change', 1);
});
it('triggers a livereload change on a watcher error event', function () {
return watcherEventTest('error', 1);
});
it('does not trigger a livereload change on other watcher events', function () {
return watcherEventTest('not-an-event', 0);
});
});
describe('filter pattern', function() {
it('triggers the livereload server of a change when no pattern matches', function() {
subject.didChange({filePath: ''});
expect(changedCount).to.equal(1);
expect(trackCount).to.equal(1);
});
it('does not trigger livereload server of a change when there is a pattern match', function() {
// normalize test regex for windows
// path.normalize with change forward slashes to back slashes if test is running on windows
// we then replace backslashes with double backslahes to escape the backslash in the regex
var basePath = path.normalize('test/fixtures/proxy').replace(/\\/g, '\\\\');
var filter = new RegExp('^' + basePath);
subject.project.liveReloadFilterPatterns = [filter];
subject.didChange({
filePath: '/home/user/my-project/test/fixtures/proxy/file-a.js'
});
expect(changedCount).to.equal(0);
expect(trackCount).to.equal(0);
});
});
});
});