UserEmailsControllerTests.coffee 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. sinon = require('sinon')
  2. assertCalledWith = sinon.assert.calledWith
  3. assertNotCalled = sinon.assert.notCalled
  4. chai = require('chai')
  5. should = chai.should()
  6. assert = chai.assert
  7. modulePath = "../../../../app/js/Features/User/UserEmailsController.js"
  8. SandboxedModule = require('sandboxed-module')
  9. MockRequest = require "../helpers/MockRequest"
  10. MockResponse = require "../helpers/MockResponse"
  11. Errors = require("../../../../app/js/Features/Errors/Errors")
  12. describe "UserEmailsController", ->
  13. beforeEach ->
  14. @req = new MockRequest()
  15. @user =
  16. _id: 'mock-user-id'
  17. @UserGetter =
  18. getUserFullEmails: sinon.stub()
  19. @AuthenticationController =
  20. getLoggedInUserId: sinon.stub().returns(@user._id)
  21. @UserUpdater =
  22. addEmailAddress: sinon.stub()
  23. removeEmailAddress: sinon.stub()
  24. setDefaultEmailAddress: sinon.stub()
  25. @EmailHelper =
  26. parseEmail: sinon.stub()
  27. @UserEmailsController = SandboxedModule.require modulePath, requires:
  28. "../Authentication/AuthenticationController": @AuthenticationController
  29. "./UserGetter": @UserGetter
  30. "./UserUpdater": @UserUpdater
  31. "../Helpers/EmailHelper": @EmailHelper
  32. "./UserEmailsConfirmationHandler": @UserEmailsConfirmationHandler = {}
  33. "../Errors/Errors": Errors
  34. "logger-sharelatex":
  35. log: -> console.log(arguments)
  36. err: ->
  37. describe 'List', ->
  38. beforeEach ->
  39. it 'lists emails', (done) ->
  40. fullEmails = [{some: 'data'}]
  41. @UserGetter.getUserFullEmails.callsArgWith 1, null, fullEmails
  42. @UserEmailsController.list @req,
  43. json: (response) =>
  44. assert.deepEqual response, fullEmails
  45. assertCalledWith @UserGetter.getUserFullEmails, @user._id
  46. done()
  47. describe 'Add', ->
  48. beforeEach ->
  49. @newEmail = 'new_email@baz.com'
  50. @req.body.email = @newEmail
  51. @EmailHelper.parseEmail.returns @newEmail
  52. @UserUpdater.addEmailAddress.callsArgWith 2, null
  53. @UserEmailsConfirmationHandler.sendConfirmationEmail = sinon.stub().yields()
  54. it 'adds new email', (done) ->
  55. @UserEmailsController.add @req,
  56. sendStatus: (code) =>
  57. code.should.equal 204
  58. assertCalledWith @EmailHelper.parseEmail, @newEmail
  59. assertCalledWith @UserUpdater.addEmailAddress, @user._id, @newEmail
  60. done()
  61. it 'sends an email confirmation', (done) ->
  62. @UserEmailsController.add @req,
  63. sendStatus: (code) =>
  64. code.should.equal 204
  65. assertCalledWith @UserEmailsConfirmationHandler.sendConfirmationEmail, @user._id, @newEmail
  66. done()
  67. it 'handles email parse error', (done) ->
  68. @EmailHelper.parseEmail.returns null
  69. @UserEmailsController.add @req,
  70. sendStatus: (code) =>
  71. code.should.equal 422
  72. assertNotCalled @UserUpdater.addEmailAddress
  73. done()
  74. describe 'remove', ->
  75. beforeEach ->
  76. @email = 'email_to_remove@bar.com'
  77. @req.body.email = @email
  78. @EmailHelper.parseEmail.returns @email
  79. it 'removes email', (done) ->
  80. @UserUpdater.removeEmailAddress.callsArgWith 2, null
  81. @UserEmailsController.remove @req,
  82. sendStatus: (code) =>
  83. code.should.equal 200
  84. assertCalledWith @EmailHelper.parseEmail, @email
  85. assertCalledWith @UserUpdater.removeEmailAddress, @user._id, @email
  86. done()
  87. it 'handles email parse error', (done) ->
  88. @EmailHelper.parseEmail.returns null
  89. @UserEmailsController.remove @req,
  90. sendStatus: (code) =>
  91. code.should.equal 422
  92. assertNotCalled @UserUpdater.removeEmailAddress
  93. done()
  94. describe 'setDefault', ->
  95. beforeEach ->
  96. @email = "email_to_set_default@bar.com"
  97. @req.body.email = @email
  98. @EmailHelper.parseEmail.returns @email
  99. it 'sets default email', (done) ->
  100. @UserUpdater.setDefaultEmailAddress.callsArgWith 2, null
  101. @UserEmailsController.setDefault @req,
  102. sendStatus: (code) =>
  103. code.should.equal 200
  104. assertCalledWith @EmailHelper.parseEmail, @email
  105. assertCalledWith @UserUpdater.setDefaultEmailAddress, @user._id, @email
  106. done()
  107. it 'handles email parse error', (done) ->
  108. @EmailHelper.parseEmail.returns null
  109. @UserEmailsController.setDefault @req,
  110. sendStatus: (code) =>
  111. code.should.equal 422
  112. assertNotCalled @UserUpdater.setDefaultEmailAddress
  113. done()
  114. describe 'confirm', ->
  115. beforeEach ->
  116. @UserEmailsConfirmationHandler.confirmEmailFromToken = sinon.stub().yields()
  117. @res =
  118. sendStatus: sinon.stub()
  119. json: sinon.stub()
  120. @res.status = sinon.stub().returns(@res)
  121. @next = sinon.stub()
  122. @token = 'mock-token'
  123. @req.body = token: @token
  124. describe 'successfully', ->
  125. beforeEach ->
  126. @UserEmailsController.confirm @req, @res, @next
  127. it 'should confirm the email from the token', ->
  128. @UserEmailsConfirmationHandler.confirmEmailFromToken
  129. .calledWith(@token)
  130. .should.equal true
  131. it 'should return a 200 status', ->
  132. @res.sendStatus.calledWith(200).should.equal true
  133. describe 'without a token', ->
  134. beforeEach ->
  135. @req.body.token = null
  136. @UserEmailsController.confirm @req, @res, @next
  137. it 'should return a 422 status', ->
  138. @res.sendStatus.calledWith(422).should.equal true
  139. describe 'when confirming fails', ->
  140. beforeEach ->
  141. @UserEmailsConfirmationHandler.confirmEmailFromToken = sinon.stub().yields(
  142. new Errors.NotFoundError('not found')
  143. )
  144. @UserEmailsController.confirm @req, @res, @next
  145. it 'should return a 404 error code with a message', ->
  146. @res.status.calledWith(404).should.equal true
  147. @res.json.calledWith({
  148. message: 'Sorry, your confirmation token is invalid or has expired. Please request a new email confirmation link.'
  149. }).should.equal true