|
@@ -1,12 +1,106 @@
|
|
|
|
|
+async = require "async"
|
|
|
|
|
+chai = require("chai")
|
|
|
|
|
+expect = chai.expect
|
|
|
|
|
+chai.should()
|
|
|
|
|
+
|
|
|
|
|
+RealTimeClient = require "./helpers/RealTimeClient"
|
|
|
|
|
+FixturesManager = require "./helpers/FixturesManager"
|
|
|
|
|
+
|
|
|
|
|
+settings = require "settings-sharelatex"
|
|
|
|
|
+redis = require "redis-sharelatex"
|
|
|
|
|
+rclient = redis.createClient(settings.redis.web)
|
|
|
|
|
+
|
|
|
describe "applyOtUpdate", ->
|
|
describe "applyOtUpdate", ->
|
|
|
|
|
+ before ->
|
|
|
|
|
+ @update = {
|
|
|
|
|
+ op: [{i: "foo", p: 42}]
|
|
|
|
|
+ }
|
|
|
describe "when authorized", ->
|
|
describe "when authorized", ->
|
|
|
- it "should publish a message on redis"
|
|
|
|
|
|
|
+ before (done) ->
|
|
|
|
|
+ async.series [
|
|
|
|
|
+ (cb) =>
|
|
|
|
|
+ FixturesManager.setUpProject {
|
|
|
|
|
+ privilegeLevel: "readAndWrite"
|
|
|
|
|
+ }, (e, {@project_id, @user_id}) =>
|
|
|
|
|
+ cb(e)
|
|
|
|
|
+
|
|
|
|
|
+ (cb) =>
|
|
|
|
|
+ FixturesManager.setUpDoc @project_id, {@lines, @version, @ops}, (e, {@doc_id}) =>
|
|
|
|
|
+ cb(e)
|
|
|
|
|
+
|
|
|
|
|
+ (cb) =>
|
|
|
|
|
+ @client = RealTimeClient.connect()
|
|
|
|
|
+ @client.emit "joinProject", project_id: @project_id, cb
|
|
|
|
|
+
|
|
|
|
|
+ (cb) =>
|
|
|
|
|
+ @client.emit "joinDoc", @doc_id, cb
|
|
|
|
|
+
|
|
|
|
|
+ (cb) =>
|
|
|
|
|
+ @client.emit "applyOtUpdate", @doc_id, @update, cb
|
|
|
|
|
+ ], done
|
|
|
|
|
|
|
|
- it "should add the doc to the pending updates set in redis"
|
|
|
|
|
|
|
+ it "should push the doc into the pending updates list", (done) ->
|
|
|
|
|
+ rclient.lrange "pending-updates-list", 0, -1, (error, [doc_id]) =>
|
|
|
|
|
+ doc_id.should.equal "#{@project_id}:#{@doc_id}"
|
|
|
|
|
+ done()
|
|
|
|
|
|
|
|
- it "should push the update into redis"
|
|
|
|
|
|
|
+ it "should add the doc to the pending updates set in redis", (done) ->
|
|
|
|
|
+ rclient.sismember "DocsWithPendingUpdates", "#{@project_id}:#{@doc_id}", (error, isMember) =>
|
|
|
|
|
+ isMember.should.equal 1
|
|
|
|
|
+ done()
|
|
|
|
|
+
|
|
|
|
|
+ it "should push the update into redis", (done) ->
|
|
|
|
|
+ rclient.lrange "PendingUpdates:#{@doc_id}", 0, -1, (error, [update]) =>
|
|
|
|
|
+ update = JSON.parse(update)
|
|
|
|
|
+ update.op.should.deep.equal @update.op
|
|
|
|
|
+ update.meta.should.deep.equal {
|
|
|
|
|
+ source: @client.socket.sessionid
|
|
|
|
|
+ user_id: @user_id
|
|
|
|
|
+ }
|
|
|
|
|
+ done()
|
|
|
|
|
+
|
|
|
|
|
+ after (done) ->
|
|
|
|
|
+ async.series [
|
|
|
|
|
+ (cb) => rclient.del "pending-updates-list", cb
|
|
|
|
|
+ (cb) => rclient.del "DocsWithPendingUpdates", "#{@project_id}:#{@doc_id}", cb
|
|
|
|
|
+ (cb) => rclient.del "PendingUpdates:#{@doc_id}", cb
|
|
|
|
|
+ ], done
|
|
|
|
|
|
|
|
describe "when not authorized", ->
|
|
describe "when not authorized", ->
|
|
|
- it "should return an error"
|
|
|
|
|
|
|
+ before (done) ->
|
|
|
|
|
+ async.series [
|
|
|
|
|
+ (cb) =>
|
|
|
|
|
+ FixturesManager.setUpProject {
|
|
|
|
|
+ privilegeLevel: "readOnly"
|
|
|
|
|
+ }, (e, {@project_id, @user_id}) =>
|
|
|
|
|
+ cb(e)
|
|
|
|
|
+
|
|
|
|
|
+ (cb) =>
|
|
|
|
|
+ FixturesManager.setUpDoc @project_id, {@lines, @version, @ops}, (e, {@doc_id}) =>
|
|
|
|
|
+ cb(e)
|
|
|
|
|
+
|
|
|
|
|
+ (cb) =>
|
|
|
|
|
+ @client = RealTimeClient.connect()
|
|
|
|
|
+ @client.emit "joinProject", project_id: @project_id, cb
|
|
|
|
|
+
|
|
|
|
|
+ (cb) =>
|
|
|
|
|
+ @client.emit "joinDoc", @doc_id, cb
|
|
|
|
|
+
|
|
|
|
|
+ (cb) =>
|
|
|
|
|
+ @client.emit "applyOtUpdate", @doc_id, @update, (@error) =>
|
|
|
|
|
+ cb()
|
|
|
|
|
+ ], done
|
|
|
|
|
+
|
|
|
|
|
+ it "should return an error", ->
|
|
|
|
|
+ expect(@error).to.exist
|
|
|
|
|
|
|
|
- it "should disconnect the client"
|
|
|
|
|
|
|
+ it "should disconnect the client", (done) ->
|
|
|
|
|
+ setTimeout () =>
|
|
|
|
|
+ @client.socket.connected.should.equal false
|
|
|
|
|
+ done()
|
|
|
|
|
+ , 300
|
|
|
|
|
+
|
|
|
|
|
+ it "should not put the update in redis", (done) ->
|
|
|
|
|
+ rclient.llen "PendingUpdates:#{@doc_id}", (error, len) =>
|
|
|
|
|
+ len.should.equal 0
|
|
|
|
|
+ done()
|