UserUpdaterTests.coffee 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  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. reversedHostname = @newEmail.split('@')[1].split('').reverse().join('')
  84. @UserUpdater.updateUser.calledWith(
  85. @stubbedUser._id,
  86. $push: { emails: { email: @newEmail, createdAt: sinon.match.date, reversedHostname: reversedHostname } }
  87. ).should.equal true
  88. done()
  89. it 'add affiliation', (done)->
  90. affiliationOptions =
  91. university: { id: 1 }
  92. role: 'Prof'
  93. department: 'Math'
  94. @UserUpdater.addEmailAddress @stubbedUser._id, @newEmail, affiliationOptions, (err)=>
  95. should.not.exist(err)
  96. @addAffiliation.calledOnce.should.equal true
  97. args = @addAffiliation.lastCall.args
  98. args[0].should.equal @stubbedUser._id
  99. args[1].should.equal @newEmail
  100. args[2].should.equal affiliationOptions
  101. done()
  102. it 'handle error', (done)->
  103. @UserUpdater.updateUser = sinon.stub().callsArgWith(2, new Error('nope'))
  104. @UserUpdater.addEmailAddress @stubbedUser._id, @newEmail, (err)=>
  105. @logger.err.called.should.equal true
  106. should.exist(err)
  107. done()
  108. it 'handle affiliation error', (done)->
  109. body = errors: 'affiliation error message'
  110. @addAffiliation.callsArgWith(3, new Error('nope'))
  111. @UserUpdater.addEmailAddress @stubbedUser._id, @newEmail, (err)=>
  112. should.exist(err)
  113. @UserUpdater.updateUser.called.should.equal false
  114. done()
  115. it 'validates email', (done)->
  116. @UserUpdater.addEmailAddress @stubbedUser._id, 'bar', (err)=>
  117. should.exist(err)
  118. done()
  119. describe 'removeEmailAddress', ->
  120. beforeEach ->
  121. @UserUpdater.updateUser = sinon.stub().callsArgWith(2, null, nMatched: 1)
  122. it 'remove email', (done)->
  123. @UserUpdater.removeEmailAddress @stubbedUser._id, @newEmail, (err)=>
  124. should.not.exist(err)
  125. @UserUpdater.updateUser.calledWith(
  126. { _id: @stubbedUser._id, email: { $ne: @newEmail } },
  127. $pull: { emails: { email: @newEmail } }
  128. ).should.equal true
  129. done()
  130. it 'remove affiliation', (done)->
  131. @UserUpdater.removeEmailAddress @stubbedUser._id, @newEmail, (err)=>
  132. should.not.exist(err)
  133. @removeAffiliation.calledOnce.should.equal true
  134. args = @removeAffiliation.lastCall.args
  135. args[0].should.equal @stubbedUser._id
  136. args[1].should.equal @newEmail
  137. done()
  138. it 'handle error', (done)->
  139. @UserUpdater.updateUser = sinon.stub().callsArgWith(2, new Error('nope'))
  140. @UserUpdater.removeEmailAddress @stubbedUser._id, @newEmail, (err)=>
  141. should.exist(err)
  142. done()
  143. it 'handle missed update', (done)->
  144. @UserUpdater.updateUser = sinon.stub().callsArgWith(2, null, n: 0)
  145. @UserUpdater.removeEmailAddress @stubbedUser._id, @newEmail, (err)=>
  146. should.exist(err)
  147. done()
  148. it 'handle affiliation error', (done)->
  149. @removeAffiliation.callsArgWith(2, new Error('nope'))
  150. @UserUpdater.removeEmailAddress @stubbedUser._id, @newEmail, (err)=>
  151. should.exist(err)
  152. @UserUpdater.updateUser.called.should.equal false
  153. done()
  154. it 'validates email', (done)->
  155. @UserUpdater.removeEmailAddress @stubbedUser._id, 'baz', (err)=>
  156. should.exist(err)
  157. done()
  158. describe 'setDefaultEmailAddress', ->
  159. beforeEach ->
  160. @UserGetter.getUserEmail.callsArgWith(1, null, @stubbedUser.email)
  161. @NewsletterManager.changeEmail.callsArgWith(2, null)
  162. it 'set default', (done)->
  163. @UserUpdater.updateUser = sinon.stub().callsArgWith(2, null, n: 1)
  164. @UserUpdater.setDefaultEmailAddress @stubbedUser._id, @newEmail, (err)=>
  165. should.not.exist(err)
  166. @UserUpdater.updateUser.calledWith(
  167. { _id: @stubbedUser._id, 'emails.email': @newEmail },
  168. $set: { email: @newEmail }
  169. ).should.equal true
  170. done()
  171. it 'set changed the email in newsletter', (done)->
  172. @UserUpdater.updateUser = sinon.stub().callsArgWith(2, null, n: 1)
  173. @UserUpdater.setDefaultEmailAddress @stubbedUser._id, @newEmail, (err)=>
  174. should.not.exist(err)
  175. @NewsletterManager.changeEmail.calledWith(
  176. @stubbedUser.email, @newEmail
  177. ).should.equal true
  178. done()
  179. it 'handle error', (done)->
  180. @UserUpdater.updateUser = sinon.stub().callsArgWith(2, new Error('nope'))
  181. @UserUpdater.setDefaultEmailAddress @stubbedUser._id, @newEmail, (err)=>
  182. should.exist(err)
  183. done()
  184. it 'handle missed update', (done)->
  185. @UserUpdater.updateUser = sinon.stub().callsArgWith(2, null, n: 0)
  186. @UserUpdater.setDefaultEmailAddress @stubbedUser._id, @newEmail, (err)=>
  187. should.exist(err)
  188. done()
  189. it 'validates email', (done)->
  190. @UserUpdater.setDefaultEmailAddress @stubbedUser._id, '.edu', (err)=>
  191. should.exist(err)
  192. done()
  193. describe 'confirmEmail', ->
  194. beforeEach ->
  195. @UserUpdater.updateUser = sinon.stub().callsArgWith(2, null, n: 1)
  196. it 'should update the email record', (done)->
  197. @UserUpdater.confirmEmail @stubbedUser._id, @newEmail, (err)=>
  198. should.not.exist(err)
  199. @UserUpdater.updateUser.calledWith(
  200. { _id: @stubbedUser._id, 'emails.email': @newEmail },
  201. $set: { 'emails.$.confirmedAt': new Date() }
  202. ).should.equal true
  203. done()
  204. it 'add affiliation', (done)->
  205. @UserUpdater.confirmEmail @stubbedUser._id, @newEmail, (err)=>
  206. should.not.exist(err)
  207. @addAffiliation.calledOnce.should.equal true
  208. sinon.assert.calledWith(@addAffiliation, @stubbedUser._id, @newEmail, { confirmedAt: new Date() } )
  209. done()
  210. it 'handle error', (done)->
  211. @UserUpdater.updateUser = sinon.stub().callsArgWith(2, new Error('nope'))
  212. @UserUpdater.confirmEmail @stubbedUser._id, @newEmail, (err)=>
  213. should.exist(err)
  214. done()
  215. it 'handle missed update', (done)->
  216. @UserUpdater.updateUser = sinon.stub().callsArgWith(2, null, n: 0)
  217. @UserUpdater.confirmEmail @stubbedUser._id, @newEmail, (err)=>
  218. should.exist(err)
  219. done()
  220. it 'validates email', (done)->
  221. @UserUpdater.confirmEmail @stubbedUser._id, '@', (err)=>
  222. should.exist(err)
  223. done()
  224. it 'handle affiliation error', (done)->
  225. @addAffiliation.callsArgWith(3, new Error('nope'))
  226. @UserUpdater.confirmEmail @stubbedUser._id, @newEmail, (err)=>
  227. should.exist(err)
  228. @UserUpdater.updateUser.called.should.equal false
  229. done()
  230. it 'refresh features', (done)->
  231. @UserUpdater.confirmEmail @stubbedUser._id, @newEmail, (err)=>
  232. should.not.exist(err)
  233. sinon.assert.calledWith(@refreshFeatures, @stubbedUser._id, true)
  234. done()