I can't seem to get the following integration test to pass in an express project using mocha, supertest, and should (and coffeescript).
The test
should = require('should')
request = require('supertest')
app = require('../../app')
describe 'authentication', ->
describe 'POST /sessions', ->
describe 'success', (done) ->
it 'displays a flash', (done) ->
request(app)
.post('/sessions')
.type('form')
.field('user', 'username')
.field('password', 'password')
.end (err, res) ->
res.text.should.include('logged in')
done()
Relevant application code
app.post '/sessions', (req, res) ->
req.flash 'info', "You are now logged in as #{req.body.user}"
res.redirect '/login'
Failure
1) authentication POST /sessions success displays a flash:
AssertionError: expected 'Moved Temporarily. Redirecting to //127.0.0.1:3456/login' to include 'logged in'
Obviously, the application code doesn't do anything useful. I'm just trying to get the test to pass.
Putting the expectation (res.text.should.include('logged in')
) outside the end function and inside the expect
function yields the same results. I've also tried a variation of the function calls, for example removing the .type('form')
call, and using .send(user: 'username', password: 'password')
instead of the two .field()
calls.
If it means anything, sending a curl POST request to the the app when it's running locally yields the same output (Moved Temporarily. Redirecting to //127.0.0.1:3456/login
)
I have a feeling this is a trivial error. Possibly something I'm forgetting in the application code or the test code.
Any suggestions?
EDIT 1: It's also worth noting that when clicking the submit button in the browser I get the expected results (a flash message).
EDIT 2: Further investigation shows the output of any redirect results in the Moved Temporarily. Redirecting to ...
response body. This makes me wonder if there is a problem in the way I'm exporting the app in app.js.
var express = require('express')
var app = express();
module.exports = app;
There is built-in assertion for this in supertest
:
should = require('should')
request = require('supertest')
app = require('../../app')
describe 'authentication', ->
describe 'POST /sessions', ->
describe 'success', ->
it 'redirects to the right path', (done) ->
request(app)
.post('/sessions')
.send(user: 'username', password: 'password')
.expect(302)
.expect('Location', '/home')
.end(done)