so I am trying to test a route in my express app, and in order to do so I need to login a user
before making my call. I create and save a user
in the beforeEach
function. Here is the test I am writing:
it('should update username', function(done){
var _this = this;
req.post('/login')
.send(_this.data)
.then(function(res){
req.put('/users/' + res.body.user._id)
.send({ username: 'robert'})
.expect(200)
.end(function(err, res){
if(err) return done(err);
console.log(res.body);
res.body.success.should.equal(true);
res.body.user.username.should.match(/robert/);
done();
});
});
});
Here is the output I get when I run the test:
Users
Routes
Authenticated
POST /login 200 195.059 ms - 142
PUT /users/568a432e1daa24083fa6778a 401 2.785 ms - 21
1) should update username
Unauthenticated
GET /users 401 1.502 ms - 21
✓ should return 401
1 passing (516ms)
1 failing
1) Users Routes Authenticated should update username:
Error: expected 200 "OK", got 401 "Unauthorized"
at Test._assertStatus (node_modules/supertest/lib/test.js:232:12)
at Test._assertFunction (node_modules/supertest/lib/test.js:247:11)
at Test.assert (node_modules/supertest/lib/test.js:148:18)
at Server.assert (node_modules/supertest/lib/test.js:127:12)
at net.js:1273:10
I'm confused why it's responding in a 401
, when the POST /login
request responded with a 200
.
Using Postman
I am able to create a user
, login as that user, and with a PUT
request I am able to update the data successfuly. So, I am assuming this has something to do with the req
chaining of supertest
.
I have written the request chaining using both supertest-as-promised
as well as just supertest
.
As far as I understand the following code behaves the same as using the then()
syntax:
it('should update username', function(done){
var _this = this;
req.post('/login')
.send(_this.data)
.endfunction(err, res){
if(err) return done(err);
req.put('/users/' + res.body.user._id)
.send({ username: 'robert'})
.expect(200)
.end(function(err, res){
if(err) return done(err);
console.log(res.body);
res.body.success.should.equal(true);
res.body.user.username.should.match(/robert/);
done();
});
});
});
I'm confused by what is going on here. Like I said, I can do this using Postman
so I assume, this is a problem with how the request chaining is working. If you need more context I can provide more code if need be.