quinn-controller
Version:
An almost simple controller system for quinn
88 lines (75 loc) • 2.38 kB
JavaScript
/*global before, after, describe, it */
;
var http = require('http');
var assert = require('assertive');
var express = require('express');
var Bluebird = require('bluebird');
var concat = require('concat-stream');
var respond = require('quinn-respond');
var controller = require('../express');
describe('quinn-controller/express', function() {
var action, server, baseUrl;
function load(urlPath) {
var url = baseUrl + urlPath;
return new Bluebird(function(resolve, reject) {
var req = http.get(url, function(res) {
res.setEncoding('utf8');
res.pipe(concat(function(body) {
res.body = body;
resolve(res);
}));
});
req.on('error', reject);
});
}
before(function(done) {
var app = express();
action = controller('test', {
index: function() { return 'idx'; },
echo: function(req, params) { return respond.json(params); },
fancy: function() {
return respond.json({ x: 52 }).status(409);
}
});
app.get('/', action('index'));
app.get('/fancy', action('fancy'));
app.get('/echo/:id', action('echo', {
params: function(req, params) {
return { query: req.query.q, echoId: params.id, xtra: 'opt' };
}
}));
server = http.createServer(app);
server.listen(0, function() {
baseUrl = 'http://127.0.0.1:' + this.address().port;
done();
});
});
after(function(done) {
if (server && server._handle) { server.close(done); }
else { done(); }
});
it('returns "idx" for index', function(done) {
load('/')
.then(function(res) {
assert.equal(200, res.statusCode);
assert.equal('idx', res.body);
})
.nodeify(done);
});
it('injects actionName/controllerName params', function(done) {
load('/echo/1997?q=rap')
.then(function(res) {
var result = JSON.parse(res.body);
assert.equal('test', result.controllerName);
assert.equal('echo', result.actionName);
assert.equal('rap', result.query);
assert.equal('opt', result.xtra);
assert.equal('1997', result.echoId);
})
.nodeify(done);
});
it('throws on unknown action', function() {
var err = assert.throws(action.bind(null, 'missing'));
assert.equal('Not a valid action: test.missing', err.message);
});
});