Big refactor to use better names and separation of concerns
This commit is contained in:
-87
@@ -1,87 +0,0 @@
|
||||
sinon = require('sinon')
|
||||
chai = require('chai')
|
||||
should = chai.should()
|
||||
expect = chai.expect
|
||||
modulePath = "../../../../app/js/ConversionManager.js"
|
||||
SandboxedModule = require('sandboxed-module')
|
||||
|
||||
describe "ConversionManager", ->
|
||||
beforeEach ->
|
||||
@ConversionManager = SandboxedModule.require modulePath, requires:
|
||||
"./HistoryBuilder": @HistoryBuilder = {}
|
||||
"./mongojs" : {}
|
||||
"logger-sharelatex": { log: sinon.stub() }
|
||||
@doc_id = "doc-id-123"
|
||||
@callback = sinon.stub()
|
||||
|
||||
describe "when there are no raw ops", ->
|
||||
beforeEach ->
|
||||
@ConversionManager.popLastCompressedOp = sinon.stub()
|
||||
@ConversionManager.insertCompressedOps = sinon.stub()
|
||||
@ConversionManager.convertAndSaveRawOps @doc_id, [], @callback
|
||||
|
||||
it "should not need to access the database", ->
|
||||
@ConversionManager.popLastCompressedOp.called.should.equal false
|
||||
@ConversionManager.insertCompressedOps.called.should.equal false
|
||||
|
||||
it "should call the callback", ->
|
||||
@callback.called.should.equal true
|
||||
|
||||
describe "when there is no compressed history to begin with", ->
|
||||
beforeEach ->
|
||||
@rawOps = ["mock-raw-op-1", "mock-raw-op-2"]
|
||||
@compressedOps = ["mock-compressed-op"]
|
||||
|
||||
@ConversionManager.popLastCompressedOp = sinon.stub().callsArgWith(1, null, null)
|
||||
@ConversionManager.insertCompressedOps = sinon.stub().callsArg(2)
|
||||
@HistoryBuilder.compressOps = sinon.stub().returns(@compressedOps)
|
||||
@ConversionManager.convertAndSaveRawOps @doc_id, @rawOps, @callback
|
||||
|
||||
it "should try to pop the last compressed op", ->
|
||||
@ConversionManager.popLastCompressedOp
|
||||
.calledWith(@doc_id)
|
||||
.should.equal true
|
||||
|
||||
it "should compress the raw ops", ->
|
||||
@HistoryBuilder.compressOps
|
||||
.calledWith(@rawOps)
|
||||
.should.equal true
|
||||
|
||||
it "should save the compressed ops", ->
|
||||
@ConversionManager.insertCompressedOps
|
||||
.calledWith(@doc_id, @compressedOps)
|
||||
.should.equal true
|
||||
|
||||
it "should call the callback", ->
|
||||
@callback.called.should.equal true
|
||||
|
||||
describe "when the raw ops need appending to existing history", ->
|
||||
beforeEach ->
|
||||
@rawOps = ["mock-raw-op-1", "mock-raw-op-2"]
|
||||
@lastCompressedOp = "mock-last-compressed-op-0"
|
||||
@compressedOps = ["mock-compressed-op-1"]
|
||||
|
||||
@ConversionManager.popLastCompressedOp = sinon.stub().callsArgWith(1, null, @lastCompressedOp)
|
||||
@ConversionManager.insertCompressedOps = sinon.stub().callsArg(2)
|
||||
@HistoryBuilder.compressOps = sinon.stub().returns(@compressedOps)
|
||||
@ConversionManager.convertAndSaveRawOps @doc_id, @rawOps, @callback
|
||||
|
||||
it "should try to pop the last compressed op", ->
|
||||
@ConversionManager.popLastCompressedOp
|
||||
.calledWith(@doc_id)
|
||||
.should.equal true
|
||||
|
||||
it "should compress the last compressed op and the raw ops", ->
|
||||
@HistoryBuilder.compressOps
|
||||
.calledWith([@lastCompressedOp].concat(@rawOps))
|
||||
.should.equal true
|
||||
|
||||
it "should save the compressed ops", ->
|
||||
@ConversionManager.insertCompressedOps
|
||||
.calledWith(@doc_id, @compressedOps)
|
||||
.should.equal true
|
||||
|
||||
it "should call the callback", ->
|
||||
@callback.called.should.equal true
|
||||
|
||||
|
||||
@@ -1,240 +0,0 @@
|
||||
sinon = require('sinon')
|
||||
chai = require('chai')
|
||||
should = chai.should()
|
||||
expect = chai.expect
|
||||
modulePath = "../../../../app/js/HistoryBuilder.js"
|
||||
SandboxedModule = require('sandboxed-module')
|
||||
|
||||
describe "HistoryBuilder", ->
|
||||
beforeEach ->
|
||||
@HistoryBuilder = SandboxedModule.require modulePath
|
||||
@user_id = "user-id-1"
|
||||
@other_user_id = "user-id-2"
|
||||
@ts1 = Date.now()
|
||||
@ts2 = Date.now() + 1000
|
||||
|
||||
describe "compress", ->
|
||||
describe "insert - insert", ->
|
||||
it "should append one insert to the other", ->
|
||||
expect(@HistoryBuilder.compressUpdates [{
|
||||
op: [ p: 3, i: "foo" ]
|
||||
meta: ts: @ts1, user_id: @user_id
|
||||
}, {
|
||||
op: [ p: 6, i: "bar" ]
|
||||
meta: ts: @ts2, user_id: @user_id
|
||||
}])
|
||||
.to.deep.equal [{
|
||||
op: [ p: 3, i: "foobar" ]
|
||||
meta: start_ts: @ts1, end_ts: @ts2, user_id: @user_id
|
||||
}]
|
||||
|
||||
it "should insert one insert inside the other", ->
|
||||
expect(@HistoryBuilder.compressUpdates [{
|
||||
op: [ p: 3, i: "foo" ]
|
||||
meta: ts: @ts1, user_id: @user_id
|
||||
}, {
|
||||
op: [ p: 5, i: "bar" ]
|
||||
meta: ts: @ts2, user_id: @user_id
|
||||
}])
|
||||
.to.deep.equal [{
|
||||
op: [ p: 3, i: "fobaro" ]
|
||||
meta: start_ts: @ts1, end_ts: @ts2, user_id: @user_id
|
||||
}]
|
||||
|
||||
it "should not append separated inserts", ->
|
||||
expect(@HistoryBuilder.compressUpdates [{
|
||||
op: [ p: 3, i: "foo" ]
|
||||
meta: ts: @ts1, user_id: @user_id
|
||||
}, {
|
||||
op: [ p: 9, i: "bar" ]
|
||||
meta: ts: @ts2, user_id: @user_id
|
||||
}])
|
||||
.to.deep.equal [{
|
||||
op: [ p: 3, i: "foo" ]
|
||||
meta: start_ts: @ts1, end_ts: @ts1, user_id: @user_id
|
||||
}, {
|
||||
op: [ p: 9, i: "bar" ]
|
||||
meta: start_ts: @ts2, end_ts: @ts2, user_id: @user_id
|
||||
}]
|
||||
|
||||
describe "delete - delete", ->
|
||||
it "should append one delete to the other", ->
|
||||
expect(@HistoryBuilder.compressUpdates [{
|
||||
op: [ p: 3, d: "foo" ]
|
||||
meta: ts: @ts1, user_id: @user_id
|
||||
}, {
|
||||
op: [ p: 3, d: "bar" ]
|
||||
meta: ts: @ts2, user_id: @user_id
|
||||
}])
|
||||
.to.deep.equal [{
|
||||
op: [ p: 3, d: "foobar" ]
|
||||
meta: start_ts: @ts1, end_ts: @ts2, user_id: @user_id
|
||||
}]
|
||||
|
||||
it "should insert one delete inside the other", ->
|
||||
expect(@HistoryBuilder.compressUpdates [{
|
||||
op: [ p: 3, d: "foo" ]
|
||||
meta: ts: @ts1, user_id: @user_id
|
||||
}, {
|
||||
op: [ p: 1, d: "bar" ]
|
||||
meta: ts: @ts2, user_id: @user_id
|
||||
}])
|
||||
.to.deep.equal [{
|
||||
op: [ p: 1, d: "bafoor" ]
|
||||
meta: start_ts: @ts1, end_ts: @ts2, user_id: @user_id
|
||||
}]
|
||||
|
||||
it "should not append separated deletes", ->
|
||||
expect(@HistoryBuilder.compressUpdates [{
|
||||
op: [ p: 3, d: "foo" ]
|
||||
meta: ts: @ts1, user_id: @user_id
|
||||
}, {
|
||||
op: [ p: 9, d: "bar" ]
|
||||
meta: ts: @ts2, user_id: @user_id
|
||||
}])
|
||||
.to.deep.equal [{
|
||||
op: [ p: 3, d: "foo" ]
|
||||
meta: start_ts: @ts1, end_ts: @ts1, user_id: @user_id
|
||||
}, {
|
||||
op: [ p: 9, d: "bar" ]
|
||||
meta: start_ts: @ts2, end_ts: @ts2, user_id: @user_id
|
||||
}]
|
||||
|
||||
describe "insert - delete", ->
|
||||
it "should undo a previous insert", ->
|
||||
expect(@HistoryBuilder.compressUpdates [{
|
||||
op: [ p: 3, i: "foo" ]
|
||||
meta: ts: @ts1, user_id: @user_id
|
||||
}, {
|
||||
op: [ p: 5, d: "o" ]
|
||||
meta: ts: @ts2, user_id: @user_id
|
||||
}])
|
||||
.to.deep.equal [{
|
||||
op: [ p: 3, i: "fo" ]
|
||||
meta: start_ts: @ts1, end_ts: @ts2, user_id: @user_id
|
||||
}]
|
||||
|
||||
it "should remove part of an insert from the middle", ->
|
||||
expect(@HistoryBuilder.compressUpdates [{
|
||||
op: [ p: 3, i: "fobaro" ]
|
||||
meta: ts: @ts1, user_id: @user_id
|
||||
}, {
|
||||
op: [ p: 5, d: "bar" ]
|
||||
meta: ts: @ts2, user_id: @user_id
|
||||
}])
|
||||
.to.deep.equal [{
|
||||
op: [ p: 3, i: "foo" ]
|
||||
meta: start_ts: @ts1, end_ts: @ts2, user_id: @user_id
|
||||
}]
|
||||
|
||||
it "should cancel out two opposite updates", ->
|
||||
expect(@HistoryBuilder.compressUpdates [{
|
||||
op: [ p: 3, i: "foo" ]
|
||||
meta: ts: @ts1, user_id: @user_id
|
||||
}, {
|
||||
op: [ p: 3, d: "foo" ]
|
||||
meta: ts: @ts2, user_id: @user_id
|
||||
}])
|
||||
.to.deep.equal []
|
||||
|
||||
it "should not combine separated updates", ->
|
||||
expect(@HistoryBuilder.compressUpdates [{
|
||||
op: [ p: 3, i: "foo" ]
|
||||
meta: ts: @ts1, user_id: @user_id
|
||||
}, {
|
||||
op: [ p: 9, d: "bar" ]
|
||||
meta: ts: @ts2, user_id: @user_id
|
||||
}])
|
||||
.to.deep.equal [{
|
||||
op: [ p: 3, i: "foo" ]
|
||||
meta: start_ts: @ts1, end_ts: @ts1, user_id: @user_id
|
||||
}, {
|
||||
op: [ p: 9, d: "bar" ]
|
||||
meta: start_ts: @ts2, end_ts: @ts2, user_id: @user_id
|
||||
}]
|
||||
|
||||
describe "delete - insert", ->
|
||||
it "should redo a previous delete at the beginning", ->
|
||||
expect(@HistoryBuilder.compressUpdates [{
|
||||
op: [ p: 3, d: "foo" ]
|
||||
meta: ts: @ts1, user_id: @user_id
|
||||
}, {
|
||||
op: [ p: 3, i: "f" ]
|
||||
meta: ts: @ts2, user_id: @user_id
|
||||
}])
|
||||
.to.deep.equal [{
|
||||
op: [ p: 4, d: "oo" ]
|
||||
meta: start_ts: @ts1, end_ts: @ts2, user_id: @user_id
|
||||
}]
|
||||
|
||||
it "should redo a previous delete from halfway through", ->
|
||||
expect(@HistoryBuilder.compressUpdates [{
|
||||
op: [ p: 3, d: "foobar" ]
|
||||
meta: ts: @ts1, user_id: @user_id
|
||||
}, {
|
||||
op: [ p: 3, i: "oo" ]
|
||||
meta: ts: @ts2, user_id: @user_id
|
||||
}])
|
||||
.to.deep.equal [{
|
||||
op: [ p: 3, d: "f" ]
|
||||
meta: start_ts: @ts1, end_ts: @ts1, user_id: @user_id
|
||||
}, {
|
||||
op: [ p: 5, d: "bar" ]
|
||||
meta: start_ts: @ts2, end_ts: @ts2, user_id: @user_id
|
||||
}]
|
||||
|
||||
it "should keep words together", ->
|
||||
expect(@HistoryBuilder.compressUpdates [{
|
||||
op: [ p: 3, d: "abcdefghijklmnopqrstuvwxyz hello world" ]
|
||||
meta: ts: @ts1, user_id: @user_id
|
||||
}, {
|
||||
op: [ p: 3, i: "w" ]
|
||||
meta: ts: @ts2, user_id: @user_id
|
||||
}, {
|
||||
op: [ p: 4, i: "o" ]
|
||||
meta: ts: @ts2, user_id: @user_id
|
||||
}, {
|
||||
op: [ p: 5, i: "r" ]
|
||||
meta: ts: @ts2, user_id: @user_id
|
||||
}, {
|
||||
op: [ p: 6, i: "l" ]
|
||||
meta: ts: @ts2, user_id: @user_id
|
||||
}, {
|
||||
op: [ p: 7, i: "d" ]
|
||||
meta: ts: @ts2, user_id: @user_id
|
||||
}])
|
||||
.to.deep.equal [{
|
||||
op: [ p: 3, d: "abcdefghijklmnopqrstuvwxyz hello " ]
|
||||
meta: start_ts: @ts1, end_ts: @ts2, user_id: @user_id
|
||||
}]
|
||||
|
||||
|
||||
it "should not combine the ops if the insert text does not match the delete text", ->
|
||||
expect(@HistoryBuilder.compressUpdates [{
|
||||
op: [ p: 3, d: "foobar" ]
|
||||
meta: ts: @ts1, user_id: @user_id
|
||||
}, {
|
||||
op: [ p: 3, i: "xy" ]
|
||||
meta: ts: @ts2, user_id: @user_id
|
||||
}])
|
||||
.to.deep.equal [{
|
||||
op: [ p: 3, d: "foobar" ]
|
||||
meta: start_ts: @ts1, end_ts: @ts1, user_id: @user_id
|
||||
}, {
|
||||
op: [ p: 3, i: "xy" ]
|
||||
meta: start_ts: @ts2, end_ts: @ts2, user_id: @user_id
|
||||
}]
|
||||
|
||||
it "should cancel two equal updates", ->
|
||||
expect(@HistoryBuilder.compressUpdates [{
|
||||
op: [ p: 3, d: "foo" ]
|
||||
meta: ts: @ts1, user_id: @user_id
|
||||
}, {
|
||||
op: [ p: 3, i: "foo" ]
|
||||
meta: ts: @ts2, user_id: @user_id
|
||||
}])
|
||||
.to.deep.equal []
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,87 @@
|
||||
sinon = require('sinon')
|
||||
chai = require('chai')
|
||||
should = chai.should()
|
||||
expect = chai.expect
|
||||
modulePath = "../../../../app/js/HistoryManager.js"
|
||||
SandboxedModule = require('sandboxed-module')
|
||||
|
||||
describe "HistoryManager", ->
|
||||
beforeEach ->
|
||||
@HistoryManager = SandboxedModule.require modulePath, requires:
|
||||
"./UpdateCompressor": @UpdateCompressor = {}
|
||||
"./mongojs" : {}
|
||||
"logger-sharelatex": { log: sinon.stub() }
|
||||
@doc_id = "doc-id-123"
|
||||
@callback = sinon.stub()
|
||||
|
||||
describe "when there are no raw ops", ->
|
||||
beforeEach ->
|
||||
@HistoryManager.popLastCompressedUpdate = sinon.stub()
|
||||
@HistoryManager.insertCompressedUpdates = sinon.stub()
|
||||
@HistoryManager.compressAndSaveRawUpdates @doc_id, [], @callback
|
||||
|
||||
it "should not need to access the database", ->
|
||||
@HistoryManager.popLastCompressedUpdate.called.should.equal false
|
||||
@HistoryManager.insertCompressedUpdates.called.should.equal false
|
||||
|
||||
it "should call the callback", ->
|
||||
@callback.called.should.equal true
|
||||
|
||||
describe "when there is no compressed history to begin with", ->
|
||||
beforeEach ->
|
||||
@rawUpdates = ["mock-raw-op-1", "mock-raw-op-2"]
|
||||
@compressedUpdates = ["mock-compressed-op"]
|
||||
|
||||
@HistoryManager.popLastCompressedUpdate = sinon.stub().callsArgWith(1, null, null)
|
||||
@HistoryManager.insertCompressedUpdates = sinon.stub().callsArg(2)
|
||||
@UpdateCompressor.compressRawUpdates = sinon.stub().returns(@compressedUpdates)
|
||||
@HistoryManager.compressAndSaveRawUpdates @doc_id, @rawUpdates, @callback
|
||||
|
||||
it "should try to pop the last compressed op", ->
|
||||
@HistoryManager.popLastCompressedUpdate
|
||||
.calledWith(@doc_id)
|
||||
.should.equal true
|
||||
|
||||
it "should compress the raw ops", ->
|
||||
@UpdateCompressor.compressRawUpdates
|
||||
.calledWith(null, @rawUpdates)
|
||||
.should.equal true
|
||||
|
||||
it "should save the compressed ops", ->
|
||||
@HistoryManager.insertCompressedUpdates
|
||||
.calledWith(@doc_id, @compressedUpdates)
|
||||
.should.equal true
|
||||
|
||||
it "should call the callback", ->
|
||||
@callback.called.should.equal true
|
||||
|
||||
describe "when the raw ops need appending to existing history", ->
|
||||
beforeEach ->
|
||||
@rawUpdates = ["mock-raw-op-1", "mock-raw-op-2"]
|
||||
@lastCompressedUpdate = "mock-last-compressed-op-0"
|
||||
@compressedUpdates = ["mock-compressed-op-1"]
|
||||
|
||||
@HistoryManager.popLastCompressedUpdate = sinon.stub().callsArgWith(1, null, @lastCompressedUpdate)
|
||||
@HistoryManager.insertCompressedUpdates = sinon.stub().callsArg(2)
|
||||
@UpdateCompressor.compressRawUpdates = sinon.stub().returns(@compressedUpdates)
|
||||
@HistoryManager.compressAndSaveRawUpdates @doc_id, @rawUpdates, @callback
|
||||
|
||||
it "should try to pop the last compressed op", ->
|
||||
@HistoryManager.popLastCompressedUpdate
|
||||
.calledWith(@doc_id)
|
||||
.should.equal true
|
||||
|
||||
it "should compress the last compressed op and the raw ops", ->
|
||||
@UpdateCompressor.compressRawUpdates
|
||||
.calledWith(@lastCompressedUpdate, @rawUpdates)
|
||||
.should.equal true
|
||||
|
||||
it "should save the compressed ops", ->
|
||||
@HistoryManager.insertCompressedUpdates
|
||||
.calledWith(@doc_id, @compressedUpdates)
|
||||
.should.equal true
|
||||
|
||||
it "should call the callback", ->
|
||||
@callback.called.should.equal true
|
||||
|
||||
|
||||
+176
@@ -0,0 +1,176 @@
|
||||
sinon = require('sinon')
|
||||
chai = require('chai')
|
||||
should = chai.should()
|
||||
expect = chai.expect
|
||||
modulePath = "../../../../app/js/UpdateCompressor.js"
|
||||
SandboxedModule = require('sandboxed-module')
|
||||
|
||||
describe "UpdateCompressor", ->
|
||||
beforeEach ->
|
||||
@UpdateCompressor = SandboxedModule.require modulePath
|
||||
@user_id = "user-id-1"
|
||||
@other_user_id = "user-id-2"
|
||||
@ts1 = Date.now()
|
||||
@ts2 = Date.now() + 1000
|
||||
|
||||
describe "convertRawUpdatesToCompressedFormat", ->
|
||||
it "should split grouped updates into individual updates", ->
|
||||
expect(@UpdateCompressor.convertRawUpdatesToCompressedFormat [{
|
||||
op: [ @op1 = { p: 0, i: "Foo" }, @op2 = { p: 6, i: "bar"} ]
|
||||
meta: { ts: @ts1, user_id: @user_id }
|
||||
}, {
|
||||
op: [ @op3 = { p: 10, i: "baz" } ]
|
||||
meta: { ts: @ts2, user_id: @other_user_id }
|
||||
}])
|
||||
.to.deep.equal [{
|
||||
op: @op1,
|
||||
meta: { start_ts: @ts1, end_ts: @ts1, user_id: @user_id }
|
||||
}, {
|
||||
op: @op2,
|
||||
meta: { start_ts: @ts1, end_ts: @ts1, user_id: @user_id }
|
||||
}, {
|
||||
op: @op3,
|
||||
meta: { start_ts: @ts2, end_ts: @ts2, user_id: @other_user_id }
|
||||
}]
|
||||
|
||||
describe "compress", ->
|
||||
describe "insert - insert", ->
|
||||
it "should append one insert to the other", ->
|
||||
expect(@UpdateCompressor.compressUpdates [{
|
||||
op: { p: 3, i: "foo" }
|
||||
meta: ts: @ts1, user_id: @user_id
|
||||
}, {
|
||||
op: { p: 6, i: "bar" }
|
||||
meta: ts: @ts2, user_id: @user_id
|
||||
}])
|
||||
.to.deep.equal [{
|
||||
op: { p: 3, i: "foobar" }
|
||||
meta: start_ts: @ts1, end_ts: @ts2, user_id: @user_id
|
||||
}]
|
||||
|
||||
it "should insert one insert inside the other", ->
|
||||
expect(@UpdateCompressor.compressUpdates [{
|
||||
op: { p: 3, i: "foo" }
|
||||
meta: ts: @ts1, user_id: @user_id
|
||||
}, {
|
||||
op: { p: 5, i: "bar" }
|
||||
meta: ts: @ts2, user_id: @user_id
|
||||
}])
|
||||
.to.deep.equal [{
|
||||
op: { p: 3, i: "fobaro" }
|
||||
meta: start_ts: @ts1, end_ts: @ts2, user_id: @user_id
|
||||
}]
|
||||
|
||||
it "should not append separated inserts", ->
|
||||
expect(@UpdateCompressor.compressUpdates [{
|
||||
op: { p: 3, i: "foo" }
|
||||
meta: ts: @ts1, user_id: @user_id
|
||||
}, {
|
||||
op: { p: 9, i: "bar" }
|
||||
meta: ts: @ts2, user_id: @user_id
|
||||
}])
|
||||
.to.deep.equal [{
|
||||
op: { p: 3, i: "foo" }
|
||||
meta: start_ts: @ts1, end_ts: @ts1, user_id: @user_id
|
||||
}, {
|
||||
op: { p: 9, i: "bar" }
|
||||
meta: start_ts: @ts2, end_ts: @ts2, user_id: @user_id
|
||||
}]
|
||||
|
||||
describe "delete - delete", ->
|
||||
it "should append one delete to the other", ->
|
||||
expect(@UpdateCompressor.compressUpdates [{
|
||||
op: { p: 3, d: "foo" }
|
||||
meta: ts: @ts1, user_id: @user_id
|
||||
}, {
|
||||
op: { p: 3, d: "bar" }
|
||||
meta: ts: @ts2, user_id: @user_id
|
||||
}])
|
||||
.to.deep.equal [{
|
||||
op: { p: 3, d: "foobar" }
|
||||
meta: start_ts: @ts1, end_ts: @ts2, user_id: @user_id
|
||||
}]
|
||||
|
||||
it "should insert one delete inside the other", ->
|
||||
expect(@UpdateCompressor.compressUpdates [{
|
||||
op: { p: 3, d: "foo" }
|
||||
meta: ts: @ts1, user_id: @user_id
|
||||
}, {
|
||||
op: { p: 1, d: "bar" }
|
||||
meta: ts: @ts2, user_id: @user_id
|
||||
}])
|
||||
.to.deep.equal [{
|
||||
op: { p: 1, d: "bafoor" }
|
||||
meta: start_ts: @ts1, end_ts: @ts2, user_id: @user_id
|
||||
}]
|
||||
|
||||
it "should not append separated deletes", ->
|
||||
expect(@UpdateCompressor.compressUpdates [{
|
||||
op: { p: 3, d: "foo" }
|
||||
meta: ts: @ts1, user_id: @user_id
|
||||
}, {
|
||||
op: { p: 9, d: "bar" }
|
||||
meta: ts: @ts2, user_id: @user_id
|
||||
}])
|
||||
.to.deep.equal [{
|
||||
op: { p: 3, d: "foo" }
|
||||
meta: start_ts: @ts1, end_ts: @ts1, user_id: @user_id
|
||||
}, {
|
||||
op: { p: 9, d: "bar" }
|
||||
meta: start_ts: @ts2, end_ts: @ts2, user_id: @user_id
|
||||
}]
|
||||
|
||||
describe "insert - delete", ->
|
||||
it "should undo a previous insert", ->
|
||||
expect(@UpdateCompressor.compressUpdates [{
|
||||
op: { p: 3, i: "foo" }
|
||||
meta: ts: @ts1, user_id: @user_id
|
||||
}, {
|
||||
op: { p: 5, d: "o" }
|
||||
meta: ts: @ts2, user_id: @user_id
|
||||
}])
|
||||
.to.deep.equal [{
|
||||
op: { p: 3, i: "fo" }
|
||||
meta: start_ts: @ts1, end_ts: @ts2, user_id: @user_id
|
||||
}]
|
||||
|
||||
it "should remove part of an insert from the middle", ->
|
||||
expect(@UpdateCompressor.compressUpdates [{
|
||||
op: { p: 3, i: "fobaro" }
|
||||
meta: ts: @ts1, user_id: @user_id
|
||||
}, {
|
||||
op: { p: 5, d: "bar" }
|
||||
meta: ts: @ts2, user_id: @user_id
|
||||
}])
|
||||
.to.deep.equal [{
|
||||
op: { p: 3, i: "foo" }
|
||||
meta: start_ts: @ts1, end_ts: @ts2, user_id: @user_id
|
||||
}]
|
||||
|
||||
it "should cancel out two opposite updates", ->
|
||||
expect(@UpdateCompressor.compressUpdates [{
|
||||
op: { p: 3, i: "foo" }
|
||||
meta: ts: @ts1, user_id: @user_id
|
||||
}, {
|
||||
op: { p: 3, d: "foo" }
|
||||
meta: ts: @ts2, user_id: @user_id
|
||||
}])
|
||||
.to.deep.equal []
|
||||
|
||||
it "should not combine separated updates", ->
|
||||
expect(@UpdateCompressor.compressUpdates [{
|
||||
op: { p: 3, i: "foo" }
|
||||
meta: ts: @ts1, user_id: @user_id
|
||||
}, {
|
||||
op: { p: 9, d: "bar" }
|
||||
meta: ts: @ts2, user_id: @user_id
|
||||
}])
|
||||
.to.deep.equal [{
|
||||
op: { p: 3, i: "foo" }
|
||||
meta: start_ts: @ts1, end_ts: @ts1, user_id: @user_id
|
||||
}, {
|
||||
op: { p: 9, d: "bar" }
|
||||
meta: start_ts: @ts2, end_ts: @ts2, user_id: @user_id
|
||||
}]
|
||||
|
||||
|
||||
Reference in New Issue
Block a user