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); }); }); });