scott scott - 4 months ago 32
Javascript Question

sails.socket testing with npm test

I'm using sails.js v0.11.0 and I am just getting into unit testing. I can test normal controllers through http requests, but I have no idea where to start to test the same calls over a socket requests. If you have a good resource or a sample test using sockets that would be fantastic.

var assert = require('assert');
var request = require('supertest');

describe('Auth Controller', function () {

describe('#callback()', function () {

it ('passport-local authentication should succeed if email and password valid', function (done) {

request(sails.hooks.http.app)
.post('/auth/local')
.send({
identifier: 'existing.user@email.com',
password: 'admin1234'
})
.expect(200)
.end(function(err) {
done(err);
});

});

it ('passport-local authentication should fail and return error code if email is invalid', function (done) {

request(sails.hooks.http.app)
.post('/auth/local')
.send({
identifier: 'invalid@email.com',
password: 'admin1234'
})
.expect(403)
.end(function(err) {
done(err);
});

});

it ('passport-local authentication should fail and return error code if password is invalid', function (done) {

request(sails.hooks.http.app)
.post('/auth/local')
.send({
identifier: 'existing.user@email.com',
password: 'invalid1235'
})
.expect(403)
.end(function(err) {
done(err);
});

});

//Test with Web Sockets from sails.io
describe('sails.socket', function () {

describe('With default settings', function() {

describe('once connected, socket', function () {

it ('passport-local authentication via web socket should succeed if email and password valid', function (done) {

//Socket version?
request(sails.hooks.http.app)
.post('/auth/local')
.send({
identifier: 'existing.user@email.com',
password: 'admin1234'
})
.expect(200)
.end(function(err) {
done(err);
});

});

it ('passport-local authentication via web socket should fail and return error code if email is invalid', function (done) {

//Socket version?
request(sails.hooks.http.app)
.post('/auth/local')
.send({
identifier: 'invalid@email.com',
password: 'admin1234'
})
.expect(403)
.end(function(err) {
done(err);
});

});

it ('passport-local authentication via web socket should fail and return error code if password is invalid', function (done) {

//Socket version?
request(sails.hooks.http.app)
.post('/auth/local')
.send({
identifier: 'existing.user@email.com',
password: 'invalid1235'
})
.expect(403)
.end(function(err) {
done(err);
});

});

});

});
});

});

});

Answer

I can't claim credit for this, but incase you've stumbled upon this question and are looking for the answer here it is.

Declare io as a global in the bootstrap:

// test/boostrap.test.js

var client = require('../assets/js/dependencies/sails.io.js');

global.io = new client(require('socket.io-client'));
io.sails.url = 'http://localhost:1337/';

Then call them use them like so.

//test/callbacks.test.js
describe('socket request', function () {

 it ('passport-local authentication should succeed if email and password valid', function (done) {

  io.socket.post('/auth/local', { identifier: 'existing.user@email.com', password: 'admin1234' }, function (data, jwres) {
  assert.equal(jwres.statusCode, 200);
  done();  
 });
});