UserPagesControllerTests.coffee 7.4 KB

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