UserEmailsControllerTests.coffee 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  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. updateV1AndSetDefaultEmailAddress: sinon.stub()
  26. @EmailHelper =
  27. parseEmail: sinon.stub()
  28. @endorseAffiliation = sinon.stub().yields()
  29. @UserEmailsController = SandboxedModule.require modulePath, requires:
  30. "../Authentication/AuthenticationController": @AuthenticationController
  31. "./UserGetter": @UserGetter
  32. "./UserUpdater": @UserUpdater
  33. "../Helpers/EmailHelper": @EmailHelper
  34. "./UserEmailsConfirmationHandler": @UserEmailsConfirmationHandler = {}
  35. "../Institutions/InstitutionsAPI": endorseAffiliation: @endorseAffiliation
  36. "../Errors/Errors": Errors
  37. "logger-sharelatex":
  38. log: -> console.log(arguments)
  39. err: ->
  40. describe 'List', ->
  41. beforeEach ->
  42. it 'lists emails', (done) ->
  43. fullEmails = [{some: 'data'}]
  44. @UserGetter.getUserFullEmails.callsArgWith 1, null, fullEmails
  45. @UserEmailsController.list @req,
  46. json: (response) =>
  47. assert.deepEqual response, fullEmails
  48. assertCalledWith @UserGetter.getUserFullEmails, @user._id
  49. done()
  50. describe 'Add', ->
  51. beforeEach ->
  52. @newEmail = 'new_email@baz.com'
  53. @req.body =
  54. email: @newEmail
  55. university: { name: 'University Name' }
  56. department: 'Department'
  57. role: 'Role'
  58. @EmailHelper.parseEmail.returns @newEmail
  59. @UserEmailsConfirmationHandler.sendConfirmationEmail = sinon.stub().yields()
  60. @UserUpdater.addEmailAddress.callsArgWith 3, null
  61. it 'adds new email', (done) ->
  62. @UserEmailsController.add @req,
  63. sendStatus: (code) =>
  64. code.should.equal 204
  65. assertCalledWith @EmailHelper.parseEmail, @newEmail
  66. assertCalledWith @UserUpdater.addEmailAddress, @user._id, @newEmail
  67. affiliationOptions = @UserUpdater.addEmailAddress.lastCall.args[2]
  68. Object.keys(affiliationOptions).length.should.equal 3
  69. affiliationOptions.university.should.equal @req.body.university
  70. affiliationOptions.department.should.equal @req.body.department
  71. affiliationOptions.role.should.equal @req.body.role
  72. done()
  73. it 'sends an email confirmation', (done) ->
  74. @UserEmailsController.add @req,
  75. sendStatus: (code) =>
  76. code.should.equal 204
  77. assertCalledWith @UserEmailsConfirmationHandler.sendConfirmationEmail, @user._id, @newEmail
  78. done()
  79. it 'handles email parse error', (done) ->
  80. @EmailHelper.parseEmail.returns null
  81. @UserEmailsController.add @req,
  82. sendStatus: (code) =>
  83. code.should.equal 422
  84. assertNotCalled @UserUpdater.addEmailAddress
  85. done()
  86. describe 'remove', ->
  87. beforeEach ->
  88. @email = 'email_to_remove@bar.com'
  89. @req.body.email = @email
  90. @EmailHelper.parseEmail.returns @email
  91. it 'removes email', (done) ->
  92. @UserUpdater.removeEmailAddress.callsArgWith 2, null
  93. @UserEmailsController.remove @req,
  94. sendStatus: (code) =>
  95. code.should.equal 200
  96. assertCalledWith @EmailHelper.parseEmail, @email
  97. assertCalledWith @UserUpdater.removeEmailAddress, @user._id, @email
  98. done()
  99. it 'handles email parse error', (done) ->
  100. @EmailHelper.parseEmail.returns null
  101. @UserEmailsController.remove @req,
  102. sendStatus: (code) =>
  103. code.should.equal 422
  104. assertNotCalled @UserUpdater.removeEmailAddress
  105. done()
  106. describe 'setDefault', ->
  107. beforeEach ->
  108. @email = "email_to_set_default@bar.com"
  109. @req.body.email = @email
  110. @EmailHelper.parseEmail.returns @email
  111. it 'sets default email', (done) ->
  112. @UserUpdater.updateV1AndSetDefaultEmailAddress.callsArgWith 2, null
  113. @UserEmailsController.setDefault @req,
  114. sendStatus: (code) =>
  115. code.should.equal 200
  116. assertCalledWith @EmailHelper.parseEmail, @email
  117. assertCalledWith @UserUpdater.updateV1AndSetDefaultEmailAddress, @user._id, @email
  118. done()
  119. it 'handles email parse error', (done) ->
  120. @EmailHelper.parseEmail.returns null
  121. @UserEmailsController.setDefault @req,
  122. sendStatus: (code) =>
  123. code.should.equal 422
  124. assertNotCalled @UserUpdater.setDefaultEmailAddress
  125. done()
  126. describe 'endorse', ->
  127. beforeEach ->
  128. @email = 'email_to_endorse@bar.com'
  129. @req.body.email = @email
  130. @EmailHelper.parseEmail.returns @email
  131. it 'endorses affiliation', (done) ->
  132. @req.body.role = 'Role'
  133. @req.body.department = 'Department'
  134. @UserEmailsController.endorse @req,
  135. sendStatus: (code) =>
  136. code.should.equal 204
  137. assertCalledWith @endorseAffiliation, @user._id, @email, 'Role', 'Department'
  138. done()
  139. describe 'confirm', ->
  140. beforeEach ->
  141. @UserEmailsConfirmationHandler.confirmEmailFromToken = sinon.stub().yields()
  142. @res =
  143. sendStatus: sinon.stub()
  144. json: sinon.stub()
  145. @res.status = sinon.stub().returns(@res)
  146. @next = sinon.stub()
  147. @token = 'mock-token'
  148. @req.body = token: @token
  149. describe 'successfully', ->
  150. beforeEach ->
  151. @UserEmailsController.confirm @req, @res, @next
  152. it 'should confirm the email from the token', ->
  153. @UserEmailsConfirmationHandler.confirmEmailFromToken
  154. .calledWith(@token)
  155. .should.equal true
  156. it 'should return a 200 status', ->
  157. @res.sendStatus.calledWith(200).should.equal true
  158. describe 'without a token', ->
  159. beforeEach ->
  160. @req.body.token = null
  161. @UserEmailsController.confirm @req, @res, @next
  162. it 'should return a 422 status', ->
  163. @res.sendStatus.calledWith(422).should.equal true
  164. describe 'when confirming fails', ->
  165. beforeEach ->
  166. @UserEmailsConfirmationHandler.confirmEmailFromToken = sinon.stub().yields(
  167. new Errors.NotFoundError('not found')
  168. )
  169. @UserEmailsController.confirm @req, @res, @next
  170. it 'should return a 404 error code with a message', ->
  171. @res.status.calledWith(404).should.equal true
  172. @res.json.calledWith({
  173. message: 'Sorry, your confirmation token is invalid or has expired. Please request a new email confirmation link.'
  174. }).should.equal true