UserUpdaterTests.coffee 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  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. @settings = {}
  13. @mongojs =
  14. db:{}
  15. ObjectId:(id)-> return id
  16. @UserGetter =
  17. getUserEmail: sinon.stub()
  18. getUserByAnyEmail: sinon.stub()
  19. ensureUniqueEmailAddress: sinon.stub()
  20. @logger = err: sinon.stub(), log: ->
  21. @UserUpdater = SandboxedModule.require modulePath, requires:
  22. "settings-sharelatex":@settings
  23. "logger-sharelatex": @logger
  24. "./UserGetter": @UserGetter
  25. "../../infrastructure/mongojs":@mongojs
  26. "metrics-sharelatex": timeAsyncMethod: sinon.stub()
  27. @stubbedUser =
  28. _id: "3131231"
  29. name:"bob"
  30. email:"hello@world.com"
  31. @newEmail = "bob@bob.com"
  32. afterEach ->
  33. tk.reset()
  34. describe 'changeEmailAddress', ->
  35. beforeEach ->
  36. @UserGetter.getUserEmail.callsArgWith(1, null, @stubbedUser.email)
  37. @UserUpdater.addEmailAddress = sinon.stub().callsArgWith(2)
  38. @UserUpdater.setDefaultEmailAddress = sinon.stub().callsArgWith(2)
  39. @UserUpdater.removeEmailAddress = sinon.stub().callsArgWith(2)
  40. it 'change email', (done)->
  41. @UserUpdater.changeEmailAddress @stubbedUser._id, @newEmail, (err)=>
  42. should.not.exist(err)
  43. @UserUpdater.addEmailAddress.calledWith(
  44. @stubbedUser._id, @newEmail
  45. ).should.equal true
  46. @UserUpdater.setDefaultEmailAddress.calledWith(
  47. @stubbedUser._id, @newEmail
  48. ).should.equal true
  49. @UserUpdater.removeEmailAddress.calledWith(
  50. @stubbedUser._id, @stubbedUser.email
  51. ).should.equal true
  52. done()
  53. it 'handle error', (done)->
  54. @UserUpdater.removeEmailAddress.callsArgWith(2, new Error('nope'))
  55. @UserUpdater.changeEmailAddress @stubbedUser._id, @newEmail, (err)=>
  56. should.exist(err)
  57. done()
  58. describe 'addEmailAddress', ->
  59. beforeEach ->
  60. @UserGetter.ensureUniqueEmailAddress = sinon.stub().callsArgWith(1)
  61. it 'add email', (done)->
  62. @UserUpdater.updateUser = sinon.stub().callsArgWith(2, null)
  63. @UserUpdater.addEmailAddress @stubbedUser._id, @newEmail, (err)=>
  64. @UserGetter.ensureUniqueEmailAddress.called.should.equal true
  65. should.not.exist(err)
  66. @UserUpdater.updateUser.calledWith(
  67. @stubbedUser._id,
  68. $push: { emails: { email: @newEmail, createdAt: sinon.match.date } }
  69. ).should.equal true
  70. done()
  71. it 'handle error', (done)->
  72. @UserUpdater.updateUser = sinon.stub().callsArgWith(2, new Error('nope'))
  73. @UserUpdater.addEmailAddress @stubbedUser._id, @newEmail, (err)=>
  74. @logger.err.called.should.equal true
  75. should.exist(err)
  76. done()
  77. describe 'removeEmailAddress', ->
  78. it 'remove email', (done)->
  79. @UserUpdater.updateUser = sinon.stub().callsArgWith(2, null, nMatched: 1)
  80. @UserUpdater.removeEmailAddress @stubbedUser._id, @newEmail, (err)=>
  81. should.not.exist(err)
  82. @UserUpdater.updateUser.calledWith(
  83. { _id: @stubbedUser._id, email: { $ne: @newEmail } },
  84. $pull: { emails: { email: @newEmail } }
  85. ).should.equal true
  86. done()
  87. it 'handle error', (done)->
  88. @UserUpdater.updateUser = sinon.stub().callsArgWith(2, new Error('nope'))
  89. @UserUpdater.removeEmailAddress @stubbedUser._id, @newEmail, (err)=>
  90. should.exist(err)
  91. done()
  92. it 'handle missed update', (done)->
  93. @UserUpdater.updateUser = sinon.stub().callsArgWith(2, null, n: 0)
  94. @UserUpdater.removeEmailAddress @stubbedUser._id, @newEmail, (err)=>
  95. should.exist(err)
  96. done()
  97. describe 'setDefaultEmailAddress', ->
  98. it 'set default', (done)->
  99. @UserUpdater.updateUser = sinon.stub().callsArgWith(2, null, n: 1)
  100. @UserUpdater.setDefaultEmailAddress @stubbedUser._id, @newEmail, (err)=>
  101. should.not.exist(err)
  102. @UserUpdater.updateUser.calledWith(
  103. { _id: @stubbedUser._id, 'emails.email': @newEmail },
  104. $set: { email: @newEmail }
  105. ).should.equal true
  106. done()
  107. it 'handle error', (done)->
  108. @UserUpdater.updateUser = sinon.stub().callsArgWith(2, new Error('nope'))
  109. @UserUpdater.setDefaultEmailAddress @stubbedUser._id, @newEmail, (err)=>
  110. should.exist(err)
  111. done()
  112. it 'handle missed update', (done)->
  113. @UserUpdater.updateUser = sinon.stub().callsArgWith(2, null, n: 0)
  114. @UserUpdater.setDefaultEmailAddress @stubbedUser._id, @newEmail, (err)=>
  115. should.exist(err)
  116. done()
  117. describe 'confirmEmail', ->
  118. it 'should update the email record', (done)->
  119. @UserUpdater.updateUser = sinon.stub().callsArgWith(2, null, n: 1)
  120. @UserUpdater.confirmEmail @stubbedUser._id, @newEmail, (err)=>
  121. should.not.exist(err)
  122. @UserUpdater.updateUser.calledWith(
  123. { _id: @stubbedUser._id, 'emails.email': @newEmail },
  124. $set: { 'emails.$.confirmedAt': new Date() }
  125. ).should.equal true
  126. done()
  127. it 'handle error', (done)->
  128. @UserUpdater.updateUser = sinon.stub().callsArgWith(2, new Error('nope'))
  129. @UserUpdater.confirmEmail @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.confirmEmail @stubbedUser._id, @newEmail, (err)=>
  135. should.exist(err)
  136. done()