| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311 |
- sinon = require "sinon"
- chai = require("chai")
- chai.should()
- expect = chai.expect
- mongojs = require "../../../app/js/mongojs"
- ObjectId = mongojs.ObjectId
- Settings = require "settings-sharelatex"
- request = require "request"
- rclient = require("redis").createClient(Settings.redis.history) # Only works locally for now
- TrackChangesApp = require "./helpers/TrackChangesApp"
- TrackChangesClient = require "./helpers/TrackChangesClient"
- MockWebApi = require "./helpers/MockWebApi"
- describe "Appending doc ops to the history", ->
- before (done)->
- TrackChangesApp.ensureRunning done
- describe "when the history does not exist yet", ->
- before (done) ->
- @project_id = ObjectId().toString()
- @doc_id = ObjectId().toString()
- @user_id = ObjectId().toString()
- MockWebApi.projects[@project_id] = features: versioning: false
- TrackChangesClient.pushRawUpdates @project_id, @doc_id, [{
- op: [{ i: "f", p: 3 }]
- meta: { ts: Date.now(), user_id: @user_id }
- v: 3
- }, {
- op: [{ i: "o", p: 4 }]
- meta: { ts: Date.now(), user_id: @user_id }
- v: 4
- }, {
- op: [{ i: "o", p: 5 }]
- meta: { ts: Date.now(), user_id: @user_id }
- v: 5
- }], (error) =>
- throw error if error?
- TrackChangesClient.flushAndGetCompressedUpdates @project_id, @doc_id, (error, @updates) =>
- throw error if error?
- done()
- return null
- it "should insert the compressed op into mongo", ->
- expect(@updates[0].pack[0].op).to.deep.equal [{
- p: 3, i: "foo"
- }]
- it "should insert the correct version number into mongo", ->
- expect(@updates[0].v).to.equal 5
- it "should store the doc id", ->
- expect(@updates[0].doc_id.toString()).to.equal @doc_id
- it "should store the project id", ->
- expect(@updates[0].project_id.toString()).to.equal @project_id
- it "should clear the doc from the DocsWithHistoryOps set", (done) ->
- rclient.sismember "DocsWithHistoryOps:#{@project_id}", @doc_id, (error, member) ->
- member.should.equal 0
- done()
- return null
- describe "when the history has already been started", ->
- beforeEach (done) ->
- @project_id = ObjectId().toString()
- @doc_id = ObjectId().toString()
- @user_id = ObjectId().toString()
- MockWebApi.projects[@project_id] = features: versioning: false
- TrackChangesClient.pushRawUpdates @project_id, @doc_id, [{
- op: [{ i: "f", p: 3 }]
- meta: { ts: Date.now(), user_id: @user_id }
- v: 3
- }, {
- op: [{ i: "o", p: 4 }]
- meta: { ts: Date.now(), user_id: @user_id }
- v: 4
- }, {
- op: [{ i: "o", p: 5 }]
- meta: { ts: Date.now(), user_id: @user_id }
- v: 5
- }], (error) =>
- throw error if error?
- TrackChangesClient.flushAndGetCompressedUpdates @project_id, @doc_id, (error, updates) =>
- throw error if error?
- done()
- return null
- describe "when the updates are recent and from the same user", ->
- beforeEach (done) ->
- TrackChangesClient.pushRawUpdates @project_id, @doc_id, [{
- op: [{ i: "b", p: 6 }]
- meta: { ts: Date.now(), user_id: @user_id }
- v: 6
- }, {
- op: [{ i: "a", p: 7 }]
- meta: { ts: Date.now(), user_id: @user_id }
- v: 7
- }, {
- op: [{ i: "r", p: 8 }]
- meta: { ts: Date.now(), user_id: @user_id }
- v: 8
- }], (error) =>
- throw error if error?
- TrackChangesClient.flushAndGetCompressedUpdates @project_id, @doc_id, (error, @updates) =>
- throw error if error?
- done()
- return null
- it "should combine all the updates into one pack", ->
- expect(@updates[0].pack[1].op).to.deep.equal [{
- p: 6, i: "bar"
- }]
- it "should insert the correct version number into mongo", ->
- expect(@updates[0].v_end).to.equal 8
- describe "when the updates are far apart", ->
- beforeEach (done) ->
- oneDay = 24 * 60 * 60 * 1000
- TrackChangesClient.pushRawUpdates @project_id, @doc_id, [{
- op: [{ i: "b", p: 6 }]
- meta: { ts: Date.now() + oneDay, user_id: @user_id }
- v: 6
- }, {
- op: [{ i: "a", p: 7 }]
- meta: { ts: Date.now() + oneDay, user_id: @user_id }
- v: 7
- }, {
- op: [{ i: "r", p: 8 }]
- meta: { ts: Date.now() + oneDay, user_id: @user_id }
- v: 8
- }], (error) =>
- throw error if error?
- TrackChangesClient.flushAndGetCompressedUpdates @project_id, @doc_id, (error, @updates) =>
- throw error if error?
- done()
- return null
- it "should combine the updates into one pack", ->
- expect(@updates[0].pack[0].op).to.deep.equal [{
- p: 3, i: "foo"
- }]
- expect(@updates[0].pack[1].op).to.deep.equal [{
- p: 6, i: "bar"
- }]
- describe "when the updates need processing in batches", ->
- before (done) ->
- @project_id = ObjectId().toString()
- @doc_id = ObjectId().toString()
- @user_id = ObjectId().toString()
- MockWebApi.projects[@project_id] = features: versioning: false
- updates = []
- @expectedOp = [{ p:0, i: "" }]
- for i in [0..250]
- updates.push {
- op: [{i: "a", p: 0}]
- meta: { ts: Date.now(), user_id: @user_id }
- v: i
- }
- @expectedOp[0].i = "a" + @expectedOp[0].i
- TrackChangesClient.pushRawUpdates @project_id, @doc_id, updates, (error) =>
- throw error if error?
- TrackChangesClient.flushAndGetCompressedUpdates @project_id, @doc_id, (error, @updates) =>
- throw error if error?
- done()
- return null
- it "should concat the compressed op into mongo", ->
- expect(@updates[0].pack.length).to.deep.equal 3 # batch size is 100
- it "should insert the correct version number into mongo", ->
- expect(@updates[0].v_end).to.equal 250
- describe "when there are multiple ops in each update", ->
- before (done) ->
- @project_id = ObjectId().toString()
- @doc_id = ObjectId().toString()
- @user_id = ObjectId().toString()
- MockWebApi.projects[@project_id] = features: versioning: false
- oneDay = 24 * 60 * 60 * 1000
- TrackChangesClient.pushRawUpdates @project_id, @doc_id, [{
- op: [{ i: "f", p: 3 }, { i: "o", p: 4 }, { i: "o", p: 5 }]
- meta: { ts: Date.now(), user_id: @user_id }
- v: 3
- }, {
- op: [{ i: "b", p: 6 }, { i: "a", p: 7 }, { i: "r", p: 8 }]
- meta: { ts: Date.now() + oneDay, user_id: @user_id }
- v: 4
- }], (error) =>
- throw error if error?
- TrackChangesClient.flushAndGetCompressedUpdates @project_id, @doc_id, (error, @updates) =>
- throw error if error?
- done()
- return null
- it "should insert the compressed ops into mongo", ->
- expect(@updates[0].pack[0].op).to.deep.equal [{
- p: 3, i: "foo"
- }]
- expect(@updates[0].pack[1].op).to.deep.equal [{
- p: 6, i: "bar"
- }]
- it "should insert the correct version numbers into mongo", ->
- expect(@updates[0].pack[0].v).to.equal 3
- expect(@updates[0].pack[1].v).to.equal 4
- describe "when there is a no-op update", ->
- before (done) ->
- @project_id = ObjectId().toString()
- @doc_id = ObjectId().toString()
- @user_id = ObjectId().toString()
- MockWebApi.projects[@project_id] = features: versioning: false
- oneDay = 24 * 60 * 60 * 1000
- TrackChangesClient.pushRawUpdates @project_id, @doc_id, [{
- op: []
- meta: { ts: Date.now(), user_id: @user_id }
- v: 3
- }, {
- op: [{ i: "foo", p: 3 }]
- meta: { ts: Date.now() + oneDay, user_id: @user_id }
- v: 4
- }], (error) =>
- throw error if error?
- TrackChangesClient.flushAndGetCompressedUpdates @project_id, @doc_id, (error, @updates) =>
- throw error if error?
- done()
- return null
- it "should insert the compressed no-op into mongo", ->
- expect(@updates[0].pack[0].op).to.deep.equal []
- it "should insert the compressed next update into mongo", ->
- expect(@updates[0].pack[1].op).to.deep.equal [{
- p: 3, i: "foo"
- }]
- it "should insert the correct version numbers into mongo", ->
- expect(@updates[0].pack[0].v).to.equal 3
- expect(@updates[0].pack[1].v).to.equal 4
- describe "when there is a comment update", ->
- before (done) ->
- @project_id = ObjectId().toString()
- @doc_id = ObjectId().toString()
- @user_id = ObjectId().toString()
- MockWebApi.projects[@project_id] = features: versioning: false
- TrackChangesClient.pushRawUpdates @project_id, @doc_id, [{
- op: [{ c: "foo", p: 3 }, {d: "bar", p: 6}]
- meta: { ts: Date.now(), user_id: @user_id }
- v: 3
- }], (error) =>
- throw error if error?
- TrackChangesClient.flushAndGetCompressedUpdates @project_id, @doc_id, (error, @updates) =>
- throw error if error?
- done()
- return null
- it "should ignore the comment op", ->
- expect(@updates[0].pack[0].op).to.deep.equal [{d: "bar", p: 6}]
- it "should insert the correct version numbers into mongo", ->
- expect(@updates[0].pack[0].v).to.equal 3
- describe "when the project has versioning enabled", ->
- before (done) ->
- @project_id = ObjectId().toString()
- @doc_id = ObjectId().toString()
- @user_id = ObjectId().toString()
- MockWebApi.projects[@project_id] = features: versioning: true
- TrackChangesClient.pushRawUpdates @project_id, @doc_id, [{
- op: [{ i: "f", p: 3 }]
- meta: { ts: Date.now(), user_id: @user_id }
- v: 3
- }], (error) =>
- throw error if error?
- TrackChangesClient.flushAndGetCompressedUpdates @project_id, @doc_id, (error, @updates) =>
- throw error if error?
- done()
- return null
- it "should not add a expiresAt entry in the update in mongo", ->
- expect(@updates[0].expiresAt).to.be.undefined
- describe "when the project does not have versioning enabled", ->
- before (done) ->
- @project_id = ObjectId().toString()
- @doc_id = ObjectId().toString()
- @user_id = ObjectId().toString()
- MockWebApi.projects[@project_id] = features: versioning: false
- TrackChangesClient.pushRawUpdates @project_id, @doc_id, [{
- op: [{ i: "f", p: 3 }]
- meta: { ts: Date.now(), user_id: @user_id }
- v: 3
- }], (error) =>
- throw error if error?
- TrackChangesClient.flushAndGetCompressedUpdates @project_id, @doc_id, (error, @updates) =>
- throw error if error?
- done()
- return null
- it "should add a expiresAt entry in the update in mongo", ->
- expect(@updates[0].expiresAt).to.exist
|