UserEmailsControllerTests.coffee 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  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 =
  51. email: @newEmail
  52. university: { name: 'University Name' }
  53. department: 'Department'
  54. role: 'Role'
  55. @EmailHelper.parseEmail.returns @newEmail
  56. @UserEmailsConfirmationHandler.sendConfirmationEmail = sinon.stub().yields()
  57. @UserUpdater.addEmailAddress.callsArgWith 3, null
  58. it 'adds new email', (done) ->
  59. @UserEmailsController.add @req,
  60. sendStatus: (code) =>
  61. code.should.equal 204
  62. assertCalledWith @EmailHelper.parseEmail, @newEmail
  63. assertCalledWith @UserUpdater.addEmailAddress, @user._id, @newEmail
  64. affiliationOptions = @UserUpdater.addEmailAddress.lastCall.args[2]
  65. Object.keys(affiliationOptions).length.should.equal 3
  66. affiliationOptions.university.should.equal @req.body.university
  67. affiliationOptions.department.should.equal @req.body.department
  68. affiliationOptions.role.should.equal @req.body.role
  69. done()
  70. it 'sends an email confirmation', (done) ->
  71. @UserEmailsController.add @req,
  72. sendStatus: (code) =>
  73. code.should.equal 204
  74. assertCalledWith @UserEmailsConfirmationHandler.sendConfirmationEmail, @user._id, @newEmail
  75. done()
  76. it 'handles email parse error', (done) ->
  77. @EmailHelper.parseEmail.returns null
  78. @UserEmailsController.add @req,
  79. sendStatus: (code) =>
  80. code.should.equal 422
  81. assertNotCalled @UserUpdater.addEmailAddress
  82. done()
  83. describe 'remove', ->
  84. beforeEach ->
  85. @email = 'email_to_remove@bar.com'
  86. @req.body.email = @email
  87. @EmailHelper.parseEmail.returns @email
  88. it 'removes email', (done) ->
  89. @UserUpdater.removeEmailAddress.callsArgWith 2, null
  90. @UserEmailsController.remove @req,
  91. sendStatus: (code) =>
  92. code.should.equal 200
  93. assertCalledWith @EmailHelper.parseEmail, @email
  94. assertCalledWith @UserUpdater.removeEmailAddress, @user._id, @email
  95. done()
  96. it 'handles email parse error', (done) ->
  97. @EmailHelper.parseEmail.returns null
  98. @UserEmailsController.remove @req,
  99. sendStatus: (code) =>
  100. code.should.equal 422
  101. assertNotCalled @UserUpdater.removeEmailAddress
  102. done()
  103. describe 'setDefault', ->
  104. beforeEach ->
  105. @email = "email_to_set_default@bar.com"
  106. @req.body.email = @email
  107. @EmailHelper.parseEmail.returns @email
  108. it 'sets default email', (done) ->
  109. @UserUpdater.setDefaultEmailAddress.callsArgWith 2, null
  110. @UserEmailsController.setDefault @req,
  111. sendStatus: (code) =>
  112. code.should.equal 200
  113. assertCalledWith @EmailHelper.parseEmail, @email
  114. assertCalledWith @UserUpdater.setDefaultEmailAddress, @user._id, @email
  115. done()
  116. it 'handles email parse error', (done) ->
  117. @EmailHelper.parseEmail.returns null
  118. @UserEmailsController.setDefault @req,
  119. sendStatus: (code) =>
  120. code.should.equal 422
  121. assertNotCalled @UserUpdater.setDefaultEmailAddress
  122. done()
  123. describe 'confirm', ->
  124. beforeEach ->
  125. @UserEmailsConfirmationHandler.confirmEmailFromToken = sinon.stub().yields()
  126. @res =
  127. sendStatus: sinon.stub()
  128. json: sinon.stub()
  129. @res.status = sinon.stub().returns(@res)
  130. @next = sinon.stub()
  131. @token = 'mock-token'
  132. @req.body = token: @token
  133. describe 'successfully', ->
  134. beforeEach ->
  135. @UserEmailsController.confirm @req, @res, @next
  136. it 'should confirm the email from the token', ->
  137. @UserEmailsConfirmationHandler.confirmEmailFromToken
  138. .calledWith(@token)
  139. .should.equal true
  140. it 'should return a 200 status', ->
  141. @res.sendStatus.calledWith(200).should.equal true
  142. describe 'without a token', ->
  143. beforeEach ->
  144. @req.body.token = null
  145. @UserEmailsController.confirm @req, @res, @next
  146. it 'should return a 422 status', ->
  147. @res.sendStatus.calledWith(422).should.equal true
  148. describe 'when confirming fails', ->
  149. beforeEach ->
  150. @UserEmailsConfirmationHandler.confirmEmailFromToken = sinon.stub().yields(
  151. new Errors.NotFoundError('not found')
  152. )
  153. @UserEmailsController.confirm @req, @res, @next
  154. it 'should return a 404 error code with a message', ->
  155. @res.status.calledWith(404).should.equal true
  156. @res.json.calledWith({
  157. message: 'Sorry, your confirmation token is invalid or has expired. Please request a new email confirmation link.'
  158. }).should.equal true