ReceiveUpdateTests.coffee 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. chai = require("chai")
  2. expect = chai.expect
  3. chai.should()
  4. RealTimeClient = require "./helpers/RealTimeClient"
  5. MockWebServer = require "./helpers/MockWebServer"
  6. FixturesManager = require "./helpers/FixturesManager"
  7. async = require "async"
  8. settings = require "settings-sharelatex"
  9. redis = require "redis-sharelatex"
  10. rclient = redis.createClient(settings.redis.web)
  11. describe "receiveUpdate", ->
  12. before (done) ->
  13. @lines = ["test", "doc", "lines"]
  14. @version = 42
  15. @ops = ["mock", "doc", "ops"]
  16. async.series [
  17. (cb) =>
  18. FixturesManager.setUpProject {
  19. privilegeLevel: "owner"
  20. project: { name: "Test Project" }
  21. }, (error, {@user_id, @project_id}) => cb()
  22. (cb) =>
  23. FixturesManager.setUpDoc @project_id, {@lines, @version, @ops}, (e, {@doc_id}) =>
  24. cb(e)
  25. (cb) =>
  26. @clientA = RealTimeClient.connect()
  27. @clientA.on "connectionAccepted", cb
  28. (cb) =>
  29. @clientB = RealTimeClient.connect()
  30. @clientB.on "connectionAccepted", cb
  31. (cb) =>
  32. @clientA.emit "joinProject", {
  33. project_id: @project_id
  34. }, cb
  35. (cb) =>
  36. @clientA.emit "joinDoc", @doc_id, cb
  37. (cb) =>
  38. @clientB.emit "joinProject", {
  39. project_id: @project_id
  40. }, cb
  41. (cb) =>
  42. @clientB.emit "joinDoc", @doc_id, cb
  43. ], done
  44. describe "with an update from clientA", ->
  45. before (done) ->
  46. @clientAUpdates = []
  47. @clientA.on "otUpdateApplied", (update) => @clientAUpdates.push(update)
  48. @clientBUpdates = []
  49. @clientB.on "otUpdateApplied", (update) => @clientBUpdates.push(update)
  50. @update = {
  51. doc_id: @doc_id
  52. op:
  53. meta:
  54. source: @clientA.socket.sessionid
  55. v: @version
  56. doc: @doc_id
  57. op: [{i: "foo", p: 50}]
  58. }
  59. rclient.publish "applied-ops", JSON.stringify(@update)
  60. setTimeout done, 200 # Give clients time to get message
  61. it "should send the full op to clientB", ->
  62. @clientBUpdates.should.deep.equal [@update.op]
  63. it "should send an ack to clientA", ->
  64. @clientAUpdates.should.deep.equal [{
  65. v: @version, doc: @doc_id
  66. }]
  67. describe "with an error", ->
  68. before (done) ->
  69. @clientAErrors = []
  70. @clientA.on "otUpdateError", (error) => @clientAErrors.push(error)
  71. @clientBErrors = []
  72. @clientB.on "otUpdateError", (error) => @clientBErrors.push(error)
  73. rclient.publish "applied-ops", JSON.stringify({doc_id: @doc_id, error: @error = "something went wrong"})
  74. setTimeout done, 200 # Give clients time to get message
  75. it "should send the error to both clients", ->
  76. @clientAErrors.should.deep.equal [@error]
  77. @clientBErrors.should.deep.equal [@error]
  78. it "should disconnect the clients", ->
  79. @clientA.socket.connected.should.equal false
  80. @clientB.socket.connected.should.equal false