UserEmailsControllerTests.coffee 6.4 KB

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