|
|
@@ -3,8 +3,8 @@ chai = require("chai")
|
|
|
chai.should()
|
|
|
expect = chai.expect
|
|
|
async = require "async"
|
|
|
-rclient = require("redis").createClient()
|
|
|
-{db, ObjectId} = require "../../../app/js/mongojs"
|
|
|
+Settings = require('settings-sharelatex')
|
|
|
+rclient = require("redis-sharelatex").createClient(Settings.redis.web)
|
|
|
|
|
|
MockTrackChangesApi = require "./helpers/MockTrackChangesApi"
|
|
|
MockWebApi = require "./helpers/MockWebApi"
|
|
|
@@ -28,15 +28,10 @@ describe "Applying updates to a doc", ->
|
|
|
[@project_id, @doc_id] = [DocUpdaterClient.randomId(), DocUpdaterClient.randomId()]
|
|
|
sinon.spy MockWebApi, "getDocument"
|
|
|
|
|
|
- MockWebApi.insertDoc @project_id, @doc_id, lines: @lines
|
|
|
- db.docOps.insert {
|
|
|
- doc_id: ObjectId(@doc_id)
|
|
|
- version: @version
|
|
|
- }, (error) =>
|
|
|
+ MockWebApi.insertDoc @project_id, @doc_id, {lines: @lines, version: @version}
|
|
|
+ DocUpdaterClient.sendUpdate @project_id, @doc_id, @update, (error) ->
|
|
|
throw error if error?
|
|
|
- DocUpdaterClient.sendUpdate @project_id, @doc_id, @update, (error) ->
|
|
|
- throw error if error?
|
|
|
- setTimeout done, 200
|
|
|
+ setTimeout done, 200
|
|
|
|
|
|
after ->
|
|
|
MockWebApi.getDocument.restore()
|
|
|
@@ -65,15 +60,13 @@ describe "Applying updates to a doc", ->
|
|
|
before (done) ->
|
|
|
[@project_id, @doc_id] = [DocUpdaterClient.randomId(), DocUpdaterClient.randomId()]
|
|
|
|
|
|
- MockWebApi.insertDoc @project_id, @doc_id, lines: @lines
|
|
|
- db.docOps.insert doc_id: ObjectId(@doc_id), version: @version, (error) =>
|
|
|
+ MockWebApi.insertDoc @project_id, @doc_id, {lines: @lines, version: @version}
|
|
|
+ DocUpdaterClient.preloadDoc @project_id, @doc_id, (error) =>
|
|
|
throw error if error?
|
|
|
- DocUpdaterClient.preloadDoc @project_id, @doc_id, (error) =>
|
|
|
+ sinon.spy MockWebApi, "getDocument"
|
|
|
+ DocUpdaterClient.sendUpdate @project_id, @doc_id, @update, (error) ->
|
|
|
throw error if error?
|
|
|
- sinon.spy MockWebApi, "getDocument"
|
|
|
- DocUpdaterClient.sendUpdate @project_id, @doc_id, @update, (error) ->
|
|
|
- throw error if error?
|
|
|
- setTimeout done, 200
|
|
|
+ setTimeout done, 200
|
|
|
|
|
|
after ->
|
|
|
MockWebApi.getDocument.restore()
|
|
|
@@ -98,24 +91,22 @@ describe "Applying updates to a doc", ->
|
|
|
before (done) ->
|
|
|
[@project_id, @doc_id] = [DocUpdaterClient.randomId(), DocUpdaterClient.randomId()]
|
|
|
lines = ["", "", ""]
|
|
|
- MockWebApi.insertDoc @project_id, @doc_id, lines: lines
|
|
|
- db.docOps.insert doc_id: ObjectId(@doc_id), version: 0, (error) =>
|
|
|
- throw error if error?
|
|
|
- @updates = [
|
|
|
- { doc_id: @doc_id, v: 0, op: [i: "h", p: 0 ] }
|
|
|
- { doc_id: @doc_id, v: 1, op: [i: "e", p: 1 ] }
|
|
|
- { doc_id: @doc_id, v: 2, op: [i: "l", p: 2 ] }
|
|
|
- { doc_id: @doc_id, v: 3, op: [i: "l", p: 3 ] }
|
|
|
- { doc_id: @doc_id, v: 4, op: [i: "o", p: 4 ] }
|
|
|
- { doc_id: @doc_id, v: 5, op: [i: " ", p: 5 ] }
|
|
|
- { doc_id: @doc_id, v: 6, op: [i: "w", p: 6 ] }
|
|
|
- { doc_id: @doc_id, v: 7, op: [i: "o", p: 7 ] }
|
|
|
- { doc_id: @doc_id, v: 8, op: [i: "r", p: 8 ] }
|
|
|
- { doc_id: @doc_id, v: 9, op: [i: "l", p: 9 ] }
|
|
|
- { doc_id: @doc_id, v: 10, op: [i: "d", p: 10] }
|
|
|
- ]
|
|
|
- @my_result = ["hello world", "", ""]
|
|
|
- done()
|
|
|
+ MockWebApi.insertDoc @project_id, @doc_id, {lines: lines, version: 0}
|
|
|
+ @updates = [
|
|
|
+ { doc_id: @doc_id, v: 0, op: [i: "h", p: 0 ] }
|
|
|
+ { doc_id: @doc_id, v: 1, op: [i: "e", p: 1 ] }
|
|
|
+ { doc_id: @doc_id, v: 2, op: [i: "l", p: 2 ] }
|
|
|
+ { doc_id: @doc_id, v: 3, op: [i: "l", p: 3 ] }
|
|
|
+ { doc_id: @doc_id, v: 4, op: [i: "o", p: 4 ] }
|
|
|
+ { doc_id: @doc_id, v: 5, op: [i: " ", p: 5 ] }
|
|
|
+ { doc_id: @doc_id, v: 6, op: [i: "w", p: 6 ] }
|
|
|
+ { doc_id: @doc_id, v: 7, op: [i: "o", p: 7 ] }
|
|
|
+ { doc_id: @doc_id, v: 8, op: [i: "r", p: 8 ] }
|
|
|
+ { doc_id: @doc_id, v: 9, op: [i: "l", p: 9 ] }
|
|
|
+ { doc_id: @doc_id, v: 10, op: [i: "d", p: 10] }
|
|
|
+ ]
|
|
|
+ @my_result = ["hello world", "", ""]
|
|
|
+ done()
|
|
|
|
|
|
it "should be able to continue applying updates when the project has been deleted", (done) ->
|
|
|
actions = []
|
|
|
@@ -154,21 +145,17 @@ describe "Applying updates to a doc", ->
|
|
|
before (done) ->
|
|
|
[@project_id, @doc_id] = [DocUpdaterClient.randomId(), DocUpdaterClient.randomId()]
|
|
|
lines = ["", "", ""]
|
|
|
- MockWebApi.insertDoc @project_id, @doc_id, lines: lines
|
|
|
- db.docOps.insert doc_id: ObjectId(@doc_id), version: 0, (error) =>
|
|
|
- throw error if error?
|
|
|
-
|
|
|
- @updates = [
|
|
|
- { doc_id: @doc_id, v: 0, op: [i: "h", p: 0 ] }
|
|
|
- { doc_id: @doc_id, v: 1, op: [i: "e", p: 1 ] }
|
|
|
- { doc_id: @doc_id, v: 2, op: [i: "l", p: 2 ] }
|
|
|
- { doc_id: @doc_id, v: 3, op: [i: "l", p: 3 ] }
|
|
|
- { doc_id: @doc_id, v: 4, op: [i: "o", p: 4 ] }
|
|
|
- { doc_id: @doc_id, v: 0, op: [i: "world", p: 1 ] }
|
|
|
- ]
|
|
|
- @my_result = ["hello", "world", ""]
|
|
|
-
|
|
|
- done()
|
|
|
+ MockWebApi.insertDoc @project_id, @doc_id, {lines: lines, version: 0}
|
|
|
+ @updates = [
|
|
|
+ { doc_id: @doc_id, v: 0, op: [i: "h", p: 0 ] }
|
|
|
+ { doc_id: @doc_id, v: 1, op: [i: "e", p: 1 ] }
|
|
|
+ { doc_id: @doc_id, v: 2, op: [i: "l", p: 2 ] }
|
|
|
+ { doc_id: @doc_id, v: 3, op: [i: "l", p: 3 ] }
|
|
|
+ { doc_id: @doc_id, v: 4, op: [i: "o", p: 4 ] }
|
|
|
+ { doc_id: @doc_id, v: 0, op: [i: "world", p: 1 ] }
|
|
|
+ ]
|
|
|
+ @my_result = ["hello", "world", ""]
|
|
|
+ done()
|
|
|
|
|
|
it "should be able to continue applying updates when the project has been deleted", (done) ->
|
|
|
actions = []
|
|
|
@@ -189,12 +176,10 @@ describe "Applying updates to a doc", ->
|
|
|
describe "with a broken update", ->
|
|
|
before (done) ->
|
|
|
[@project_id, @doc_id] = [DocUpdaterClient.randomId(), DocUpdaterClient.randomId()]
|
|
|
- MockWebApi.insertDoc @project_id, @doc_id, lines: @lines
|
|
|
- db.docOps.insert doc_id: ObjectId(@doc_id), version: @version, (error) =>
|
|
|
+ MockWebApi.insertDoc @project_id, @doc_id, {lines: @lines, version: @version}
|
|
|
+ DocUpdaterClient.sendUpdate @project_id, @doc_id, @undefined, (error) ->
|
|
|
throw error if error?
|
|
|
- DocUpdaterClient.sendUpdate @project_id, @doc_id, @undefined, (error) ->
|
|
|
- throw error if error?
|
|
|
- setTimeout done, 200
|
|
|
+ setTimeout done, 200
|
|
|
|
|
|
it "should not update the doc", (done) ->
|
|
|
DocUpdaterClient.getDoc @project_id, @doc_id, (error, res, doc) =>
|
|
|
@@ -213,19 +198,17 @@ describe "Applying updates to a doc", ->
|
|
|
|
|
|
sinon.spy MockTrackChangesApi, "flushDoc"
|
|
|
|
|
|
- MockWebApi.insertDoc @project_id, @doc_id, lines: @lines
|
|
|
- db.docOps.insert doc_id: ObjectId(@doc_id), version: 0, (error) =>
|
|
|
+ MockWebApi.insertDoc @project_id, @doc_id, {lines: @lines, version: 0}
|
|
|
+
|
|
|
+ # Send updates in chunks to causes multiple flushes
|
|
|
+ actions = []
|
|
|
+ for i in [0..9]
|
|
|
+ do (i) =>
|
|
|
+ actions.push (cb) =>
|
|
|
+ DocUpdaterClient.sendUpdates @project_id, @doc_id, updates.slice(i*10, (i+1)*10), cb
|
|
|
+ async.series actions, (error) =>
|
|
|
throw error if error?
|
|
|
-
|
|
|
- # Send updates in chunks to causes multiple flushes
|
|
|
- actions = []
|
|
|
- for i in [0..9]
|
|
|
- do (i) =>
|
|
|
- actions.push (cb) =>
|
|
|
- DocUpdaterClient.sendUpdates @project_id, @doc_id, updates.slice(i*10, (i+1)*10), cb
|
|
|
- async.series actions, (error) =>
|
|
|
- throw error if error?
|
|
|
- setTimeout done, 2000
|
|
|
+ setTimeout done, 2000
|
|
|
|
|
|
after ->
|
|
|
MockTrackChangesApi.flushDoc.restore()
|
|
|
@@ -256,41 +239,37 @@ describe "Applying updates to a doc", ->
|
|
|
describe "when the sending duplicate ops", ->
|
|
|
before (done) ->
|
|
|
[@project_id, @doc_id] = [DocUpdaterClient.randomId(), DocUpdaterClient.randomId()]
|
|
|
- MockWebApi.insertDoc @project_id, @doc_id, lines: @lines
|
|
|
- db.docOps.insert {
|
|
|
- doc_id: ObjectId(@doc_id)
|
|
|
- version: @version
|
|
|
+ MockWebApi.insertDoc @project_id, @doc_id, {lines: @lines, version: @version}
|
|
|
+
|
|
|
+ DocUpdaterClient.subscribeToAppliedOps @messageCallback = sinon.stub()
|
|
|
+
|
|
|
+ # One user delete 'one', the next turns it into 'once'. The second becomes a NOP.
|
|
|
+ DocUpdaterClient.sendUpdate @project_id, @doc_id, {
|
|
|
+ doc: @doc_id
|
|
|
+ op: [{
|
|
|
+ i: "one and a half\n"
|
|
|
+ p: 4
|
|
|
+ }]
|
|
|
+ v: @version
|
|
|
+ meta:
|
|
|
+ source: "ikHceq3yfAdQYzBo4-xZ"
|
|
|
}, (error) =>
|
|
|
throw error if error?
|
|
|
- # One user delete 'one', the next turns it into 'once'. The second becomes a NOP.
|
|
|
- DocUpdaterClient.sendUpdate @project_id, @doc_id, {
|
|
|
- doc: @doc_id
|
|
|
- op: [{
|
|
|
- i: "one and a half\n"
|
|
|
- p: 4
|
|
|
- }]
|
|
|
- v: @version
|
|
|
- meta:
|
|
|
- source: "ikHceq3yfAdQYzBo4-xZ"
|
|
|
- }, (error) =>
|
|
|
- throw error if error?
|
|
|
- setTimeout () =>
|
|
|
- DocUpdaterClient.sendUpdate @project_id, @doc_id, {
|
|
|
- doc: @doc_id
|
|
|
- op: [{
|
|
|
- i: "one and a half\n"
|
|
|
- p: 4
|
|
|
- }]
|
|
|
- v: @version
|
|
|
- dupIfSource: ["ikHceq3yfAdQYzBo4-xZ"]
|
|
|
- meta:
|
|
|
- source: "ikHceq3yfAdQYzBo4-xZ"
|
|
|
- }, (error) =>
|
|
|
- throw error if error?
|
|
|
- setTimeout done, 200
|
|
|
- , 200
|
|
|
-
|
|
|
- DocUpdaterClient.subscribeToAppliedOps @messageCallback = sinon.stub()
|
|
|
+ setTimeout () =>
|
|
|
+ DocUpdaterClient.sendUpdate @project_id, @doc_id, {
|
|
|
+ doc: @doc_id
|
|
|
+ op: [{
|
|
|
+ i: "one and a half\n"
|
|
|
+ p: 4
|
|
|
+ }]
|
|
|
+ v: @version
|
|
|
+ dupIfSource: ["ikHceq3yfAdQYzBo4-xZ"]
|
|
|
+ meta:
|
|
|
+ source: "ikHceq3yfAdQYzBo4-xZ"
|
|
|
+ }, (error) =>
|
|
|
+ throw error if error?
|
|
|
+ setTimeout done, 200
|
|
|
+ , 200
|
|
|
|
|
|
it "should update the doc", (done) ->
|
|
|
DocUpdaterClient.getDoc @project_id, @doc_id, (error, res, doc) =>
|