PasswordResetControllerTests.coffee 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  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. i18n:
  30. translate:->
  31. @res = {}
  32. describe "requestReset", ->
  33. it "should error if the rate limit is hit", (done)->
  34. @PasswordResetHandler.generateAndEmailResetToken.callsArgWith(1, null, true)
  35. @RateLimiter.addCount.callsArgWith(1, null, false)
  36. @res.send = (code)=>
  37. code.should.equal 500
  38. @PasswordResetHandler.generateAndEmailResetToken.calledWith(@email.trim()).should.equal false
  39. done()
  40. @PasswordResetController.requestReset @req, @res
  41. it "should tell the handler to process that email", (done)->
  42. @RateLimiter.addCount.callsArgWith(1, null, true)
  43. @PasswordResetHandler.generateAndEmailResetToken.callsArgWith(1, null, true)
  44. @res.send = (code)=>
  45. code.should.equal 200
  46. @PasswordResetHandler.generateAndEmailResetToken.calledWith(@email.trim()).should.equal true
  47. done()
  48. @PasswordResetController.requestReset @req, @res
  49. it "should send a 500 if there is an error", (done)->
  50. @RateLimiter.addCount.callsArgWith(1, null, true)
  51. @PasswordResetHandler.generateAndEmailResetToken.callsArgWith(1, "error")
  52. @res.send = (code)=>
  53. code.should.equal 500
  54. done()
  55. @PasswordResetController.requestReset @req, @res
  56. it "should send a 404 if the email doesn't exist", (done)->
  57. @RateLimiter.addCount.callsArgWith(1, null, true)
  58. @PasswordResetHandler.generateAndEmailResetToken.callsArgWith(1, null, false)
  59. @res.send = (code)=>
  60. code.should.equal 404
  61. done()
  62. @PasswordResetController.requestReset @req, @res
  63. it "should lowercase the email address", (done)->
  64. @email = "UPerCaseEMAIL@example.Com"
  65. @req.body.email = @email
  66. @RateLimiter.addCount.callsArgWith(1, null, true)
  67. @PasswordResetHandler.generateAndEmailResetToken.callsArgWith(1, null, true)
  68. @res.send = (code)=>
  69. code.should.equal 200
  70. @PasswordResetHandler.generateAndEmailResetToken.calledWith(@email.toLowerCase()).should.equal true
  71. done()
  72. @PasswordResetController.requestReset @req, @res
  73. describe "setNewUserPassword", ->
  74. it "should tell the user handler to reset the password", (done)->
  75. @PasswordResetHandler.setNewUserPassword.callsArgWith(2, null, true)
  76. @res.send = (code)=>
  77. code.should.equal 200
  78. @PasswordResetHandler.setNewUserPassword.calledWith(@token, @password).should.equal true
  79. done()
  80. @PasswordResetController.setNewUserPassword @req, @res
  81. it "should send 404 if the token didn't work", (done)->
  82. @PasswordResetHandler.setNewUserPassword.callsArgWith(2, null, false)
  83. @res.send = (code)=>
  84. code.should.equal 404
  85. done()
  86. @PasswordResetController.setNewUserPassword @req, @res
  87. it "should return 400 (Bad Request) if there is no password", (done)->
  88. @req.body.password = ""
  89. @PasswordResetHandler.setNewUserPassword.callsArgWith(2)
  90. @res.send = (code)=>
  91. code.should.equal 400
  92. @PasswordResetHandler.setNewUserPassword.called.should.equal false
  93. done()
  94. @PasswordResetController.setNewUserPassword @req, @res
  95. it "should return 400 (Bad Request) if there is no passwordResetToken", (done)->
  96. @req.body.passwordResetToken = ""
  97. @PasswordResetHandler.setNewUserPassword.callsArgWith(2)
  98. @res.send = (code)=>
  99. code.should.equal 400
  100. @PasswordResetHandler.setNewUserPassword.called.should.equal false
  101. done()
  102. @PasswordResetController.setNewUserPassword @req, @res