UserInfoControllerTests.coffee 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. sinon = require('sinon')
  2. chai = require('chai')
  3. assert = require("chai").assert
  4. should = chai.should()
  5. expect = chai.expect
  6. modulePath = "../../../../app/js/Features/User/UserInfoController.js"
  7. SandboxedModule = require('sandboxed-module')
  8. events = require "events"
  9. MockResponse = require "../helpers/MockResponse"
  10. MockRequest = require "../helpers/MockRequest"
  11. ObjectId = require("mongojs").ObjectId
  12. describe "UserInfoController", ->
  13. beforeEach ->
  14. @UserDeleter =
  15. deleteUser: sinon.stub().callsArgWith(1)
  16. @UserUpdater =
  17. updatePersonalInfo: sinon.stub()
  18. @sanitizer = escape:(v)->v
  19. sinon.spy @sanitizer, "escape"
  20. @UserGetter = {}
  21. @UserInfoController = SandboxedModule.require modulePath, requires:
  22. "./UserGetter": @UserGetter
  23. "./UserUpdater": @UserUpdater
  24. "./UserDeleter": @UserDeleter
  25. "logger-sharelatex": log:->
  26. "sanitizer":@sanitizer
  27. '../Authentication/AuthenticationController': @AuthenticationController = {getLoggedInUserId: sinon.stub()}
  28. @req = new MockRequest()
  29. @res = new MockResponse()
  30. @next = sinon.stub()
  31. describe "getLoggedInUsersPersonalInfo", ->
  32. beforeEach ->
  33. @user =
  34. _id: ObjectId()
  35. @req.user = @user
  36. @req.session.user = @user
  37. @UserInfoController.sendFormattedPersonalInfo = sinon.stub()
  38. @UserGetter.getUser = sinon.stub().callsArgWith(2, null, @user)
  39. @AuthenticationController.getLoggedInUserId = sinon.stub().returns(@user._id)
  40. @UserInfoController.getLoggedInUsersPersonalInfo(@req, @res, @next)
  41. it "should call sendFormattedPersonalInfo", ->
  42. @UserInfoController.sendFormattedPersonalInfo
  43. .calledWith(@user, @res, @next)
  44. .should.equal true
  45. describe "getPersonalInfo", ->
  46. describe "when the user exists with sharelatex id", ->
  47. beforeEach ->
  48. @user_id = ObjectId().toString()
  49. @user =
  50. _id: ObjectId(@user_id)
  51. @req.params = user_id: @user_id
  52. @UserGetter.getUser = sinon.stub().callsArgWith(2, null, @user)
  53. @UserInfoController.sendFormattedPersonalInfo = sinon.stub()
  54. @UserInfoController.getPersonalInfo(@req, @res, @next)
  55. it "should look up the user in the database", ->
  56. @UserGetter.getUser
  57. .calledWith(
  58. { _id: ObjectId(@user_id) },
  59. { _id: true, first_name: true, last_name: true, email: true }
  60. ).should.equal true
  61. it "should send the formatted details back to the client", ->
  62. @UserInfoController.sendFormattedPersonalInfo
  63. .calledWith(@user, @res, @next)
  64. .should.equal true
  65. describe "when the user exists with overleaf id", ->
  66. beforeEach ->
  67. @user_id = 12345
  68. @user =
  69. _id: ObjectId()
  70. overleaf:
  71. id: @user_id
  72. @req.params = user_id: @user_id.toString()
  73. @UserGetter.getUser = sinon.stub().callsArgWith(2, null, @user)
  74. @UserInfoController.sendFormattedPersonalInfo = sinon.stub()
  75. @UserInfoController.getPersonalInfo(@req, @res, @next)
  76. it "should look up the user in the database", ->
  77. @UserGetter.getUser
  78. .calledWith(
  79. { "overleaf.id": @user_id },
  80. { _id: true, first_name: true, last_name: true, email: true }
  81. ).should.equal true
  82. it "should send the formatted details back to the client", ->
  83. @UserInfoController.sendFormattedPersonalInfo
  84. .calledWith(@user, @res, @next)
  85. .should.equal true
  86. describe "when the user does not exist", ->
  87. beforeEach ->
  88. @user_id = ObjectId().toString()
  89. @req.params = user_id: @user_id
  90. @UserGetter.getUser = sinon.stub().callsArgWith(2, null, null)
  91. @UserInfoController.getPersonalInfo(@req, @res, @next)
  92. it "should return 404 to the client", ->
  93. @res.statusCode.should.equal 404
  94. describe "when the user id is invalid", ->
  95. beforeEach ->
  96. @user_id = "invalid"
  97. @req.params = user_id: @user_id
  98. @UserGetter.getUser = sinon.stub().callsArgWith(2, null, null)
  99. @UserInfoController.getPersonalInfo(@req, @res, @next)
  100. it "should return 400 to the client", ->
  101. @res.statusCode.should.equal 400
  102. describe "sendFormattedPersonalInfo", ->
  103. beforeEach ->
  104. @user =
  105. _id: ObjectId()
  106. first_name: "Douglas"
  107. last_name: "Adams"
  108. email: "doug@sharelatex.com"
  109. @formattedInfo =
  110. id: @user._id.toString()
  111. first_name: @user.first_name
  112. last_name: @user.last_name
  113. email: @user.email
  114. @UserInfoController.formatPersonalInfo = sinon.stub().returns(@formattedInfo)
  115. @UserInfoController.sendFormattedPersonalInfo @user, @res
  116. it "should format the user details for the response", ->
  117. @UserInfoController.formatPersonalInfo
  118. .calledWith(@user)
  119. .should.equal true
  120. it "should send the formatted details back to the client", ->
  121. @res.body.should.equal JSON.stringify(@formattedInfo)
  122. describe "formatPersonalInfo", ->
  123. it "should return the correctly formatted data", ->
  124. @user =
  125. _id: ObjectId()
  126. first_name: "Douglas"
  127. last_name: "Adams"
  128. email: "doug@sharelatex.com"
  129. password: "should-not-get-included"
  130. signUpDate: new Date()
  131. role:"student"
  132. institution:"sheffield"
  133. expect(@UserInfoController.formatPersonalInfo(@user)).to.deep.equal {
  134. id: @user._id.toString()
  135. first_name: @user.first_name
  136. last_name: @user.last_name
  137. email: @user.email
  138. signUpDate: @user.signUpDate
  139. role: @user.role
  140. institution: @user.institution
  141. }