ApplyUpdateTests.coffee 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. async = require "async"
  2. chai = require("chai")
  3. expect = chai.expect
  4. chai.should()
  5. RealTimeClient = require "./helpers/RealTimeClient"
  6. FixturesManager = require "./helpers/FixturesManager"
  7. settings = require "settings-sharelatex"
  8. redis = require "redis-sharelatex"
  9. rclient = redis.createClient(settings.redis.web)
  10. describe "applyOtUpdate", ->
  11. before ->
  12. @update = {
  13. op: [{i: "foo", p: 42}]
  14. }
  15. describe "when authorized", ->
  16. before (done) ->
  17. async.series [
  18. (cb) =>
  19. FixturesManager.setUpProject {
  20. privilegeLevel: "readAndWrite"
  21. }, (e, {@project_id, @user_id}) =>
  22. cb(e)
  23. (cb) =>
  24. FixturesManager.setUpDoc @project_id, {@lines, @version, @ops}, (e, {@doc_id}) =>
  25. cb(e)
  26. (cb) =>
  27. @client = RealTimeClient.connect()
  28. @client.on "connectionAccepted", cb
  29. (cb) =>
  30. @client.emit "joinProject", project_id: @project_id, cb
  31. (cb) =>
  32. @client.emit "joinDoc", @doc_id, cb
  33. (cb) =>
  34. @client.emit "applyOtUpdate", @doc_id, @update, cb
  35. ], done
  36. it "should push the doc into the pending updates list", (done) ->
  37. rclient.lrange "pending-updates-list", 0, -1, (error, [doc_id]) =>
  38. doc_id.should.equal "#{@project_id}:#{@doc_id}"
  39. done()
  40. it "should push the update into redis", (done) ->
  41. rclient.lrange "PendingUpdates:#{@doc_id}", 0, -1, (error, [update]) =>
  42. update = JSON.parse(update)
  43. update.op.should.deep.equal @update.op
  44. update.meta.should.deep.equal {
  45. source: @client.socket.sessionid
  46. user_id: @user_id
  47. }
  48. done()
  49. after (done) ->
  50. async.series [
  51. (cb) => rclient.del "pending-updates-list", cb
  52. (cb) => rclient.del "DocsWithPendingUpdates", "#{@project_id}:#{@doc_id}", cb
  53. (cb) => rclient.del "PendingUpdates:#{@doc_id}", cb
  54. ], done
  55. describe "when authorized to read-only with an edit update", ->
  56. before (done) ->
  57. async.series [
  58. (cb) =>
  59. FixturesManager.setUpProject {
  60. privilegeLevel: "readOnly"
  61. }, (e, {@project_id, @user_id}) =>
  62. cb(e)
  63. (cb) =>
  64. FixturesManager.setUpDoc @project_id, {@lines, @version, @ops}, (e, {@doc_id}) =>
  65. cb(e)
  66. (cb) =>
  67. @client = RealTimeClient.connect()
  68. @client.on "connectionAccepted", cb
  69. (cb) =>
  70. @client.emit "joinProject", project_id: @project_id, cb
  71. (cb) =>
  72. @client.emit "joinDoc", @doc_id, cb
  73. (cb) =>
  74. @client.emit "applyOtUpdate", @doc_id, @update, (@error) =>
  75. cb()
  76. ], done
  77. it "should return an error", ->
  78. expect(@error).to.exist
  79. it "should disconnect the client", (done) ->
  80. setTimeout () =>
  81. @client.socket.connected.should.equal false
  82. done()
  83. , 300
  84. it "should not put the update in redis", (done) ->
  85. rclient.llen "PendingUpdates:#{@doc_id}", (error, len) =>
  86. len.should.equal 0
  87. done()
  88. describe "when authorized to read-only with a comment update", ->
  89. before (done) ->
  90. @comment_update = {
  91. op: [{c: "foo", p: 42}]
  92. }
  93. async.series [
  94. (cb) =>
  95. FixturesManager.setUpProject {
  96. privilegeLevel: "readOnly"
  97. }, (e, {@project_id, @user_id}) =>
  98. cb(e)
  99. (cb) =>
  100. FixturesManager.setUpDoc @project_id, {@lines, @version, @ops}, (e, {@doc_id}) =>
  101. cb(e)
  102. (cb) =>
  103. @client = RealTimeClient.connect()
  104. @client.on "connectionAccepted", cb
  105. (cb) =>
  106. @client.emit "joinProject", project_id: @project_id, cb
  107. (cb) =>
  108. @client.emit "joinDoc", @doc_id, cb
  109. (cb) =>
  110. @client.emit "applyOtUpdate", @doc_id, @comment_update, cb
  111. ], done
  112. it "should push the doc into the pending updates list", (done) ->
  113. rclient.lrange "pending-updates-list", 0, -1, (error, [doc_id]) =>
  114. doc_id.should.equal "#{@project_id}:#{@doc_id}"
  115. done()
  116. it "should push the update into redis", (done) ->
  117. rclient.lrange "PendingUpdates:#{@doc_id}", 0, -1, (error, [update]) =>
  118. update = JSON.parse(update)
  119. update.op.should.deep.equal @comment_update.op
  120. update.meta.should.deep.equal {
  121. source: @client.socket.sessionid
  122. user_id: @user_id
  123. }
  124. done()
  125. after (done) ->
  126. async.series [
  127. (cb) => rclient.del "pending-updates-list", cb
  128. (cb) => rclient.del "DocsWithPendingUpdates", "#{@project_id}:#{@doc_id}", cb
  129. (cb) => rclient.del "PendingUpdates:#{@doc_id}", cb
  130. ], done