sails
Version:
API-driven framework for building realtime apps, using MVC conventions (based on Express and Socket.io)
242 lines (203 loc) • 7.49 kB
JavaScript
var _ = require('@sailshq/lodash');
var request = require('@sailshq/request');
var Sails = require('../../lib').Sails;
var assert = require('assert');
var cookie = require('cookie');
var tmp = require('tmp');
var path = require('path');
var fs = require('fs-extra');
if (process.env.TEST_REDIS_SESSION) {
describe('middleware :: ', function() {
describe('session :: ', function() {
describe('with redis adapter ::', function() {
var curDir, tmpDir;
before(function() {
// Cache the current working directory.
curDir = process.cwd();
// Create a temp directory.
tmpDir = tmp.dirSync({gracefulCleanup: true, unsafeCleanup: true});
// Switch to the temp directory.
process.chdir(tmpDir.name);
// Ensure a symlink to the connect-redis adapter.
fs.ensureSymlinkSync(path.resolve(__dirname, '..', '..', 'node_modules', 'connect-redis'), path.resolve(tmpDir.name, 'node_modules', 'connect-redis'));
});
after(function() {
process.chdir(curDir);
});
it('should fail to lift if the Redis server can\'t be reached', function(done) {
var app = Sails();
app.lift({
globals: false,
environment: 'development',
log: {level: 'silent'},
session: {
secret: 'abc123',
adapter: 'connect-redis',
port: 6300
},
hooks: {grunt: false},
routes: {
'/test': function(req, res) {
var count = req.session.count || 1;
req.session.count = count + 1;
return res.send('Count is ' + count);
}
}
}, function(err) {
if (err && err.code === 'ECONNREFUSED') {
return done();
}
else if (err) {
return done(err);
}
else {
return done(new Error('Expected an error, but Sails appears to have lifted!'));
}
});
});
describe('http requests :: ', function() {
var sid;
// Lift two Sails instances connected to the same Redis server
var app1 = Sails();
var app2 = Sails();
before(function (done){
var liftOptions = {
globals: false,
environment: 'development',
log: {level: 'silent'},
session: {
secret: 'abc123',
pass: 'secret',
db: 3,
adapter: 'connect-redis',
port: 6380
},
hooks: {grunt: false},
routes: {
'/test': function(req, res) {
var count = req.session.count || 1;
req.session.count = count + 1;
return res.send('Count is ' + count);
}
}
};
app1.lift(_.extend({port: 1535}, _.cloneDeep(liftOptions)), function(err) {
if (err) {return done(err);}
app2.lift(_.extend({port: 1536}, _.cloneDeep(liftOptions)), function(err) {
if (err) {return done(err);}
return done();
});
});
});
it('a server responses should supply a cookie with a session ID', function(done) {
request(
{
method: 'GET',
uri: 'http://localhost:1535/test',
},
function(err, response, body) {
if (err) {return done(err);}
assert.equal(body, 'Count is 1');
assert(response.headers['set-cookie']);
var cookies = require('cookie').parse(response.headers['set-cookie'][0]);
assert(cookies['sails.sid']);
sid = cookies['sails.sid'];
return done();
}
);
});
it('a subsequent request to a different app sharing the same session store, with the same cookie, should retrieve the same session', function(done) {
request(
{
method: 'GET',
uri: 'http://localhost:1536/test',
headers: {
Cookie: 'sails.sid=' + sid
}
},
function(err, response, body) {
if (err) {return done(err);}
assert.equal(body, 'Count is 2');
return done();
}
);
});
after(function(done) {
return app1.lower(function(err) {if(err) {return done(err);} app2.lower(done);});
});
});
describe('virtual requests :: ', function() {
var sid;
// Lift two Sails instances connected to the same Redis server
var app1 = Sails();
var app2 = Sails();
before(function (done){
var liftOptions = {
globals: false,
environment: 'development',
log: {level: 'silent'},
session: {
secret: 'abc123',
adapter: 'connect-redis',
pass: 'secret',
db: 3,
port: 6380
},
hooks: {grunt: false},
routes: {
'/test': function(req, res) {
var count = req.session.count || 1;
req.session.count = count + 1;
return res.send('Count is ' + count);
}
}
};
app1.lift(_.extend({port: 1535}, _.cloneDeep(liftOptions)), function(err) {
if (err) {return done(err);}
app2.lift(_.extend({port: 1536}, _.cloneDeep(liftOptions)), function(err) {
if (err) {return done(err);}
return done();
});
});
});
it('a server responses should supply a cookie with a session ID', function(done) {
app1.request(
{
method: 'GET',
url: '/test',
},
function(err, response, body) {
if (err) {return done(err);}
assert.equal(body, 'Count is 1');
assert(response.headers['set-cookie']);
var cookies = require('cookie').parse(response.headers['set-cookie'][0]);
assert(cookies['sails.sid']);
sid = cookies['sails.sid'];
return done();
}
);
});
it('a subsequent request to a different app sharing the same session store, with the same cookie, should retrieve the same session', function(done) {
app2.request(
{
method: 'GET',
url: '/test',
headers: {
Cookie: 'sails.sid=' + sid
}
},
function(err, response, body) {
if (err) {return done(err);}
assert.equal(body, 'Count is 2');
return done();
}
);
});
after(function(done) {
return app1.lower(function(err) {if(err) {return done(err);} app2.lower(done);});
});
});
});
});
});
}