UserUpdaterTests.coffee 8.2 KB

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