Skip to content

Commit

Permalink
Add tests
Browse files Browse the repository at this point in the history
  • Loading branch information
tommy351 committed Jan 7, 2015
1 parent 32c048b commit 47fc877
Show file tree
Hide file tree
Showing 8 changed files with 192 additions and 62 deletions.
16 changes: 8 additions & 8 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,6 @@ hexo.config.server = merge({
ip: '0.0.0.0'
}, hexo.config.server);

hexo.extend.filter.register('server_middleware', require('./lib/middlewares/logger'));
hexo.extend.filter.register('server_middleware', require('./lib/middlewares/header'));
hexo.extend.filter.register('server_middleware', require('./lib/middlewares/route'));
hexo.extend.filter.register('server_middleware', require('./lib/middlewares/static'));
hexo.extend.filter.register('server_middleware', require('./lib/middlewares/redirect'));
hexo.extend.filter.register('server_middleware', require('./lib/middlewares/gzip'));

hexo.extend.console.register('server', 'Start the server.', {
desc: 'Start the server and watch for file changes.',
options: [
Expand All @@ -21,4 +14,11 @@ hexo.extend.console.register('server', 'Start the server.', {
{name: '-s, --static', desc: 'Only serve static files.'},
{name: '-l, --log [format]', desc: 'Enable logger. Override the logger format.'}
]
}, require('./lib/server'));
}, require('./lib/server'));

hexo.extend.filter.register('server_middleware', require('./lib/middlewares/logger'));
hexo.extend.filter.register('server_middleware', require('./lib/middlewares/header'));
hexo.extend.filter.register('server_middleware', require('./lib/middlewares/route'));
hexo.extend.filter.register('server_middleware', require('./lib/middlewares/static'));
hexo.extend.filter.register('server_middleware', require('./lib/middlewares/redirect'));
hexo.extend.filter.register('server_middleware', require('./lib/middlewares/gzip'));
2 changes: 1 addition & 1 deletion lib/middlewares/logger.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ module.exports = function(app){
var args = this.env.args || {};
var logger = args.l || args.log || config.server.log;

if (!logger) return;
if (!logger && !args.debug) return;
if (typeof logger !== 'string') logger = 'dev';

app.use(morgan(logger));
Expand Down
6 changes: 3 additions & 3 deletions lib/middlewares/redirect.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
var util = require('../util');

module.exports = function(app){
var root = this.config.root;
if (root === '/') return;
Expand All @@ -8,6 +6,8 @@ module.exports = function(app){
app.use(function(req, res, next){
if (req.method !== 'GET' || req.url !== '/') return next();

util.redirect(res, root);
res.statusCode = 301;
res.setHeader('Location', root);
res.end('Redirecting');
});
};
21 changes: 15 additions & 6 deletions lib/middlewares/route.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
var pathFn = require('path');
var Readable = require('stream').Readable;
var util = require('../util');
var mime = require('mime');

module.exports = function(app){
var config = this.config;
Expand All @@ -16,14 +15,24 @@ module.exports = function(app){

var url = route.format(decodeURIComponent(req.url));
var data = route.get(url);
var extname = pathFn.extname(url);

// When the URL is `foo/index.html` but users access `foo`, redirect to `foo/`.
if (!target){
if (pathFn.extname(url)) return next();
if (!data){
if (extname) return next();

return util.redirect(res, root + url + '/');
res.statusCode = 302;
res.setHeader('Location', root + url + '/');
res.end('Redirecting');
return;
}

data.pipe(res).on('error', next);
res.setHeader('Content-Type', extname ? mime.lookup(extname) : 'application/octet-stream');

if (method === 'GET'){
data.pipe(res).on('error', next);
} else {
res.end();
}
});
};
42 changes: 26 additions & 16 deletions lib/server.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
var connect = require('connect');
var http = require('http');
var Promise = require('bluebird');
var http = require('http');
var chalk = require('chalk');

function server(args){
Expand All @@ -19,26 +19,36 @@ function server(args){
// Load middlewares
this.extend.filter.exec('server_middleware', app, {context: this}),
// Load source files
this.post.load({watch: true})
this.post.load({watch: !args.$test_mode})
]).then(function(){
var server = http.createServer(app).listen(port, ip, function(){
self.log.info('Hexo is running at ' + chalk.underline('http://%s:%d%s') + '. Press Ctrl+C to stop.', ip, port, root);
self.emit('server');
});
return startServer(http.createServer(app, port, ip));
}).then(function(server){
self.log.info('Hexo is running at ' + chalk.underline('http://%s:%d%s') + '. Press Ctrl+C to stop.', ip, port, root);
self.emit('server');

server.on('error', function(err){
switch (err.code){
case 'EADDRINUSE':
self.log.fatal('Port %d has been used. Try other port instead.', port);
break;
return server;
}, function(err){
switch (err.code){
case 'EADDRINUSE':
self.log.fatal('Port %d has been used. Try other port instead.', port);
break;

case 'EACCES':
self.log.fatal('Permission denied. You can\'t use port ' + port + '.');
break;
}
case 'EACCES':
self.log.fatal('Permission denied. You can\'t use port ' + port + '.');
break;
}

throw err;
throw err;
});
}

function startServer(server, port, ip){
return new Promise(function(resolve, reject){
server.listen(port, ip, function(){
resolve(server);
});

server.on('error', reject);
});
}

Expand Down
17 changes: 0 additions & 17 deletions lib/util.js

This file was deleted.

20 changes: 9 additions & 11 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,24 +12,19 @@
"engines": {
"node": ">= 0.10.0"
},
"repository": {
"type": "git",
"url": "git://github.com/hexojs/hexo-server.git"
},
"bugs": {
"url": "https://github.com/hexojs/hexo-server/issues"
},
"repository": "hexojs/hexo-server",
"homepage": "http://hexo.io/",
"keywords": [
"hexo",
"server"
"server",
"connect"
],
"author": "Tommy Chen <tommy351@gmail.com> (http://zespia.tw)",
"license": "MIT",
"dependencies": {
"bluebird": "^2.3.11",
"bluebird": "^2.6.1",
"chalk": "^0.5.1",
"compression": "^1.2.1",
"compression": "^1.3.0",
"connect": "3.x",
"mime": "^1.2.11",
"morgan": "^1.5.0",
Expand All @@ -44,8 +39,11 @@
"gulp-jshint": "^1.8.6",
"gulp-load-plugins": "^0.8.0",
"gulp-mocha": "^2.0.0",
"hexo": "^3.0.0-beta.1",
"hexo-fs": "0.0.8",
"jshint-stylish": "^1.0.0",
"mocha": "^2.0.1",
"rimraf": "^2.2.8"
"rimraf": "^2.2.8",
"supertest": "^0.15.0"
}
}
130 changes: 130 additions & 0 deletions test/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
var should = require('chai').should();
var Hexo = require('hexo');
var request = require('supertest');
var pathFn = require('path');
var fs = require('hexo-fs');
var Promise = require('bluebird');

describe('server', function(){
var hexo = new Hexo(pathFn.join(__dirname, 'server_test'), {silent: true});
var themeDir = pathFn.join(hexo.base_dir, 'themes', 'test');
var server = require('../lib/server');

// Default config
hexo.config.server = {
port: 4000,
log: false,
ip: '0.0.0.0'
};

// Register fake generator
hexo.extend.generator.register('test', function(){
return [
{path: '', data: 'index'},
{path: 'foo/', data: 'foo'},
{path: 'bar.jpg', data: 'bar'}
];
});

// Register middlewares
hexo.extend.filter.register('server_middleware', require('../lib/middlewares/logger'));
hexo.extend.filter.register('server_middleware', require('../lib/middlewares/header'));
hexo.extend.filter.register('server_middleware', require('../lib/middlewares/route'));
hexo.extend.filter.register('server_middleware', require('../lib/middlewares/static'));
hexo.extend.filter.register('server_middleware', require('../lib/middlewares/redirect'));
hexo.extend.filter.register('server_middleware', require('../lib/middlewares/gzip'));

before(function(){
return Promise.all([
fs.mkdirs(themeDir),
fs.writeFile(hexo.config_path, 'theme: test')
]).then(function(){
return hexo.init();
});
});

after(function(){
return fs.rmdir(hexo.base_dir);
});

function stopServer(app, callback){
return function(err){
if (err) return callback(err);
app.close(callback);
};
}

it('X-Powered-By header', function(done){
server.call(hexo, {$test_mode: true}).then(function(app){
request(app).get('/')
.expect('X-Powered-By', 'Hexo')
.expect(200, 'index', stopServer(app, done));
});
});

it('Content-Type header', function(done){
server.call(hexo, {$test_mode: true}).then(function(app){
request(app).get('/bar.jpg')
.expect('Content-Type', 'image/jpeg')
.end(stopServer(app, done));
});
});

it('static asset', function(done){
fs.writeFile(pathFn.join(hexo.public_dir, 'test.html'), 'test html').then(function(){
server.call(hexo, {$test_mode: true}).then(function(app){
request(app).get('/test.html')
.expect('Content-Type', 'text/html; charset=UTF-8')
.expect(200, 'test html', stopServer(app, done));
});
}, done);
});

it('invalid port', function(){
try {
server.call(hexo, {port: -100});
} catch (err){
err.should.have.property('message', 'Port number -100 is invalid. Try a number between 1 and 65535.');
}

try {
server.call(hexo, {port: 70000});
} catch (err){
err.should.have.property('message', 'Port number 70000 is invalid. Try a number between 1 and 65535.');
}
});

it('append trailing slash', function(done){
server.call(hexo, {$test_mode: true}).then(function(app){
request(app).get('/foo')
.expect('Location', '/foo/')
.expect(302, 'Redirecting', stopServer(app, done));
});
});

it('don\'t append trailing slash if URL has a extension name', function(done){
server.call(hexo, {$test_mode: true}).then(function(app){
request(app).get('/bar.txt')
.expect(404, stopServer(app, done));
});
});

it('only send headers on HEAD request', function(done){
server.call(hexo, {$test_mode: true}).then(function(app){
request(app).head('/')
.expect(200, '', stopServer(app, done));
});
});

it('redirect to root URL if root is not `/`', function(done){
hexo.config.root = '/test/';

server.call(hexo, {$test_mode: true}).then(function(app){
hexo.config.root = '/';

request(app).get('/')
.expect('Location', '/test/')
.expect(301, 'Redirecting', stopServer(app, done));
});
});
});

0 comments on commit 47fc877

Please sign in to comment.