var express = require('express'),
|
wrap = require('../index'),
|
should = require('should'),
|
request = require('supertest');
|
|
function asyncText(err, text, cb) {
|
setImmediate(function() {
|
cb(err, text);
|
});
|
}
|
|
function thunk(err, text) {
|
return function(cb) {
|
asyncText(err, text, cb);
|
};
|
}
|
|
describe('co-express', function() {
|
it('supports a single generator route', function(done) {
|
var app = express();
|
|
app.get('/', wrap(function* (req, res, next) {
|
res.send('it works!');
|
}));
|
|
request(app)
|
.get('/')
|
.end(function(err, res) {
|
should.not.exist(err);
|
res.text.should.equal('it works!');
|
done();
|
});
|
});
|
|
it('supports multiple generator routes', function(done) {
|
var app = express();
|
|
app.get('/', wrap(function* (req, res, next) {
|
req.val = yield thunk(null, 'thunk');
|
next();
|
}), wrap(function* (req, res, next) {
|
req.val += yield thunk(null, 'thunk');
|
next();
|
}), wrap(function* (req, res) {
|
res.send(req.val + 'func');
|
}));
|
|
request(app)
|
.get('/')
|
.end(function(err, res) {
|
should.not.exist(err);
|
res.text.should.equal('thunkthunkfunc');
|
done();
|
});
|
});
|
|
it('doesn\'t alter application object', function(done) {
|
var app = express();
|
|
app.get('/', wrap(function* (req, res, next) {
|
res.send('it works!');
|
}));
|
|
app.set('it', 'works!');
|
|
request(app)
|
.get('/')
|
.end(function(err, res) {
|
should.not.exist(err);
|
res.text.should.equal('it works!');
|
app.get('it').should.equal('works!');
|
done();
|
});
|
});
|
|
|
it('supports param', function(done) {
|
var app = express();
|
const map = {
|
33: 'user number 33'
|
};
|
app.param('id', wrap(function* (req, res, next, id) {
|
id.should.equal('33');
|
req.user = map[id];
|
next();
|
}));
|
app.get('/:id', wrap(function* (req, res, next) {
|
res.send(req.user);
|
}));
|
|
request(app)
|
.get('/33')
|
.end(function(err, res) {
|
should.not.exist(err);
|
res.text.should.equal('user number 33');
|
done();
|
});
|
});
|
|
it('supports param and catches errors thrown in generator', function(done) {
|
var app = express();
|
const map = {
|
33: 'user number 33'
|
};
|
app.param('id', wrap(function* (req, res, next, id) {
|
id.should.equal('33');
|
req.user = map[id];
|
throw new Error('param test error');
|
}));
|
app.get('/:id', wrap(function* (req, res, next) {
|
res.send(req.user);
|
}));
|
app.use(wrap(function* (err, req, res, next) {
|
err.message.should.equal('param test error');
|
if (err) {
|
res.status(500).send(err.message);
|
}
|
}));
|
|
request(app)
|
.get('/33')
|
.end(function(err, res) {
|
should.not.exist(err);
|
res.text.should.equal('param test error');
|
done();
|
});
|
});
|
|
it('supports param and catches errors called with next', function(done) {
|
var app = express();
|
const map = {
|
33: 'user number 33'
|
};
|
app.param('id', wrap(function* (req, res, next, id) {
|
id.should.equal('33');
|
req.user = map[id];
|
next(new Error('param test error'));
|
}));
|
app.get('/:id', wrap(function* (req, res, next) {
|
res.send(req.user);
|
}));
|
app.use(wrap(function* (err, req, res, next) {
|
err.message.should.equal('param test error');
|
if (err) {
|
res.status(500).send(err.message);
|
}
|
}));
|
|
request(app)
|
.get('/33')
|
.end(function(err, res) {
|
should.not.exist(err);
|
res.text.should.equal('param test error');
|
done();
|
});
|
});
|
|
it('passes uncaught exceptions', function(done) {
|
var app = express();
|
|
app.get('/', wrap(function* (req, res, next) {
|
var val = yield thunk(new Error('thunk error'));
|
res.send(val);
|
}));
|
|
app.use(function(err, req, res, next) {
|
if (err && err.message === 'thunk error') {
|
res.send('caught');
|
} else {
|
next(err);
|
}
|
});
|
|
request(app)
|
.get('/')
|
.end(function(err, res) {
|
should.not.exist(err);
|
res.text.should.equal('caught');
|
done();
|
});
|
});
|
|
it('supports error routes', function(done) {
|
var app = express();
|
|
app.get('/', wrap(function* (req, res, next) {
|
var val = yield thunk(new Error('thunk error'));
|
res.send(val);
|
}));
|
|
app.use(wrap(function* (err, req, res, next) {
|
if (err && err.message === 'thunk error') {
|
res.send('caught');
|
} else {
|
next(err);
|
}
|
}));
|
|
request(app)
|
.get('/')
|
.end(function(err, res) {
|
should.not.exist(err);
|
res.text.should.equal('caught');
|
done();
|
});
|
});
|
|
it('supports app.route()', function(done) {
|
var app = express();
|
|
var books = app.route('/books');
|
|
books.get(wrap(function* (req, res, next) {
|
req.val = yield thunk(null, 'thunk');
|
next();
|
}), wrap(function* (req, res, next) {
|
req.val += yield thunk(null, 'thunk');
|
next();
|
}), wrap(function* (req, res) {
|
res.send(req.val + 'func');
|
}));
|
|
|
request(app)
|
.get('/books')
|
.end(function(err, res) {
|
should.not.exist(err);
|
res.text.should.equal('thunkthunkfunc');
|
done();
|
});
|
});
|
});
|