|
@@ -4,6 +4,7 @@ should = chai.should()
|
|
|
expect = chai.expect
|
|
expect = chai.expect
|
|
|
modulePath = "../../../../app/js/Features/User/UserSessionsManager.js"
|
|
modulePath = "../../../../app/js/Features/User/UserSessionsManager.js"
|
|
|
SandboxedModule = require('sandboxed-module')
|
|
SandboxedModule = require('sandboxed-module')
|
|
|
|
|
+Async = require('async')
|
|
|
|
|
|
|
|
describe 'UserSessionsManager', ->
|
|
describe 'UserSessionsManager', ->
|
|
|
|
|
|
|
@@ -45,6 +46,7 @@ describe 'UserSessionsManager', ->
|
|
|
"logger-sharelatex": @logger
|
|
"logger-sharelatex": @logger
|
|
|
"settings-sharelatex": @settings
|
|
"settings-sharelatex": @settings
|
|
|
'./UserSessionsRedis': @redis
|
|
'./UserSessionsRedis': @redis
|
|
|
|
|
+ 'async': Async
|
|
|
|
|
|
|
|
describe '_sessionSetKey', ->
|
|
describe '_sessionSetKey', ->
|
|
|
|
|
|
|
@@ -247,14 +249,14 @@ describe 'UserSessionsManager', ->
|
|
|
@_checkSessions.callCount.should.equal 0
|
|
@_checkSessions.callCount.should.equal 0
|
|
|
done()
|
|
done()
|
|
|
|
|
|
|
|
- ##
|
|
|
|
|
describe 'revokeAllUserSessions', ->
|
|
describe 'revokeAllUserSessions', ->
|
|
|
|
|
|
|
|
beforeEach ->
|
|
beforeEach ->
|
|
|
@sessionKeys = ['sess:one', 'sess:two']
|
|
@sessionKeys = ['sess:one', 'sess:two']
|
|
|
@retain = []
|
|
@retain = []
|
|
|
@rclient.smembers.callsArgWith(1, null, @sessionKeys)
|
|
@rclient.smembers.callsArgWith(1, null, @sessionKeys)
|
|
|
- @rclient.exec.callsArgWith(0, null)
|
|
|
|
|
|
|
+ @rclient.del = sinon.stub().callsArgWith(1, null)
|
|
|
|
|
+ @rclient.srem = sinon.stub().callsArgWith(2, null)
|
|
|
@call = (callback) =>
|
|
@call = (callback) =>
|
|
|
@UserSessionsManager.revokeAllUserSessions @user, @retain, callback
|
|
@UserSessionsManager.revokeAllUserSessions @user, @retain, callback
|
|
|
|
|
|
|
@@ -267,15 +269,14 @@ describe 'UserSessionsManager', ->
|
|
|
it 'should call the appropriate redis methods', (done) ->
|
|
it 'should call the appropriate redis methods', (done) ->
|
|
|
@call (err) =>
|
|
@call (err) =>
|
|
|
@rclient.smembers.callCount.should.equal 1
|
|
@rclient.smembers.callCount.should.equal 1
|
|
|
- @rclient.multi.callCount.should.equal 1
|
|
|
|
|
|
|
|
|
|
- @rclient.del.callCount.should.equal 1
|
|
|
|
|
- expect(@rclient.del.firstCall.args[0]).to.deep.equal @sessionKeys
|
|
|
|
|
|
|
+ @rclient.del.callCount.should.equal 2
|
|
|
|
|
+ expect(@rclient.del.firstCall.args[0]).to.deep.equal @sessionKeys[0]
|
|
|
|
|
+ expect(@rclient.del.secondCall.args[0]).to.deep.equal @sessionKeys[1]
|
|
|
|
|
|
|
|
@rclient.srem.callCount.should.equal 1
|
|
@rclient.srem.callCount.should.equal 1
|
|
|
expect(@rclient.srem.firstCall.args[1]).to.deep.equal @sessionKeys
|
|
expect(@rclient.srem.firstCall.args[1]).to.deep.equal @sessionKeys
|
|
|
|
|
|
|
|
- @rclient.exec.callCount.should.equal 1
|
|
|
|
|
done()
|
|
done()
|
|
|
|
|
|
|
|
describe 'when a session is retained', ->
|
|
describe 'when a session is retained', ->
|
|
@@ -284,7 +285,7 @@ describe 'UserSessionsManager', ->
|
|
|
@sessionKeys = ['sess:one', 'sess:two', 'sess:three', 'sess:four']
|
|
@sessionKeys = ['sess:one', 'sess:two', 'sess:three', 'sess:four']
|
|
|
@retain = ['two']
|
|
@retain = ['two']
|
|
|
@rclient.smembers.callsArgWith(1, null, @sessionKeys)
|
|
@rclient.smembers.callsArgWith(1, null, @sessionKeys)
|
|
|
- @rclient.exec.callsArgWith(0, null)
|
|
|
|
|
|
|
+ @rclient.del = sinon.stub().callsArgWith(1, null)
|
|
|
@call = (callback) =>
|
|
@call = (callback) =>
|
|
|
@UserSessionsManager.revokeAllUserSessions @user, @retain, callback
|
|
@UserSessionsManager.revokeAllUserSessions @user, @retain, callback
|
|
|
|
|
|
|
@@ -297,28 +298,33 @@ describe 'UserSessionsManager', ->
|
|
|
it 'should call the appropriate redis methods', (done) ->
|
|
it 'should call the appropriate redis methods', (done) ->
|
|
|
@call (err) =>
|
|
@call (err) =>
|
|
|
@rclient.smembers.callCount.should.equal 1
|
|
@rclient.smembers.callCount.should.equal 1
|
|
|
- @rclient.multi.callCount.should.equal 1
|
|
|
|
|
- @rclient.del.callCount.should.equal 1
|
|
|
|
|
|
|
+ @rclient.del.callCount.should.equal @sessionKeys.length - 1
|
|
|
@rclient.srem.callCount.should.equal 1
|
|
@rclient.srem.callCount.should.equal 1
|
|
|
- @rclient.exec.callCount.should.equal 1
|
|
|
|
|
done()
|
|
done()
|
|
|
|
|
|
|
|
it 'should remove all sessions except for the retained one', (done) ->
|
|
it 'should remove all sessions except for the retained one', (done) ->
|
|
|
@call (err) =>
|
|
@call (err) =>
|
|
|
- expect(@rclient.del.firstCall.args[0]).to.deep.equal(['sess:one', 'sess:three', 'sess:four'])
|
|
|
|
|
|
|
+ expect(@rclient.del.firstCall.args[0]).to.deep.equal('sess:one')
|
|
|
|
|
+ expect(@rclient.del.secondCall.args[0]).to.deep.equal('sess:three')
|
|
|
|
|
+ expect(@rclient.del.thirdCall.args[0]).to.deep.equal('sess:four')
|
|
|
expect(@rclient.srem.firstCall.args[1]).to.deep.equal(['sess:one', 'sess:three', 'sess:four'])
|
|
expect(@rclient.srem.firstCall.args[1]).to.deep.equal(['sess:one', 'sess:three', 'sess:four'])
|
|
|
done()
|
|
done()
|
|
|
|
|
|
|
|
describe 'when rclient produces an error', ->
|
|
describe 'when rclient produces an error', ->
|
|
|
|
|
|
|
|
beforeEach ->
|
|
beforeEach ->
|
|
|
- @rclient.exec.callsArgWith(0, new Error('woops'))
|
|
|
|
|
|
|
+ @rclient.del = sinon.stub().callsArgWith(1, new Error('woops'))
|
|
|
|
|
|
|
|
it 'should produce an error', (done) ->
|
|
it 'should produce an error', (done) ->
|
|
|
@call (err) =>
|
|
@call (err) =>
|
|
|
expect(err).to.be.instanceof Error
|
|
expect(err).to.be.instanceof Error
|
|
|
done()
|
|
done()
|
|
|
|
|
|
|
|
|
|
+ it 'should not call rclient.srem', (done) ->
|
|
|
|
|
+ @call (err) =>
|
|
|
|
|
+ @rclient.srem.callCount.should.equal 0
|
|
|
|
|
+ done()
|
|
|
|
|
+
|
|
|
describe 'when no user is supplied', ->
|
|
describe 'when no user is supplied', ->
|
|
|
|
|
|
|
|
beforeEach ->
|
|
beforeEach ->
|
|
@@ -334,10 +340,8 @@ describe 'UserSessionsManager', ->
|
|
|
it 'should not call the appropriate redis methods', (done) ->
|
|
it 'should not call the appropriate redis methods', (done) ->
|
|
|
@call (err) =>
|
|
@call (err) =>
|
|
|
@rclient.smembers.callCount.should.equal 0
|
|
@rclient.smembers.callCount.should.equal 0
|
|
|
- @rclient.multi.callCount.should.equal 0
|
|
|
|
|
@rclient.del.callCount.should.equal 0
|
|
@rclient.del.callCount.should.equal 0
|
|
|
@rclient.srem.callCount.should.equal 0
|
|
@rclient.srem.callCount.should.equal 0
|
|
|
- @rclient.exec.callCount.should.equal 0
|
|
|
|
|
done()
|
|
done()
|
|
|
|
|
|
|
|
describe 'when there are no keys to delete', ->
|
|
describe 'when there are no keys to delete', ->
|
|
@@ -354,10 +358,8 @@ describe 'UserSessionsManager', ->
|
|
|
it 'should not do the delete operation', (done) ->
|
|
it 'should not do the delete operation', (done) ->
|
|
|
@call (err) =>
|
|
@call (err) =>
|
|
|
@rclient.smembers.callCount.should.equal 1
|
|
@rclient.smembers.callCount.should.equal 1
|
|
|
- @rclient.multi.callCount.should.equal 0
|
|
|
|
|
@rclient.del.callCount.should.equal 0
|
|
@rclient.del.callCount.should.equal 0
|
|
|
@rclient.srem.callCount.should.equal 0
|
|
@rclient.srem.callCount.should.equal 0
|
|
|
- @rclient.exec.callCount.should.equal 0
|
|
|
|
|
done()
|
|
done()
|
|
|
|
|
|
|
|
describe 'touch', ->
|
|
describe 'touch', ->
|
|
@@ -415,7 +417,10 @@ describe 'UserSessionsManager', ->
|
|
|
]
|
|
]
|
|
|
@exclude = ['two']
|
|
@exclude = ['two']
|
|
|
@rclient.smembers.callsArgWith(1, null, @sessionKeys)
|
|
@rclient.smembers.callsArgWith(1, null, @sessionKeys)
|
|
|
- @rclient.mget.callsArgWith(1, null, @sessions)
|
|
|
|
|
|
|
+ @rclient.get = sinon.stub()
|
|
|
|
|
+ @rclient.get.onCall(0).callsArgWith(1, null, @sessions[0])
|
|
|
|
|
+ @rclient.get.onCall(1).callsArgWith(1, null, @sessions[1])
|
|
|
|
|
+
|
|
|
@call = (callback) =>
|
|
@call = (callback) =>
|
|
|
@UserSessionsManager.getAllUserSessions @user, @exclude, callback
|
|
@UserSessionsManager.getAllUserSessions @user, @exclude, callback
|
|
|
|
|
|
|
@@ -437,9 +442,9 @@ describe 'UserSessionsManager', ->
|
|
|
@rclient.smembers.callCount.should.equal 1
|
|
@rclient.smembers.callCount.should.equal 1
|
|
|
done()
|
|
done()
|
|
|
|
|
|
|
|
- it 'should have called rclient.mget', (done) ->
|
|
|
|
|
|
|
+ it 'should have called rclient.get', (done) ->
|
|
|
@call (err, sessions) =>
|
|
@call (err, sessions) =>
|
|
|
- @rclient.mget.callCount.should.equal 1
|
|
|
|
|
|
|
+ @rclient.get.callCount.should.equal @sessionKeys.length - 1
|
|
|
done()
|
|
done()
|
|
|
|
|
|
|
|
describe 'when there are no other sessions', ->
|
|
describe 'when there are no other sessions', ->
|
|
@@ -484,10 +489,10 @@ describe 'UserSessionsManager', ->
|
|
|
@rclient.mget.callCount.should.equal 0
|
|
@rclient.mget.callCount.should.equal 0
|
|
|
done()
|
|
done()
|
|
|
|
|
|
|
|
- describe 'when mget produces an error', ->
|
|
|
|
|
|
|
+ describe 'when get produces an error', ->
|
|
|
|
|
|
|
|
beforeEach ->
|
|
beforeEach ->
|
|
|
- @rclient.mget.callsArgWith(1, new Error('woops'))
|
|
|
|
|
|
|
+ @rclient.get = sinon.stub().callsArgWith(1, new Error('woops'))
|
|
|
|
|
|
|
|
it 'should produce an error', (done) ->
|
|
it 'should produce an error', (done) ->
|
|
|
@call (err, sessions) =>
|
|
@call (err, sessions) =>
|