Running Mocha Tests with SailsJS and Superagent

I am currently writing an application using SailsJS. What has been done so far works as expected with manual testing, but is not verified with Mocha.

I tried to follow the SailsJS testing guide by invoking the test using npm:

[...] "scripts": { "start": "node app.js", "debug": "node debug app.js", "test": "mocha test/bootstrap.test.js test/unit/**/*.test.js" }, [...] 

The structure of my test directory is as follows:

 test β”œβ”€β”€ bootstrap.test.js β”œβ”€β”€ mocha.opts └── unit └── controllers └── UserController.test.js 

boostrap.test.js:

 var Sails = require('sails'); var sails; before(function(done) { Sails.lift(function(err, server) { sails = server; if (err) return done(err); done(err, sails); }); }); after(function(done) { Sails.lower(done); }); 

UserController.test.js:

 var request = require('supertest'); describe('UsersController', function() { describe('#logout()', function() { it('should respond with a 401 status because nobody is logged in', function (done) { request(sails.hooks.http.app) .put('/user/logout') .expect(401, done) }); }); describe('#signup()', function() { it('should create and log in an user', function (done) { request(sails.hooks.http.app) .post('/user') .send({ firstname: 'foo', name: 'bar', email: ' foo@bar.com ', sex: true, password: 'foobar', birthdate: '01/01/1991', phoneNumber: '+33 3 10 10 10' }) .expect(200, done) }); }); describe('#logout()', function() { it('should log out an user', function (done) { request(sails.hooks.http.app) .put('/user/logout') .expect(200, done) }); }); describe('#login()', function() { it('should respond with a 404 status because credentials are invalid', function (done) { request(sails.hooks.http.app) .put('/user/login') .send({ email: ' bar@foo.com ', password: 'barfoo' }) .expect(404, done) }); }); describe('#login()', function() { it('should log in an user', function (done) { request(sails.hooks.http.app) .put('/user/login') .send({ email: ' foo@bar.com ', password: 'foobar' }) .expect(200, done); }); }); describe('#login()', function() { it('should respond with a 401 status because user is already logged in', function (done) { request(sails.hooks.http.app) .put('/user/login') .send({ email: ' foo@bar.com ', password: 'foobar' }) .expect(401, done); }); }); }); 

Finally, here is my output when I call npm test:

 > sails@0.0.0 test /Users/fwoelffel/Dev/STOFMA > mocha test/bootstrap.test.js test/unit/**/*.test.js UsersController #logout() debug: false debug: req.session -> {"cookie":{"originalMaxAge":null,"expires":null,"httpOnly":true,"path":"/"}} info: Policy 'authenticated' disallowed to proceed to the next policy βœ“ should respond with a 401 status because nobody is logged in (86ms) #signup() debug: null === req.session.authenticated || undefined === req.session.authenticated -> true debug: req.session -> {"cookie":{"originalMaxAge":null,"expires":null,"httpOnly":true,"path":"/"}} info: Policy 'unauthenticated' allowed to proceed to the next policy info: User foo@bar.com signed up and logged in. βœ“ should create and log in an user (146ms) #logout() debug: false debug: req.session -> {"cookie":{"originalMaxAge":null,"expires":null,"httpOnly":true,"path":"/"}} info: Policy 'authenticated' disallowed to proceed to the next policy 1) should log out an user #login() debug: null === req.session.authenticated || undefined === req.session.authenticated -> true debug: req.session -> {"cookie":{"originalMaxAge":null,"expires":null,"httpOnly":true,"path":"/"}} info: Policy 'unauthenticated' allowed to proceed to the next policy info: No user matching bar@foo.com. βœ“ should respond with a 404 status because credentials are invalid (66ms) #login() debug: null === req.session.authenticated || undefined === req.session.authenticated -> true debug: req.session -> {"cookie":{"originalMaxAge":null,"expires":null,"httpOnly":true,"path":"/"}} info: Policy 'unauthenticated' allowed to proceed to the next policy info: Found user foo@bar.com. info: foo@bar.com credentials are valid. βœ“ should log in an user (128ms) #login() debug: null === req.session.authenticated || undefined === req.session.authenticated -> true debug: req.session -> {"cookie":{"originalMaxAge":null,"expires":null,"httpOnly":true,"path":"/"}} info: Policy 'unauthenticated' allowed to proceed to the next policy info: Found user foo@bar.com. info: foo@bar.com credentials are valid. 2) should respond with a 401 status because user is already logged in 4 passing (1s) 2 failing 1) UsersController #logout() should log out an user: Error: expected 200 "OK", got 401 "Unauthorized" at net.js:1419:10 2) UsersController #login() should respond with a 401 status because user is already logged in: Error: expected 401 "Unauthorized", got 200 "OK" at net.js:1419:10 npm ERR! Test failed. See above for more details. 

To summarize, I am testing the auth / unauth API. The following are the policies:

  • When a logon user tries to log in, the failed authentication policy should throw an error (401)
  • When a login user tries to register, the "unauthorized" policy should throw an error (401)
  • When a logged out user tries to log out, an error should be reported in the authentication policy (401)

I could do something wrong, but I really can’t understand what it is. Could you help solve this problem?

If you need more information, please ask. You can find the code (without tests as they fail) on Github .

Thanks for reading, have a good day!

UPDATE

Thanks to elsaar, I changed my code to:

 var request = require('supertest'); var agent; describe('UsersController', function() { before(function(done) { agent = request.agent(sails.hooks.http.app); done(); }) describe('#logout()', function() { it('should respond with a 401 status because nobody is logged in', function (done) { agent .put('/user/logout') .expect(401, done) }); }); describe('#signup()', function() { it('should create and log in an user', function (done) { agent .post('/user') .send({ firstname: 'foo', name: 'bar', email: ' foo@bar.com ', sex: true, password: 'foobar', birthdate: '01/01/1991', phoneNumber: '+33 3 10 10 10' }) .expect(200, done) }); }); describe('#logout()', function() { it('should log out an user', function (done) { agent .put('/user/logout') .expect(200, done) }); }); describe('#login()', function() { it('should respond with a 404 status because credentials are invalid', function (done) { agent .put('/user/login') .send({ email: ' bar@foo.com ', password: 'barfoo' }) .expect(404, done) }); }); describe('#login()', function() { it('should log in an user', function (done) { agent .put('/user/login') .send({ email: ' foo@bar.com ', password: 'foobar' }) .expect(200, done); }); }); describe('#login()', function() { it('should respond with a 401 status because user is already logged in', function (done) { agent .put('/user/login') .send({ email: ' foo@bar.com ', password: 'foobar' }) .expect(401, done); }); }); }); 
+7
unit-testing mocha superagent
source share
1 answer

I think that the session is not saved, so the user who logged in to the earlier request will not be registered in the later request. How should single tests be conducted. Thus, you will need to make sure that the user is in the desired advertised (logged in or out) before running the test.

EDIT . To continue the session, you need the same instance of a super-expert agent - https://github.com/visionmedia/supertest/issues/46#issuecomment-58534736

So, just do it at the beginning of your tests and use the same agent in all tests

 var supertest = require('supertest'); agent = supertest.agent(sails.hooks.http.app); // the use the agent to test your endpoints 
+5
source share

All Articles