SudoModeHandlerTests.coffee 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. SandboxedModule = require('sandboxed-module')
  2. assert = require('assert')
  3. require('chai').should()
  4. expect = require('chai').expect
  5. sinon = require('sinon')
  6. modulePath = require('path').join __dirname, '../../../../app/js/Features/SudoMode/SudoModeHandler'
  7. describe 'SudoModeHandler', ->
  8. beforeEach ->
  9. @userId = 'some_user_id'
  10. @email = 'someuser@example.com'
  11. @user =
  12. _id: @userId
  13. email: @email
  14. @rclient = {get: sinon.stub(), set: sinon.stub(), del: sinon.stub()}
  15. @RedisWrapper =
  16. client: () => @rclient
  17. @SudoModeHandler = SandboxedModule.require modulePath, requires:
  18. '../../infrastructure/RedisWrapper': @RedisWrapper
  19. 'logger-sharelatex': @logger = {log: sinon.stub(), err: sinon.stub()}
  20. '../Authentication/AuthenticationManager': @AuthenticationManager = {}
  21. 'settings-sharelatex': @Settings = {}
  22. '../V1/V1Handler': @V1Handler = {authWithV1: sinon.stub()}
  23. '../User/UserGetter': @UserGetter = {getUser: sinon.stub()}
  24. describe '_buildKey', ->
  25. it 'should build a properly formed key', ->
  26. expect(@SudoModeHandler._buildKey('123')).to.equal 'SudoMode:{123}'
  27. describe 'activateSudoMode', ->
  28. beforeEach ->
  29. @call = (cb) =>
  30. @SudoModeHandler.activateSudoMode @userId, cb
  31. describe 'when all goes well', ->
  32. beforeEach ->
  33. @rclient.set = sinon.stub().callsArgWith(4, null)
  34. it 'should not produce an error', (done) ->
  35. @call (err) =>
  36. expect(err).to.equal null
  37. done()
  38. it 'should set a value in redis', (done) ->
  39. @call (err) =>
  40. expect(@rclient.set.callCount).to.equal 1
  41. expect(@rclient.set.calledWith(
  42. 'SudoMode:{some_user_id}', '1', 'EX', 60*60
  43. )).to.equal true
  44. done()
  45. describe 'when user id is not supplied', ->
  46. beforeEach ->
  47. @call = (cb) =>
  48. @SudoModeHandler.activateSudoMode null, cb
  49. it 'should produce an error', (done) ->
  50. @call (err) =>
  51. expect(err).to.not.equal null
  52. expect(err).to.be.instanceof Error
  53. done()
  54. it 'should not set value in redis', (done) ->
  55. @call (err) =>
  56. expect(@rclient.set.callCount).to.equal 0
  57. done()
  58. describe 'when rclient.set produces an error', ->
  59. beforeEach ->
  60. @rclient.set = sinon.stub().callsArgWith(4, new Error('woops'))
  61. it 'should produce an error', (done) ->
  62. @call (err) =>
  63. expect(err).to.not.equal null
  64. expect(err).to.be.instanceof Error
  65. done()
  66. describe 'clearSudoMode', ->
  67. beforeEach ->
  68. @rclient.del = sinon.stub().callsArgWith(1, null)
  69. @call = (cb) =>
  70. @SudoModeHandler.clearSudoMode @userId, cb
  71. it 'should not produce an error', (done) ->
  72. @call (err) =>
  73. expect(err).to.equal null
  74. done()
  75. it 'should delete key from redis', (done) ->
  76. @call (err) =>
  77. expect(@rclient.del.callCount).to.equal 1
  78. expect(@rclient.del.calledWith(
  79. 'SudoMode:{some_user_id}'
  80. )).to.equal true
  81. done()
  82. describe 'when rclient.del produces an error', ->
  83. beforeEach ->
  84. @rclient.del = sinon.stub().callsArgWith(1, new Error('woops'))
  85. it 'should produce an error', (done) ->
  86. @call (err) =>
  87. expect(err).to.not.equal null
  88. expect(err).to.be.instanceof Error
  89. done()
  90. describe 'when user id is not supplied', ->
  91. beforeEach ->
  92. @call = (cb) =>
  93. @SudoModeHandler.clearSudoMode null, cb
  94. it 'should produce an error', (done) ->
  95. @call (err) =>
  96. expect(err).to.not.equal null
  97. expect(err).to.be.instanceof Error
  98. done()
  99. it 'should not delete value in redis', (done) ->
  100. @call (err) =>
  101. expect(@rclient.del.callCount).to.equal 0
  102. done()
  103. describe 'authenticate', ->
  104. beforeEach ->
  105. @AuthenticationManager.authenticate = sinon.stub().callsArgWith(2, null, @user)
  106. it 'should call AuthenticationManager.authenticate', (done) ->
  107. @SudoModeHandler.authenticate @email, 'password', (err, user) =>
  108. expect(err).to.not.exist
  109. expect(user).to.exist
  110. expect(user).to.deep.equal @user
  111. expect(@AuthenticationManager.authenticate.callCount).to.equal 1
  112. done()
  113. describe 'isSudoModeActive', ->
  114. beforeEach ->
  115. @call = (cb) =>
  116. @SudoModeHandler.isSudoModeActive @userId, cb
  117. describe 'when sudo-mode is active for that user', ->
  118. beforeEach ->
  119. @rclient.get = sinon.stub().callsArgWith(1, null, '1')
  120. it 'should not produce an error', (done) ->
  121. @call (err, isActive) =>
  122. expect(err).to.equal null
  123. done()
  124. it 'should get the value from redis', (done) ->
  125. @call (err, isActive) =>
  126. expect(@rclient.get.callCount).to.equal 1
  127. expect(@rclient.get.calledWith('SudoMode:{some_user_id}')).to.equal true
  128. done()
  129. it 'should produce a true result', (done) ->
  130. @call (err, isActive) =>
  131. expect(isActive).to.equal true
  132. done()
  133. describe 'when sudo-mode is not active for that user', ->
  134. beforeEach ->
  135. @rclient.get = sinon.stub().callsArgWith(1, null, null)
  136. it 'should not produce an error', (done) ->
  137. @call (err, isActive) =>
  138. expect(err).to.equal null
  139. done()
  140. it 'should get the value from redis', (done) ->
  141. @call (err, isActive) =>
  142. expect(@rclient.get.callCount).to.equal 1
  143. expect(@rclient.get.calledWith('SudoMode:{some_user_id}')).to.equal true
  144. done()
  145. it 'should produce a false result', (done) ->
  146. @call (err, isActive) =>
  147. expect(isActive).to.equal false
  148. done()
  149. describe 'when rclient.get produces an error', ->
  150. beforeEach ->
  151. @rclient.get = sinon.stub().callsArgWith(1, new Error('woops'))
  152. it 'should produce an error', (done) ->
  153. @call (err, isActive) =>
  154. expect(err).to.not.equal null
  155. expect(err).to.be.instanceof Error
  156. expect(isActive).to.be.oneOf [null, undefined]
  157. done()
  158. describe 'when user id is not supplied', ->
  159. beforeEach ->
  160. @call = (cb) =>
  161. @SudoModeHandler.isSudoModeActive null, cb
  162. it 'should produce an error', (done) ->
  163. @call (err) =>
  164. expect(err).to.not.equal null
  165. expect(err).to.be.instanceof Error
  166. done()
  167. it 'should not get value in redis', (done) ->
  168. @call (err) =>
  169. expect(@rclient.get.callCount).to.equal 0
  170. done()