UserUpdaterTests.coffee 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. should = require('chai').should()
  2. SandboxedModule = require('sandboxed-module')
  3. assert = require('assert')
  4. path = require('path')
  5. sinon = require('sinon')
  6. modulePath = path.join __dirname, "../../../../app/js/Features/User/UserUpdater"
  7. expect = require("chai").expect
  8. tk = require('timekeeper')
  9. describe "UserUpdater", ->
  10. beforeEach ->
  11. tk.freeze(Date.now())
  12. @mongojs =
  13. db:{}
  14. ObjectId:(id)-> return id
  15. @UserGetter =
  16. getUserEmail: sinon.stub()
  17. getUserByAnyEmail: sinon.stub()
  18. ensureUniqueEmailAddress: sinon.stub()
  19. @logger = err: sinon.stub(), log: ->
  20. settings = apis: { v1: { url: 'v1.url', user: '', pass: '' } }
  21. @request = sinon.stub()
  22. @UserUpdater = SandboxedModule.require modulePath, requires:
  23. "logger-sharelatex": @logger
  24. "./UserGetter": @UserGetter
  25. "../../infrastructure/mongojs":@mongojs
  26. "metrics-sharelatex": timeAsyncMethod: sinon.stub()
  27. 'settings-sharelatex': settings
  28. 'request': @request
  29. @stubbedUser =
  30. _id: "3131231"
  31. name:"bob"
  32. email:"hello@world.com"
  33. @newEmail = "bob@bob.com"
  34. afterEach ->
  35. tk.reset()
  36. describe 'changeEmailAddress', ->
  37. beforeEach ->
  38. @UserGetter.getUserEmail.callsArgWith(1, null, @stubbedUser.email)
  39. @UserUpdater.addEmailAddress = sinon.stub().callsArgWith(2)
  40. @UserUpdater.setDefaultEmailAddress = sinon.stub().callsArgWith(2)
  41. @UserUpdater.removeEmailAddress = sinon.stub().callsArgWith(2)
  42. it 'change email', (done)->
  43. @UserUpdater.changeEmailAddress @stubbedUser._id, @newEmail, (err)=>
  44. should.not.exist(err)
  45. @UserUpdater.addEmailAddress.calledWith(
  46. @stubbedUser._id, @newEmail
  47. ).should.equal true
  48. @UserUpdater.setDefaultEmailAddress.calledWith(
  49. @stubbedUser._id, @newEmail
  50. ).should.equal true
  51. @UserUpdater.removeEmailAddress.calledWith(
  52. @stubbedUser._id, @stubbedUser.email
  53. ).should.equal true
  54. done()
  55. it 'handle error', (done)->
  56. @UserUpdater.removeEmailAddress.callsArgWith(2, new Error('nope'))
  57. @UserUpdater.changeEmailAddress @stubbedUser._id, @newEmail, (err)=>
  58. should.exist(err)
  59. done()
  60. describe 'addEmailAddress', ->
  61. beforeEach ->
  62. @UserGetter.ensureUniqueEmailAddress = sinon.stub().callsArgWith(1)
  63. @UserUpdater.updateUser = sinon.stub().callsArgWith(2, null)
  64. @request.callsArgWith(1, null, { statusCode: 201 })
  65. it 'add email', (done)->
  66. @UserUpdater.addEmailAddress @stubbedUser._id, @newEmail, (err)=>
  67. @UserGetter.ensureUniqueEmailAddress.called.should.equal true
  68. should.not.exist(err)
  69. @UserUpdater.updateUser.calledWith(
  70. @stubbedUser._id,
  71. $push: { emails: { email: @newEmail, createdAt: sinon.match.date } }
  72. ).should.equal true
  73. done()
  74. it 'add affiliation', (done)->
  75. affiliationOptions =
  76. university: { id: 1 }
  77. role: 'Prof'
  78. department: 'Math'
  79. @UserUpdater.addEmailAddress @stubbedUser._id, @newEmail, affiliationOptions, (err)=>
  80. should.not.exist(err)
  81. @request.calledOnce.should.equal true
  82. requestOptions = @request.lastCall.args[0]
  83. expectedUrl = "v1.url/api/v2/users/#{@stubbedUser._id}/affiliations"
  84. requestOptions.url.should.equal expectedUrl
  85. requestOptions.method.should.equal 'POST'
  86. body = requestOptions.body
  87. Object.keys(body).length.should.equal 4
  88. body.email.should.equal @newEmail
  89. body.university.should.equal affiliationOptions.university
  90. body.department.should.equal affiliationOptions.department
  91. body.role.should.equal affiliationOptions.role
  92. done()
  93. it 'handle error', (done)->
  94. @UserUpdater.updateUser = sinon.stub().callsArgWith(2, new Error('nope'))
  95. @UserUpdater.addEmailAddress @stubbedUser._id, @newEmail, (err)=>
  96. @logger.err.called.should.equal true
  97. should.exist(err)
  98. done()
  99. it 'handle affiliation error', (done)->
  100. body = errors: 'affiliation error message'
  101. @request.callsArgWith(1, null, { statusCode: 422 }, body)
  102. @UserUpdater.addEmailAddress @stubbedUser._id, @newEmail, (err)=>
  103. err.message.should.have.string 422
  104. err.message.should.have.string body.errors
  105. @UserUpdater.updateUser.called.should.equal false
  106. done()
  107. describe 'removeEmailAddress', ->
  108. beforeEach ->
  109. @UserUpdater.updateUser = sinon.stub().callsArgWith(2, null, nMatched: 1)
  110. @request.callsArgWith(1, null, { statusCode: 404 })
  111. it 'remove email', (done)->
  112. @UserUpdater.removeEmailAddress @stubbedUser._id, @newEmail, (err)=>
  113. should.not.exist(err)
  114. @UserUpdater.updateUser.calledWith(
  115. { _id: @stubbedUser._id, email: { $ne: @newEmail } },
  116. $pull: { emails: { email: @newEmail } }
  117. ).should.equal true
  118. done()
  119. it 'remove affiliation', (done)->
  120. @UserUpdater.removeEmailAddress @stubbedUser._id, @newEmail, (err)=>
  121. should.not.exist(err)
  122. @request.calledOnce.should.equal true
  123. requestOptions = @request.lastCall.args[0]
  124. expectedUrl = "v1.url/api/v2/users/#{@stubbedUser._id}/affiliations/"
  125. expectedUrl += encodeURIComponent(@newEmail)
  126. requestOptions.url.should.equal expectedUrl
  127. requestOptions.method.should.equal 'DELETE'
  128. done()
  129. it 'handle error', (done)->
  130. @UserUpdater.updateUser = sinon.stub().callsArgWith(2, new Error('nope'))
  131. @UserUpdater.removeEmailAddress @stubbedUser._id, @newEmail, (err)=>
  132. should.exist(err)
  133. done()
  134. it 'handle missed update', (done)->
  135. @UserUpdater.updateUser = sinon.stub().callsArgWith(2, null, n: 0)
  136. @UserUpdater.removeEmailAddress @stubbedUser._id, @newEmail, (err)=>
  137. should.exist(err)
  138. done()
  139. it 'handle affiliation error', (done)->
  140. @request.callsArgWith(1, null, { statusCode: 500 })
  141. @UserUpdater.removeEmailAddress @stubbedUser._id, @newEmail, (err)=>
  142. err.message.should.exist
  143. @UserUpdater.updateUser.called.should.equal false
  144. done()
  145. describe 'setDefaultEmailAddress', ->
  146. it 'set default', (done)->
  147. @UserUpdater.updateUser = sinon.stub().callsArgWith(2, null, n: 1)
  148. @UserUpdater.setDefaultEmailAddress @stubbedUser._id, @newEmail, (err)=>
  149. should.not.exist(err)
  150. @UserUpdater.updateUser.calledWith(
  151. { _id: @stubbedUser._id, 'emails.email': @newEmail },
  152. $set: { email: @newEmail }
  153. ).should.equal true
  154. done()
  155. it 'handle error', (done)->
  156. @UserUpdater.updateUser = sinon.stub().callsArgWith(2, new Error('nope'))
  157. @UserUpdater.setDefaultEmailAddress @stubbedUser._id, @newEmail, (err)=>
  158. should.exist(err)
  159. done()
  160. it 'handle missed update', (done)->
  161. @UserUpdater.updateUser = sinon.stub().callsArgWith(2, null, n: 0)
  162. @UserUpdater.setDefaultEmailAddress @stubbedUser._id, @newEmail, (err)=>
  163. should.exist(err)
  164. done()
  165. describe 'confirmEmail', ->
  166. it 'should update the email record', (done)->
  167. @UserUpdater.updateUser = sinon.stub().callsArgWith(2, null, n: 1)
  168. @UserUpdater.confirmEmail @stubbedUser._id, @newEmail, (err)=>
  169. should.not.exist(err)
  170. @UserUpdater.updateUser.calledWith(
  171. { _id: @stubbedUser._id, 'emails.email': @newEmail },
  172. $set: { 'emails.$.confirmedAt': new Date() }
  173. ).should.equal true
  174. done()
  175. it 'handle error', (done)->
  176. @UserUpdater.updateUser = sinon.stub().callsArgWith(2, new Error('nope'))
  177. @UserUpdater.confirmEmail @stubbedUser._id, @newEmail, (err)=>
  178. should.exist(err)
  179. done()
  180. it 'handle missed update', (done)->
  181. @UserUpdater.updateUser = sinon.stub().callsArgWith(2, null, n: 0)
  182. @UserUpdater.confirmEmail @stubbedUser._id, @newEmail, (err)=>
  183. should.exist(err)
  184. done()