UserUpdaterTests.coffee 8.8 KB

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