UserRegistrationHandlerTests.coffee 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. should = require('chai').should()
  2. SandboxedModule = require('sandboxed-module')
  3. assert = require('assert')
  4. path = require('path')
  5. modulePath = path.join __dirname, '../../../../app/js/Features/User/UserRegistrationHandler'
  6. sinon = require("sinon")
  7. expect = require("chai").expect
  8. EmailHelper = require '../../../../app/js/Features/Helpers/EmailHelper'
  9. describe "UserRegistrationHandler", ->
  10. beforeEach ->
  11. @user =
  12. _id: @user_id = "31j2lk21kjl"
  13. @User =
  14. update: sinon.stub().callsArgWith(2)
  15. @UserGetter =
  16. getUserByAnyEmail: sinon.stub()
  17. @UserCreator =
  18. createNewUser:sinon.stub().callsArgWith(1, null, @user)
  19. @AuthenticationManager =
  20. validateEmail: sinon.stub().returns(null)
  21. validatePassword: sinon.stub().returns(null)
  22. setUserPassword: sinon.stub().callsArgWith(2)
  23. @NewsLetterManager =
  24. subscribe: sinon.stub().callsArgWith(1)
  25. @EmailHandler =
  26. sendEmail:sinon.stub().callsArgWith(2)
  27. @OneTimeTokenHandler =
  28. getNewToken: sinon.stub()
  29. @handler = SandboxedModule.require modulePath, requires:
  30. "../../models/User": {User:@User}
  31. "./UserGetter": @UserGetter
  32. "./UserCreator": @UserCreator
  33. "../Authentication/AuthenticationManager":@AuthenticationManager
  34. "../Newsletter/NewsletterManager":@NewsLetterManager
  35. "logger-sharelatex": @logger = { log: sinon.stub() }
  36. "crypto": @crypto = {}
  37. "../Email/EmailHandler": @EmailHandler
  38. "../Security/OneTimeTokenHandler": @OneTimeTokenHandler
  39. "../Analytics/AnalyticsManager": @AnalyticsManager = { recordEvent: sinon.stub() }
  40. "settings-sharelatex": @settings = {siteUrl: "http://sl.example.com"}
  41. "../Helpers/EmailHelper": EmailHelper
  42. @passingRequest = {email:"something@email.com", password:"123"}
  43. describe 'validate Register Request', ->
  44. it 'allows passing validation through', ->
  45. result = @handler._registrationRequestIsValid @passingRequest
  46. result.should.equal true
  47. describe 'failing email validation', ->
  48. beforeEach ->
  49. @AuthenticationManager.validateEmail.returns({ message: 'email not set' })
  50. it 'does not allow through', ->
  51. result = @handler._registrationRequestIsValid @passingRequest
  52. result.should.equal false
  53. describe 'failing password validation', ->
  54. beforeEach ->
  55. @AuthenticationManager.validatePassword.returns({ message: 'password is too short' })
  56. it 'does not allow through', ->
  57. result = @handler._registrationRequestIsValid @passingRequest
  58. result.should.equal false
  59. describe "registerNewUser", ->
  60. describe "holdingAccount", (done)->
  61. beforeEach ->
  62. @user.holdingAccount = true
  63. @handler._registrationRequestIsValid = sinon.stub().returns true
  64. @UserGetter.getUserByAnyEmail.callsArgWith(1, null, @user)
  65. it "should not create a new user if there is a holding account there", (done)->
  66. @handler.registerNewUser @passingRequest, (err)=>
  67. @UserCreator.createNewUser.called.should.equal false
  68. done()
  69. it "should set holding account to false", (done)->
  70. @handler.registerNewUser @passingRequest, (err)=>
  71. update = @User.update.args[0]
  72. assert.deepEqual update[0], {_id:@user._id}
  73. assert.deepEqual update[1], {"$set":{holdingAccount:false}}
  74. done()
  75. describe "invalidRequest", ->
  76. it "should not create a new user if the the request is not valid", (done)->
  77. @handler._registrationRequestIsValid = sinon.stub().returns false
  78. @handler.registerNewUser @passingRequest, (err)=>
  79. expect(err).to.exist
  80. @UserCreator.createNewUser.called.should.equal false
  81. done()
  82. it "should return email registered in the error if there is a non holdingAccount there", (done)->
  83. @UserGetter.getUserByAnyEmail.callsArgWith(1, null, @user = {holdingAccount:false})
  84. @handler.registerNewUser @passingRequest, (err, user)=>
  85. err.should.deep.equal new Error("EmailAlreadyRegistered")
  86. user.should.deep.equal @user
  87. done()
  88. describe "validRequest", ->
  89. beforeEach ->
  90. @handler._registrationRequestIsValid = sinon.stub().returns true
  91. @UserGetter.getUserByAnyEmail.callsArgWith 1
  92. it "should create a new user", (done)->
  93. @handler.registerNewUser @passingRequest, (err)=>
  94. @UserCreator.createNewUser.calledWith({email:@passingRequest.email, holdingAccount:false, first_name:@passingRequest.first_name, last_name:@passingRequest.last_name}).should.equal true
  95. done()
  96. it 'lower case email', (done)->
  97. @passingRequest.email = "soMe@eMail.cOm"
  98. @handler.registerNewUser @passingRequest, (err)=>
  99. @UserCreator.createNewUser.args[0][0].email.should.equal "some@email.com"
  100. done()
  101. it 'trim white space from email', (done)->
  102. @passingRequest.email = " some@email.com "
  103. @handler.registerNewUser @passingRequest, (err)=>
  104. @UserCreator.createNewUser.args[0][0].email.should.equal "some@email.com"
  105. done()
  106. it "should set the password", (done)->
  107. @handler.registerNewUser @passingRequest, (err)=>
  108. @AuthenticationManager.setUserPassword.calledWith(@user._id, @passingRequest.password).should.equal true
  109. done()
  110. it "should add the user to the newsletter if accepted terms", (done)->
  111. @passingRequest.subscribeToNewsletter = "true"
  112. @handler.registerNewUser @passingRequest, (err)=>
  113. @NewsLetterManager.subscribe.calledWith(@user).should.equal true
  114. done()
  115. it "should not add the user to the newsletter if not accepted terms", (done)->
  116. @handler.registerNewUser @passingRequest, (err)=>
  117. @NewsLetterManager.subscribe.calledWith(@user).should.equal false
  118. done()
  119. it "should track the registration event", (done)->
  120. @handler.registerNewUser @passingRequest, (err)=>
  121. @AnalyticsManager.recordEvent
  122. .calledWith(@user._id, "user-registered")
  123. .should.equal true
  124. done()
  125. it "should call the ReferalAllocator", (done)->
  126. done()
  127. describe "registerNewUserAndSendActivationEmail", ->
  128. beforeEach ->
  129. @email = "email@example.com"
  130. @crypto.randomBytes = sinon.stub().returns({toString: () => @password = "mock-password"})
  131. @OneTimeTokenHandler.getNewToken.yields(null, @token = "mock-token")
  132. @handler.registerNewUser = sinon.stub()
  133. @callback = sinon.stub()
  134. describe "with a new user", ->
  135. beforeEach ->
  136. @handler.registerNewUser.callsArgWith(1, null, @user)
  137. @handler.registerNewUserAndSendActivationEmail @email, @callback
  138. it "should ask the UserRegistrationHandler to register user", ->
  139. @handler.registerNewUser
  140. .calledWith({
  141. email: @email
  142. password: @password
  143. }).should.equal true
  144. it "should generate a new password reset token", ->
  145. @OneTimeTokenHandler.getNewToken
  146. .calledWith('password', @user_id, expiresIn: 7 * 24 * 60 * 60)
  147. .should.equal true
  148. it "should send a registered email", ->
  149. @EmailHandler.sendEmail
  150. .calledWith("registered", {
  151. to: @user.email
  152. setNewPasswordUrl: "#{@settings.siteUrl}/user/activate?token=#{@token}&user_id=#{@user_id}"
  153. })
  154. .should.equal true
  155. it "should return the user", ->
  156. @callback
  157. .calledWith(null, @user, "#{@settings.siteUrl}/user/activate?token=#{@token}&user_id=#{@user_id}")
  158. .should.equal true
  159. describe "with a user that already exists", ->
  160. beforeEach ->
  161. @handler.registerNewUser.callsArgWith(1, new Error("EmailAlreadyRegistered"), @user)
  162. @handler.registerNewUserAndSendActivationEmail @email, @callback
  163. it "should still generate a new password token and email", ->
  164. @OneTimeTokenHandler.getNewToken.called.should.equal true
  165. @EmailHandler.sendEmail.called.should.equal true