UserUpdaterTests.coffee 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  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. @addAffiliation = sinon.stub().yields()
  21. @removeAffiliation = sinon.stub().callsArgWith(2, null)
  22. @UserUpdater = SandboxedModule.require modulePath, requires:
  23. "logger-sharelatex": @logger
  24. "./UserGetter": @UserGetter
  25. './UserAffiliationsManager':
  26. addAffiliation: @addAffiliation
  27. removeAffiliation: @removeAffiliation
  28. "../../infrastructure/mongojs":@mongojs
  29. "metrics-sharelatex": timeAsyncMethod: sinon.stub()
  30. @stubbedUser =
  31. _id: "3131231"
  32. name:"bob"
  33. email:"hello@world.com"
  34. @newEmail = "bob@bob.com"
  35. afterEach ->
  36. tk.reset()
  37. describe 'changeEmailAddress', ->
  38. beforeEach ->
  39. @UserGetter.getUserEmail.callsArgWith(1, null, @stubbedUser.email)
  40. @UserUpdater.addEmailAddress = sinon.stub().callsArgWith(2)
  41. @UserUpdater.setDefaultEmailAddress = sinon.stub().callsArgWith(2)
  42. @UserUpdater.removeEmailAddress = sinon.stub().callsArgWith(2)
  43. it 'change email', (done)->
  44. @UserUpdater.changeEmailAddress @stubbedUser._id, @newEmail, (err)=>
  45. should.not.exist(err)
  46. @UserUpdater.addEmailAddress.calledWith(
  47. @stubbedUser._id, @newEmail
  48. ).should.equal true
  49. @UserUpdater.setDefaultEmailAddress.calledWith(
  50. @stubbedUser._id, @newEmail
  51. ).should.equal true
  52. @UserUpdater.removeEmailAddress.calledWith(
  53. @stubbedUser._id, @stubbedUser.email
  54. ).should.equal true
  55. done()
  56. it 'validates email', (done)->
  57. @UserUpdater.changeEmailAddress @stubbedUser._id, 'foo', (err)=>
  58. should.exist(err)
  59. done()
  60. it 'handle error', (done)->
  61. @UserUpdater.removeEmailAddress.callsArgWith(2, new Error('nope'))
  62. @UserUpdater.changeEmailAddress @stubbedUser._id, @newEmail, (err)=>
  63. should.exist(err)
  64. done()
  65. describe 'addEmailAddress', ->
  66. beforeEach ->
  67. @UserGetter.ensureUniqueEmailAddress = sinon.stub().callsArgWith(1)
  68. @UserUpdater.updateUser = sinon.stub().callsArgWith(2, null)
  69. it 'add email', (done)->
  70. @UserUpdater.addEmailAddress @stubbedUser._id, @newEmail, (err)=>
  71. @UserGetter.ensureUniqueEmailAddress.called.should.equal true
  72. should.not.exist(err)
  73. @UserUpdater.updateUser.calledWith(
  74. @stubbedUser._id,
  75. $push: { emails: { email: @newEmail, createdAt: sinon.match.date } }
  76. ).should.equal true
  77. done()
  78. it 'add affiliation', (done)->
  79. affiliationOptions =
  80. university: { id: 1 }
  81. role: 'Prof'
  82. department: 'Math'
  83. @UserUpdater.addEmailAddress @stubbedUser._id, @newEmail, affiliationOptions, (err)=>
  84. should.not.exist(err)
  85. @addAffiliation.calledOnce.should.equal true
  86. args = @addAffiliation.lastCall.args
  87. args[0].should.equal @stubbedUser._id
  88. args[1].should.equal @newEmail
  89. args[2].should.equal affiliationOptions
  90. done()
  91. it 'handle error', (done)->
  92. @UserUpdater.updateUser = sinon.stub().callsArgWith(2, new Error('nope'))
  93. @UserUpdater.addEmailAddress @stubbedUser._id, @newEmail, (err)=>
  94. @logger.err.called.should.equal true
  95. should.exist(err)
  96. done()
  97. it 'handle affiliation error', (done)->
  98. body = errors: 'affiliation error message'
  99. @addAffiliation.callsArgWith(3, new Error('nope'))
  100. @UserUpdater.addEmailAddress @stubbedUser._id, @newEmail, (err)=>
  101. should.exist(err)
  102. @UserUpdater.updateUser.called.should.equal false
  103. done()
  104. it 'validates email', (done)->
  105. @UserUpdater.addEmailAddress @stubbedUser._id, 'bar', (err)=>
  106. should.exist(err)
  107. done()
  108. describe 'removeEmailAddress', ->
  109. beforeEach ->
  110. @UserUpdater.updateUser = sinon.stub().callsArgWith(2, null, nMatched: 1)
  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. @removeAffiliation.calledOnce.should.equal true
  123. args = @removeAffiliation.lastCall.args
  124. args[0].should.equal @stubbedUser._id
  125. args[1].should.equal @newEmail
  126. done()
  127. it 'handle error', (done)->
  128. @UserUpdater.updateUser = sinon.stub().callsArgWith(2, new Error('nope'))
  129. @UserUpdater.removeEmailAddress @stubbedUser._id, @newEmail, (err)=>
  130. should.exist(err)
  131. done()
  132. it 'handle missed update', (done)->
  133. @UserUpdater.updateUser = sinon.stub().callsArgWith(2, null, n: 0)
  134. @UserUpdater.removeEmailAddress @stubbedUser._id, @newEmail, (err)=>
  135. should.exist(err)
  136. done()
  137. it 'handle affiliation error', (done)->
  138. @removeAffiliation.callsArgWith(2, new Error('nope'))
  139. @UserUpdater.removeEmailAddress @stubbedUser._id, @newEmail, (err)=>
  140. should.exist(err)
  141. @UserUpdater.updateUser.called.should.equal false
  142. done()
  143. it 'validates email', (done)->
  144. @UserUpdater.removeEmailAddress @stubbedUser._id, 'baz', (err)=>
  145. should.exist(err)
  146. done()
  147. describe 'setDefaultEmailAddress', ->
  148. it 'set default', (done)->
  149. @UserUpdater.updateUser = sinon.stub().callsArgWith(2, null, n: 1)
  150. @UserUpdater.setDefaultEmailAddress @stubbedUser._id, @newEmail, (err)=>
  151. should.not.exist(err)
  152. @UserUpdater.updateUser.calledWith(
  153. { _id: @stubbedUser._id, 'emails.email': @newEmail },
  154. $set: { email: @newEmail }
  155. ).should.equal true
  156. done()
  157. it 'handle error', (done)->
  158. @UserUpdater.updateUser = sinon.stub().callsArgWith(2, new Error('nope'))
  159. @UserUpdater.setDefaultEmailAddress @stubbedUser._id, @newEmail, (err)=>
  160. should.exist(err)
  161. done()
  162. it 'handle missed update', (done)->
  163. @UserUpdater.updateUser = sinon.stub().callsArgWith(2, null, n: 0)
  164. @UserUpdater.setDefaultEmailAddress @stubbedUser._id, @newEmail, (err)=>
  165. should.exist(err)
  166. done()
  167. it 'validates email', (done)->
  168. @UserUpdater.setDefaultEmailAddress @stubbedUser._id, '.edu', (err)=>
  169. should.exist(err)
  170. done()
  171. describe 'confirmEmail', ->
  172. beforeEach ->
  173. @UserUpdater.updateUser = sinon.stub().callsArgWith(2, null, n: 1)
  174. it 'should update the email record', (done)->
  175. @UserUpdater.confirmEmail @stubbedUser._id, @newEmail, (err)=>
  176. should.not.exist(err)
  177. @UserUpdater.updateUser.calledWith(
  178. { _id: @stubbedUser._id, 'emails.email': @newEmail },
  179. $set: { 'emails.$.confirmedAt': new Date() }
  180. ).should.equal true
  181. done()
  182. it 'add affiliation', (done)->
  183. @UserUpdater.confirmEmail @stubbedUser._id, @newEmail, (err)=>
  184. should.not.exist(err)
  185. @addAffiliation.calledOnce.should.equal true
  186. sinon.assert.calledWith(@addAffiliation, @stubbedUser._id, @newEmail)
  187. done()
  188. it 'handle error', (done)->
  189. @UserUpdater.updateUser = sinon.stub().callsArgWith(2, new Error('nope'))
  190. @UserUpdater.confirmEmail @stubbedUser._id, @newEmail, (err)=>
  191. should.exist(err)
  192. done()
  193. it 'handle missed update', (done)->
  194. @UserUpdater.updateUser = sinon.stub().callsArgWith(2, null, n: 0)
  195. @UserUpdater.confirmEmail @stubbedUser._id, @newEmail, (err)=>
  196. should.exist(err)
  197. done()
  198. it 'validates email', (done)->
  199. @UserUpdater.confirmEmail @stubbedUser._id, '@', (err)=>
  200. should.exist(err)
  201. done()
  202. it 'handle affiliation error', (done)->
  203. @addAffiliation.callsArgWith(2, new Error('nope'))
  204. @UserUpdater.confirmEmail @stubbedUser._id, @newEmail, (err)=>
  205. should.exist(err)
  206. @UserUpdater.updateUser.called.should.equal false
  207. done()