UserRegistrationHandlerTests.coffee 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  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. describe "UserRegistrationHandler", ->
  9. beforeEach ->
  10. @user =
  11. _id: @user_id = "31j2lk21kjl"
  12. @User =
  13. findOne:sinon.stub()
  14. update: sinon.stub().callsArgWith(2)
  15. @UserCreator =
  16. createNewUser:sinon.stub().callsArgWith(1, null, @user)
  17. @AuthenticationManager =
  18. setUserPassword: sinon.stub().callsArgWith(2)
  19. @NewsLetterManager =
  20. subscribe: sinon.stub().callsArgWith(1)
  21. @EmailHandler =
  22. sendEmail:sinon.stub().callsArgWith(2)
  23. @OneTimeTokenHandler =
  24. getNewToken: sinon.stub()
  25. @handler = SandboxedModule.require modulePath, requires:
  26. "../../models/User": {User:@User}
  27. "./UserCreator": @UserCreator
  28. "../Authentication/AuthenticationManager":@AuthenticationManager
  29. "../Newsletter/NewsletterManager":@NewsLetterManager
  30. "logger-sharelatex": @logger = { log: sinon.stub() }
  31. "crypto": @crypto = {}
  32. "../Email/EmailHandler": @EmailHandler
  33. "../Security/OneTimeTokenHandler": @OneTimeTokenHandler
  34. "settings-sharelatex": @settings = {siteUrl: "http://sl.example.com"}
  35. @passingRequest = {email:"something@email.com", password:"123"}
  36. describe 'validate Register Request', ->
  37. it 'allow working account through', ->
  38. result = @handler._registrationRequestIsValid @passingRequest
  39. result.should.equal true
  40. it 'not allow not valid email through ', ()->
  41. @passingRequest.email = "notemail"
  42. result = @handler._registrationRequestIsValid @passingRequest
  43. result.should.equal false
  44. it 'not allow no email through ', ->
  45. @passingRequest.email = ""
  46. result = @handler._registrationRequestIsValid @passingRequest
  47. result.should.equal false
  48. it 'not allow no password through ', ()->
  49. @passingRequest.password= ""
  50. result = @handler._registrationRequestIsValid @passingRequest
  51. result.should.equal false
  52. describe "registerNewUser", ->
  53. describe "holdingAccount", (done)->
  54. beforeEach ->
  55. @user.holdingAccount = true
  56. @handler._registrationRequestIsValid = sinon.stub().returns true
  57. @User.findOne.callsArgWith(1, null, @user)
  58. it "should not create a new user if there is a holding account there", (done)->
  59. @handler.registerNewUser @passingRequest, (err)=>
  60. @UserCreator.createNewUser.called.should.equal false
  61. done()
  62. it "should set holding account to false", (done)->
  63. @handler.registerNewUser @passingRequest, (err)=>
  64. update = @User.update.args[0]
  65. assert.deepEqual update[0], {_id:@user._id}
  66. assert.deepEqual update[1], {"$set":{holdingAccount:false}}
  67. done()
  68. describe "invalidRequest", ->
  69. it "should not create a new user if the the request is not valid", (done)->
  70. @handler._registrationRequestIsValid = sinon.stub().returns false
  71. @handler.registerNewUser @passingRequest, (err)=>
  72. expect(err).to.exist
  73. @UserCreator.createNewUser.called.should.equal false
  74. done()
  75. it "should return email registered in the error if there is a non holdingAccount there", (done)->
  76. @User.findOne.callsArgWith(1, null, @user = {holdingAccount:false})
  77. @handler.registerNewUser @passingRequest, (err, user)=>
  78. err.should.deep.equal new Error("EmailAlreadyRegistered")
  79. user.should.deep.equal @user
  80. done()
  81. describe "validRequest", ->
  82. beforeEach ->
  83. @handler._registrationRequestIsValid = sinon.stub().returns true
  84. @User.findOne.callsArgWith 1
  85. it "should create a new user", (done)->
  86. @handler.registerNewUser @passingRequest, (err)=>
  87. @UserCreator.createNewUser.calledWith({email:@passingRequest.email, holdingAccount:false}).should.equal true
  88. done()
  89. it 'lower case email', (done)->
  90. @passingRequest.email = "soMe@eMail.cOm"
  91. @handler.registerNewUser @passingRequest, (err)=>
  92. @UserCreator.createNewUser.calledWith({email:@passingRequest.email.toLowerCase(), holdingAccount:false}).should.equal true
  93. done()
  94. it 'trim white space from email', (done)->
  95. @passingRequest.email = " some@email.com "
  96. @handler.registerNewUser @passingRequest, (err)=>
  97. @UserCreator.createNewUser.calledWith({email:"some@email.com", holdingAccount:false}).should.equal true
  98. done()
  99. it "should set the password", (done)->
  100. @handler.registerNewUser @passingRequest, (err)=>
  101. @AuthenticationManager.setUserPassword.calledWith(@user._id, @passingRequest.password).should.equal true
  102. done()
  103. it "should add the user to the news letter manager", (done)->
  104. @handler.registerNewUser @passingRequest, (err)=>
  105. @NewsLetterManager.subscribe.calledWith(@user).should.equal true
  106. done()
  107. it "should call the ReferalAllocator", (done)->
  108. done()
  109. describe "registerNewUserAndSendActivationEmail", ->
  110. beforeEach ->
  111. @email = "email@example.com"
  112. @crypto.randomBytes = sinon.stub().returns({toString: () => @password = "mock-password"})
  113. @OneTimeTokenHandler.getNewToken.callsArgWith(2, null, @token = "mock-token")
  114. @handler.registerNewUser = sinon.stub()
  115. @callback = sinon.stub()
  116. describe "with a new user", ->
  117. beforeEach ->
  118. @handler.registerNewUser.callsArgWith(1, null, @user)
  119. @handler.registerNewUserAndSendActivationEmail @email, @callback
  120. it "should ask the UserRegistrationHandler to register user", ->
  121. @handler.registerNewUser
  122. .calledWith({
  123. email: @email
  124. password: @password
  125. }).should.equal true
  126. it "should generate a new password reset token", ->
  127. @OneTimeTokenHandler.getNewToken
  128. .calledWith(@user_id, expiresIn: 7 * 24 * 60 * 60)
  129. .should.equal true
  130. it "should send a registered email", ->
  131. @EmailHandler.sendEmail
  132. .calledWith("registered", {
  133. to: @user.email
  134. setNewPasswordUrl: "#{@settings.siteUrl}/user/activate?token=#{@token}&user_id=#{@user_id}"
  135. })
  136. .should.equal true
  137. it "should return the user", ->
  138. @callback
  139. .calledWith(null, @user, "#{@settings.siteUrl}/user/activate?token=#{@token}&user_id=#{@user_id}")
  140. .should.equal true
  141. describe "with a user that already exists", ->
  142. beforeEach ->
  143. @handler.registerNewUser.callsArgWith(1, new Error("EmailAlreadyRegistered"), @user)
  144. @handler.registerNewUserAndSendActivationEmail @email, @callback
  145. it "should still generate a new password token and email", ->
  146. @OneTimeTokenHandler.getNewToken.called.should.equal true
  147. @EmailHandler.sendEmail.called.should.equal true