MessageHttpControllerTests.coffee 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  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/Messages/MessageHttpController"
  7. expect = require("chai").expect
  8. tk = require("timekeeper")
  9. describe "MessagesHttpController", ->
  10. beforeEach ->
  11. @settings = {}
  12. @date = Date.now()
  13. tk.freeze(@date)
  14. @MessagesHttpController = SandboxedModule.require modulePath, requires:
  15. "settings-sharelatex":@settings
  16. "logger-sharelatex": log:->
  17. "./MessageManager": @MessageManager = {}
  18. "./MessageFormatter": @MessageFormatter = {}
  19. "../Rooms/RoomManager": @RoomManager = {}
  20. @req =
  21. body:{}
  22. @res = {}
  23. @project_id = "12321321"
  24. @room_id = "Asdfadf adfafd"
  25. @user_id = "09832910838239081203981"
  26. @content = "my message here"
  27. afterEach ->
  28. tk.reset()
  29. describe "sendMessage", ->
  30. beforeEach ->
  31. @initialMessage = {content:@content}
  32. @MessageManager.createMessage = sinon.stub().callsArgWith(1, null, @initialMessage)
  33. @req.params =
  34. project_id:@project_id
  35. @req.body =
  36. user_id:@user_id
  37. content:@content
  38. @singlePopulatedMessage = {data:"here"}
  39. @MessageManager.populateMessagesWithUsers = sinon.stub().callsArgWith(1, null, [@singlePopulatedMessage])
  40. @RoomManager.findOrCreateRoom = sinon.stub().callsArgWith(1, null, @room = { _id : @room_id })
  41. @formattedMessage = {formatted:true}
  42. @MessageFormatter.formatMessageForClientSide = sinon.stub().returns(@formattedMessage)
  43. it "should look up the room for the project", ->
  44. @res.send = =>
  45. @RoomManager.findOrCreateRoom
  46. .calledWith({
  47. project_id: @project_id
  48. })
  49. .should.equal true
  50. done()
  51. it "should create the message with the message manager", (done)->
  52. @res.send = =>
  53. @MessageManager.createMessage
  54. .calledWith({
  55. content: @content
  56. user_id: @user_id
  57. room_id: @room_id
  58. timestamp: @date
  59. })
  60. .should.equal true
  61. done()
  62. @MessagesHttpController.sendMessage @req, @res
  63. it "should return the formetted message", (done)->
  64. @res.send = (code, data)=>
  65. assert.deepEqual @MessageManager.populateMessagesWithUsers.args[0][0], [@initialMessage]
  66. code.should.equal 201
  67. data.should.equal @formattedMessage
  68. done()
  69. @MessagesHttpController.sendMessage @req, @res
  70. describe "getMessages", ->
  71. beforeEach ->
  72. @project_id = "room-id-123"
  73. @timestamp = Date.now()
  74. @limit = 42
  75. @messages = "messages without users stub"
  76. @messagesWithUsers = "messages with users stub"
  77. @formattedMessages = "formatted messages stub"
  78. @RoomManager.findOrCreateRoom = sinon.stub().callsArgWith(1, null, @room = { _id : @room_id })
  79. @MessageManager.getMessages = sinon.stub().callsArgWith(2, null, @messages)
  80. @MessageManager.populateMessagesWithUsers = sinon.stub().callsArgWith(1, null, @messagesWithUsers)
  81. @MessageFormatter.formatMessagesForClientSide = sinon.stub().returns @formattedMessages
  82. describe "with a timestamp and limit", ->
  83. beforeEach ->
  84. @req.params =
  85. project_id:@project_id
  86. @req.query =
  87. before: @timestamp,
  88. limit: "#{@limit}"
  89. it "should look up the room for the project", ->
  90. @res.send = =>
  91. @RoomManager.findOrCreateRoom
  92. .calledWith({
  93. project_id: @project_id
  94. })
  95. .should.equal true
  96. done()
  97. it "should get the requested messages", ->
  98. @res.send = =>
  99. @MessageManager.getMessages
  100. .calledWith({
  101. timestamp: $lt: @timestamp
  102. room_id: @room_id
  103. }, {
  104. limit: @limit
  105. order_by: "timestamp"
  106. sort_order: -1
  107. })
  108. .should.equal true
  109. @MessagesHttpController.getMessages(@req, @res)
  110. it "should populate the messages with the users", (done)->
  111. @res.send = =>
  112. @MessageManager.populateMessagesWithUsers.calledWith(@messages).should.equal true
  113. done()
  114. @MessagesHttpController.getMessages(@req, @res)
  115. it "should return the formatted messages", (done)->
  116. @res.send = ()=>
  117. @MessageFormatter.formatMessagesForClientSide.calledWith(@messagesWithUsers).should.equal true
  118. done()
  119. @MessagesHttpController.getMessages(@req, @res)
  120. it "should send the formated messages back with a 200", (done)->
  121. @res.send = (code, data)=>
  122. code.should.equal 200
  123. data.should.equal @formattedMessages
  124. done()
  125. @MessagesHttpController.getMessages(@req, @res)
  126. describe "without a timestamp or limit", ->
  127. beforeEach ->
  128. @req.params =
  129. project_id:@project_id
  130. it "should get a default number of messages from the beginning", ->
  131. @res.send = =>
  132. @MessageManager.getMessages
  133. .calledWith({
  134. room_id: @room_id
  135. }, {
  136. limit: @MessagesHttpController.DEFAULT_MESSAGE_LIMIT
  137. order_by: "timestamp"
  138. sort_order: -1
  139. })
  140. .should.equal true
  141. @MessagesHttpController.getMessages(@req, @res)