PasswordResetControllerTests.coffee 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  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/PasswordReset/PasswordResetController"
  7. expect = require("chai").expect
  8. describe "PasswordResetController", ->
  9. beforeEach ->
  10. @settings = {}
  11. @PasswordResetHandler =
  12. generateAndEmailResetToken:sinon.stub()
  13. setNewUserPassword:sinon.stub()
  14. @RateLimiter =
  15. addCount: sinon.stub()
  16. @PasswordResetController = SandboxedModule.require modulePath, requires:
  17. "settings-sharelatex":@settings
  18. "./PasswordResetHandler":@PasswordResetHandler
  19. "logger-sharelatex": log:->
  20. "../../infrastructure/RateLimiter":@RateLimiter
  21. @email = "bob@bob.com "
  22. @token = "my security token that was emailed to me"
  23. @password = "my new password"
  24. @req =
  25. body:
  26. email:@email
  27. passwordResetToken:@token
  28. password:@password
  29. @res = {}
  30. describe "requestReset", ->
  31. it "should error if the rate limit is hit", (done)->
  32. @PasswordResetHandler.generateAndEmailResetToken.callsArgWith(1)
  33. @RateLimiter.addCount.callsArgWith(1, null, false)
  34. @res.send = (code)=>
  35. code.should.equal 500
  36. @PasswordResetHandler.generateAndEmailResetToken.calledWith(@email.trim()).should.equal false
  37. done()
  38. @PasswordResetController.requestReset @req, @res
  39. it "should tell the handler to process that email", (done)->
  40. @RateLimiter.addCount.callsArgWith(1, null, true)
  41. @PasswordResetHandler.generateAndEmailResetToken.callsArgWith(1)
  42. @res.send = (code)=>
  43. code.should.equal 200
  44. @PasswordResetHandler.generateAndEmailResetToken.calledWith(@email.trim()).should.equal true
  45. done()
  46. @PasswordResetController.requestReset @req, @res
  47. it "should send a 500 if there is an error", (done)->
  48. @RateLimiter.addCount.callsArgWith(1, null, true)
  49. @PasswordResetHandler.generateAndEmailResetToken.callsArgWith(1, "error")
  50. @res.send = (code)=>
  51. code.should.equal 500
  52. done()
  53. @PasswordResetController.requestReset @req, @res
  54. it "should lowercase the email address", (done)->
  55. @email = "UPerCaseEMAIL@example.Com"
  56. @req.body.email = @email
  57. @RateLimiter.addCount.callsArgWith(1, null, true)
  58. @PasswordResetHandler.generateAndEmailResetToken.callsArgWith(1)
  59. @res.send = (code)=>
  60. code.should.equal 200
  61. @PasswordResetHandler.generateAndEmailResetToken.calledWith(@email.toLowerCase()).should.equal true
  62. done()
  63. @PasswordResetController.requestReset @req, @res
  64. describe "setNewUserPassword", ->
  65. it "should tell the user handler to reset the password", (done)->
  66. @PasswordResetHandler.setNewUserPassword.callsArgWith(2)
  67. @res.send = (code)=>
  68. code.should.equal 200
  69. @PasswordResetHandler.setNewUserPassword.calledWith(@token, @password).should.equal true
  70. done()
  71. @PasswordResetController.setNewUserPassword @req, @res
  72. it "should send a 500 if there is an error", (done)->
  73. @PasswordResetHandler.setNewUserPassword.callsArgWith(2, "error")
  74. @res.send = (code)=>
  75. code.should.equal 500
  76. done()
  77. @PasswordResetController.setNewUserPassword @req, @res
  78. it "should error if there is no password", (done)->
  79. @req.body.password = ""
  80. @PasswordResetHandler.setNewUserPassword.callsArgWith(2)
  81. @res.send = (code)=>
  82. code.should.equal 500
  83. @PasswordResetHandler.setNewUserPassword.called.should.equal false
  84. done()
  85. @PasswordResetController.setNewUserPassword @req, @res
  86. it "should error if there is no password", (done)->
  87. @req.body.passwordResetToken = ""
  88. @PasswordResetHandler.setNewUserPassword.callsArgWith(2)
  89. @res.send = (code)=>
  90. code.should.equal 500
  91. @PasswordResetHandler.setNewUserPassword.called.should.equal false
  92. done()
  93. @PasswordResetController.setNewUserPassword @req, @res