ChatControllerTests.coffee 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  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/Chat/ChatController"
  7. expect = require("chai").expect
  8. describe "ChatController", ->
  9. beforeEach ->
  10. @user_id = 'mock-user-id'
  11. @settings = {}
  12. @ChatApiHandler = {}
  13. @EditorRealTimeController =
  14. emitToRoom:sinon.stub().callsArgWith(3)
  15. @AuthenticationController =
  16. getLoggedInUserId: sinon.stub().returns(@user_id)
  17. @ChatController = SandboxedModule.require modulePath, requires:
  18. "settings-sharelatex": @settings
  19. "logger-sharelatex": log: ->
  20. "./ChatApiHandler": @ChatApiHandler
  21. "../Editor/EditorRealTimeController": @EditorRealTimeController
  22. '../Authentication/AuthenticationController': @AuthenticationController
  23. '../User/UserInfoManager': @UserInfoManager = {}
  24. '../User/UserInfoController': @UserInfoController = {}
  25. '../Comments/CommentsController': @CommentsController = {}
  26. @req =
  27. params:
  28. project_id: @project_id
  29. @res =
  30. json: sinon.stub()
  31. send: sinon.stub()
  32. describe "sendMessage", ->
  33. beforeEach ->
  34. @req.body =
  35. content: @content = "message-content"
  36. @UserInfoManager.getPersonalInfo = sinon.stub().yields(null, @user = {"unformatted": "user"})
  37. @UserInfoController.formatPersonalInfo = sinon.stub().returns(@formatted_user = {"formatted": "user"})
  38. @ChatApiHandler.sendGlobalMessage = sinon.stub().yields(null, @message = {"mock": "message", user_id: @user_id})
  39. @ChatController.sendMessage @req, @res
  40. it "should look up the user", ->
  41. @UserInfoManager.getPersonalInfo
  42. .calledWith(@user_id)
  43. .should.equal true
  44. it "should format and inject the user into the message", ->
  45. @UserInfoController.formatPersonalInfo
  46. .calledWith(@user)
  47. .should.equal true
  48. @message.user.should.deep.equal @formatted_user
  49. it "should tell the chat handler about the message", ->
  50. @ChatApiHandler.sendGlobalMessage
  51. .calledWith(@project_id, @user_id, @content)
  52. .should.equal true
  53. it "should tell the editor real time controller about the update with the data from the chat handler", ->
  54. @EditorRealTimeController.emitToRoom
  55. .calledWith(@project_id, "new-chat-message", @message)
  56. .should.equal true
  57. it "should return a 204 status code", ->
  58. @res.send.calledWith(204).should.equal true
  59. describe "getMessages", ->
  60. beforeEach ->
  61. @req.query =
  62. limit: @limit = "30"
  63. before: @before = "12345"
  64. @ChatController._injectUserInfoIntoThreads = sinon.stub().yields()
  65. @ChatApiHandler.getGlobalMessages = sinon.stub().yields(null, @messages = ["mock", "messages"])
  66. @ChatController.getMessages @req, @res
  67. it "should ask the chat handler about the request", ->
  68. @ChatApiHandler.getGlobalMessages
  69. .calledWith(@project_id, @limit, @before)
  70. .should.equal true
  71. it "should return the messages", ->
  72. @res.json.calledWith(@messages).should.equal true
  73. describe "_injectUserInfoIntoThreads", ->
  74. beforeEach ->
  75. @users = {
  76. "user_id_1": {
  77. "mock": "user_1"
  78. }
  79. "user_id_2": {
  80. "mock": "user_2"
  81. }
  82. }
  83. @UserInfoManager.getPersonalInfo = (user_id, callback) =>
  84. return callback(null, @users[user_id])
  85. sinon.spy @UserInfoManager, "getPersonalInfo"
  86. @UserInfoController.formatPersonalInfo = (user) ->
  87. return { "formatted": user["mock"] }
  88. it "should inject a user object into messaged and resolved data", (done) ->
  89. @ChatController._injectUserInfoIntoThreads {
  90. thread1: {
  91. resolved: true
  92. resolved_by_user_id: "user_id_1"
  93. messages: [{
  94. user_id: "user_id_1"
  95. content: "foo"
  96. }, {
  97. user_id: "user_id_2"
  98. content: "bar"
  99. }]
  100. },
  101. thread2: {
  102. messages: [{
  103. user_id: "user_id_1"
  104. content: "baz"
  105. }]
  106. }
  107. }, (error, threads) ->
  108. expect(threads).to.deep.equal {
  109. thread1: {
  110. resolved: true
  111. resolved_by_user_id: "user_id_1"
  112. resolved_by_user: { "formatted": "user_1" }
  113. messages: [{
  114. user_id: "user_id_1"
  115. user: { "formatted": "user_1" }
  116. content: "foo"
  117. }, {
  118. user_id: "user_id_2"
  119. user: { "formatted": "user_2" }
  120. content: "bar"
  121. }]
  122. },
  123. thread2: {
  124. messages: [{
  125. user_id: "user_id_1"
  126. user: { "formatted": "user_1" }
  127. content: "baz"
  128. }]
  129. }
  130. }
  131. done()
  132. it "should only need to look up each user once", (done) ->
  133. @ChatController._injectUserInfoIntoThreads [{
  134. messages: [{
  135. user_id: "user_id_1"
  136. content: "foo"
  137. }, {
  138. user_id: "user_id_1"
  139. content: "bar"
  140. }]
  141. }], (error, threads) =>
  142. @UserInfoManager.getPersonalInfo.calledOnce.should.equal true
  143. done()