UserPagesControllerTests.coffee 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  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/UserPagesController"
  7. expect = require("chai").expect
  8. describe "UserPagesController", ->
  9. beforeEach ->
  10. @settings = {}
  11. @user =
  12. _id: @user_id = "kwjewkl"
  13. features:{}
  14. email: "joe@example.com"
  15. @UserGetter = getUser: sinon.stub()
  16. @UserSessionsManager =
  17. getAllUserSessions: sinon.stub()
  18. @dropboxStatus = {}
  19. @DropboxHandler =
  20. getUserRegistrationStatus : sinon.stub().callsArgWith(1, null, @dropboxStatus)
  21. @ErrorController =
  22. notFound: sinon.stub()
  23. @AuthenticationController =
  24. getLoggedInUserId: sinon.stub().returns(@user._id)
  25. getSessionUser: sinon.stub().returns(@user)
  26. _getRedirectFromSession: sinon.stub()
  27. _setRedirectInSession: sinon.stub()
  28. @UserPagesController = SandboxedModule.require modulePath, requires:
  29. "settings-sharelatex": @settings
  30. "logger-sharelatex":
  31. log:->
  32. err:->
  33. "./UserGetter": @UserGetter
  34. "./UserSessionsManager": @UserSessionsManager
  35. "../Errors/ErrorController": @ErrorController
  36. '../Dropbox/DropboxHandler': @DropboxHandler
  37. '../Authentication/AuthenticationController': @AuthenticationController
  38. @req =
  39. query:{}
  40. session:
  41. user:@user
  42. @res = {}
  43. describe "registerPage", ->
  44. it "should render the register page", (done)->
  45. @res.render = (page)=>
  46. page.should.equal "user/register"
  47. done()
  48. @UserPagesController.registerPage @req, @res
  49. it "should set sharedProjectData", (done)->
  50. @req.query.project_name = "myProject"
  51. @req.query.user_first_name = "user_first_name_here"
  52. @res.render = (page, opts)=>
  53. opts.sharedProjectData.project_name.should.equal "myProject"
  54. opts.sharedProjectData.user_first_name.should.equal "user_first_name_here"
  55. done()
  56. @UserPagesController.registerPage @req, @res
  57. it "should set newTemplateData", (done)->
  58. @req.session.templateData =
  59. templateName : "templateName"
  60. @res.render = (page, opts)=>
  61. opts.newTemplateData.templateName.should.equal "templateName"
  62. done()
  63. @UserPagesController.registerPage @req, @res
  64. it "should not set the newTemplateData if there is nothing in the session", (done)->
  65. @res.render = (page, opts)=>
  66. assert.equal opts.newTemplateData.templateName, undefined
  67. done()
  68. @UserPagesController.registerPage @req, @res
  69. describe "loginForm", ->
  70. it "should render the login page", (done)->
  71. @res.render = (page)=>
  72. page.should.equal "user/login"
  73. done()
  74. @UserPagesController.loginPage @req, @res
  75. describe 'when an explicit redirect is set via query string', ->
  76. beforeEach ->
  77. @AuthenticationController._getRedirectFromSession = sinon.stub().returns(null)
  78. @AuthenticationController._setRedirectInSession = sinon.stub()
  79. @req.query.redir = '/somewhere/in/particular'
  80. it 'should set a redirect', (done) ->
  81. @res.render = (page) =>
  82. @AuthenticationController._setRedirectInSession.callCount.should.equal 1
  83. expect(@AuthenticationController._setRedirectInSession.lastCall.args[1]).to.equal @req.query.redir
  84. done()
  85. @UserPagesController.loginPage @req, @res
  86. describe 'sessionsPage', ->
  87. beforeEach ->
  88. @UserSessionsManager.getAllUserSessions.callsArgWith(2, null, [])
  89. it 'should render user/sessions', (done) ->
  90. @res.render = (page)->
  91. page.should.equal "user/sessions"
  92. done()
  93. @UserPagesController.sessionsPage @req, @res
  94. it 'should have called getAllUserSessions', (done) ->
  95. @res.render = (page) =>
  96. @UserSessionsManager.getAllUserSessions.callCount.should.equal 1
  97. done()
  98. @UserPagesController.sessionsPage @req, @res
  99. describe 'when getAllUserSessions produces an error', ->
  100. beforeEach ->
  101. @UserSessionsManager.getAllUserSessions.callsArgWith(2, new Error('woops'))
  102. it 'should call next with an error', (done) ->
  103. @next = (err) =>
  104. assert(err != null)
  105. assert(err instanceof Error)
  106. done()
  107. @UserPagesController.sessionsPage @req, @res, @next
  108. describe "settingsPage", ->
  109. beforeEach ->
  110. @UserGetter.getUser = sinon.stub().callsArgWith(1, null, @user)
  111. it "should render user/settings", (done)->
  112. @res.render = (page)->
  113. page.should.equal "user/settings"
  114. done()
  115. @UserPagesController.settingsPage @req, @res
  116. it "should send user", (done)->
  117. @res.render = (page, opts)=>
  118. opts.user.should.equal @user
  119. done()
  120. @UserPagesController.settingsPage @req, @res
  121. it "should set 'shouldAllowEditingDetails' to true", (done)->
  122. @res.render = (page, opts)=>
  123. opts.shouldAllowEditingDetails.should.equal true
  124. done()
  125. @UserPagesController.settingsPage @req, @res
  126. describe 'when ldap.updateUserDetailsOnLogin is true', ->
  127. beforeEach ->
  128. @settings.ldap = {updateUserDetailsOnLogin: true}
  129. afterEach ->
  130. delete @settings.ldap
  131. it 'should set "shouldAllowEditingDetails" to false', (done) ->
  132. @res.render = (page, opts)=>
  133. opts.shouldAllowEditingDetails.should.equal false
  134. done()
  135. @UserPagesController.settingsPage @req, @res
  136. describe 'when saml.updateUserDetailsOnLogin is true', ->
  137. beforeEach ->
  138. @settings.saml = {updateUserDetailsOnLogin: true}
  139. afterEach ->
  140. delete @settings.saml
  141. it 'should set "shouldAllowEditingDetails" to false', (done) ->
  142. @res.render = (page, opts)=>
  143. opts.shouldAllowEditingDetails.should.equal false
  144. done()
  145. @UserPagesController.settingsPage @req, @res
  146. describe "activateAccountPage", ->
  147. beforeEach ->
  148. @UserGetter.getUser = sinon.stub().callsArgWith(2, null, @user)
  149. @req.query.user_id = @user_id
  150. @req.query.token = @token = "mock-token-123"
  151. it "should 404 without a user_id", (done) ->
  152. delete @req.query.user_id
  153. @ErrorController.notFound = () ->
  154. done()
  155. @UserPagesController.activateAccountPage @req, @res
  156. it "should 404 without a token", (done) ->
  157. delete @req.query.token
  158. @ErrorController.notFound = () ->
  159. done()
  160. @UserPagesController.activateAccountPage @req, @res
  161. it "should 404 without a valid user_id", (done) ->
  162. @UserGetter.getUser = sinon.stub().callsArgWith(2, null, null)
  163. @ErrorController.notFound = () ->
  164. done()
  165. @UserPagesController.activateAccountPage @req, @res
  166. it "should redirect activated users to login", (done) ->
  167. @user.loginCount = 1
  168. @res.redirect = (url) =>
  169. @UserGetter.getUser.calledWith(@user_id).should.equal true
  170. url.should.equal "/login?email=#{encodeURIComponent(@user.email)}"
  171. done()
  172. @UserPagesController.activateAccountPage @req, @res
  173. it "render the activation page if the user has not logged in before", (done) ->
  174. @user.loginCount = 0
  175. @res.render = (page, opts) =>
  176. page.should.equal "user/activate"
  177. opts.email.should.equal @user.email
  178. opts.token.should.equal @token
  179. done()
  180. @UserPagesController.activateAccountPage @req, @res