SudoModeHandlerTests.coffee 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  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. @rclient = {get: sinon.stub(), set: sinon.stub(), del: sinon.stub()}
  11. @RedisWrapper =
  12. client: () => @rclient
  13. @SudoModeHandler = SandboxedModule.require modulePath, requires:
  14. '../../infrastructure/RedisWrapper': @RedisWrapper
  15. 'logger-sharelatex': @logger = {log: sinon.stub(), err: sinon.stub()}
  16. describe '_buildKey', ->
  17. it 'should build a properly formed key', ->
  18. expect(@SudoModeHandler._buildKey('123')).to.equal 'SudoMode:{123}'
  19. describe 'activateSudoMode', ->
  20. beforeEach ->
  21. @call = (cb) =>
  22. @SudoModeHandler.activateSudoMode @userId, cb
  23. describe 'when all goes well', ->
  24. beforeEach ->
  25. @rclient.set = sinon.stub().callsArgWith(4, null)
  26. it 'should not produce an error', (done) ->
  27. @call (err) =>
  28. expect(err).to.equal null
  29. done()
  30. it 'should set a value in redis', (done) ->
  31. @call (err) =>
  32. expect(@rclient.set.callCount).to.equal 1
  33. expect(@rclient.set.calledWith(
  34. 'SudoMode:{some_user_id}', '1', 'EX', 60*60
  35. )).to.equal true
  36. done()
  37. describe 'when user id is not supplied', ->
  38. beforeEach ->
  39. @call = (cb) =>
  40. @SudoModeHandler.activateSudoMode null, cb
  41. it 'should produce an error', (done) ->
  42. @call (err) =>
  43. expect(err).to.not.equal null
  44. expect(err).to.be.instanceof Error
  45. done()
  46. it 'should not set value in redis', (done) ->
  47. @call (err) =>
  48. expect(@rclient.set.callCount).to.equal 0
  49. done()
  50. describe 'when rclient.set produces an error', ->
  51. beforeEach ->
  52. @rclient.set = sinon.stub().callsArgWith(4, new Error('woops'))
  53. it 'should produce an error', (done) ->
  54. @call (err) =>
  55. expect(err).to.not.equal null
  56. expect(err).to.be.instanceof Error
  57. done()
  58. describe 'clearSudoMode', ->
  59. beforeEach ->
  60. @rclient.del = sinon.stub().callsArgWith(1, null)
  61. @call = (cb) =>
  62. @SudoModeHandler.clearSudoMode @userId, cb
  63. it 'should not produce an error', (done) ->
  64. @call (err) =>
  65. expect(err).to.equal null
  66. done()
  67. it 'should delete key from redis', (done) ->
  68. @call (err) =>
  69. expect(@rclient.del.callCount).to.equal 1
  70. expect(@rclient.del.calledWith(
  71. 'SudoMode:{some_user_id}'
  72. )).to.equal true
  73. done()
  74. describe 'when rclient.del produces an error', ->
  75. beforeEach ->
  76. @rclient.del = sinon.stub().callsArgWith(1, new Error('woops'))
  77. it 'should produce an error', (done) ->
  78. @call (err) =>
  79. expect(err).to.not.equal null
  80. expect(err).to.be.instanceof Error
  81. done()
  82. describe 'when user id is not supplied', ->
  83. beforeEach ->
  84. @call = (cb) =>
  85. @SudoModeHandler.clearSudoMode null, cb
  86. it 'should produce an error', (done) ->
  87. @call (err) =>
  88. expect(err).to.not.equal null
  89. expect(err).to.be.instanceof Error
  90. done()
  91. it 'should not delete value in redis', (done) ->
  92. @call (err) =>
  93. expect(@rclient.del.callCount).to.equal 0
  94. done()
  95. describe 'isSudoModeActive', ->
  96. beforeEach ->
  97. @call = (cb) =>
  98. @SudoModeHandler.isSudoModeActive @userId, cb
  99. describe 'when sudo-mode is active for that user', ->
  100. beforeEach ->
  101. @rclient.get = sinon.stub().callsArgWith(1, null, '1')
  102. it 'should not produce an error', (done) ->
  103. @call (err, isActive) =>
  104. expect(err).to.equal null
  105. done()
  106. it 'should get the value from redis', (done) ->
  107. @call (err, isActive) =>
  108. expect(@rclient.get.callCount).to.equal 1
  109. expect(@rclient.get.calledWith('SudoMode:{some_user_id}')).to.equal true
  110. done()
  111. it 'should produce a true result', (done) ->
  112. @call (err, isActive) =>
  113. expect(isActive).to.equal true
  114. done()
  115. describe 'when sudo-mode is not active for that user', ->
  116. beforeEach ->
  117. @rclient.get = sinon.stub().callsArgWith(1, null, null)
  118. it 'should not produce an error', (done) ->
  119. @call (err, isActive) =>
  120. expect(err).to.equal null
  121. done()
  122. it 'should get the value from redis', (done) ->
  123. @call (err, isActive) =>
  124. expect(@rclient.get.callCount).to.equal 1
  125. expect(@rclient.get.calledWith('SudoMode:{some_user_id}')).to.equal true
  126. done()
  127. it 'should produce a false result', (done) ->
  128. @call (err, isActive) =>
  129. expect(isActive).to.equal false
  130. done()
  131. describe 'when rclient.get produces an error', ->
  132. beforeEach ->
  133. @rclient.get = sinon.stub().callsArgWith(1, new Error('woops'))
  134. it 'should produce an error', (done) ->
  135. @call (err, isActive) =>
  136. expect(err).to.not.equal null
  137. expect(err).to.be.instanceof Error
  138. expect(isActive).to.be.oneOf [null, undefined]
  139. done()
  140. describe 'when user id is not supplied', ->
  141. beforeEach ->
  142. @call = (cb) =>
  143. @SudoModeHandler.isSudoModeActive null, cb
  144. it 'should produce an error', (done) ->
  145. @call (err) =>
  146. expect(err).to.not.equal null
  147. expect(err).to.be.instanceof Error
  148. done()
  149. it 'should not get value in redis', (done) ->
  150. @call (err) =>
  151. expect(@rclient.get.callCount).to.equal 0
  152. done()