mirror of
https://github.com/yu-i-i/overleaf-cep.git
synced 2026-11-15 14:43:46 +01:00
[project-history] add support for resync of history-ot ranges (#26475)
* [project-history] add support for resync of history-ot ranges * [project-history] avoid compressing sharejs and history-ot upgrades * [document-updater] improve error message of some assertions ... by migrating the assertions like this: ```diff -stub.calledWith().should.equal(true) +stub.should.have.been.calledWith() ``` ```diff -stub.called.should.equal(false) +stub.should.not.have.been.called ``` * [document-updater] move content field in resyncDocContent * [document-updater] add support for resync of history-ot ranges GitOrigin-RevId: e6104686a26934a5f25a8f095cbe00c163fbbaa7
This commit is contained in:
+117
-49
@@ -15,6 +15,7 @@ describe('ProjectHistoryRedisManager', function () {
|
||||
|
||||
this.Limits = {
|
||||
docIsTooLarge: sinon.stub().returns(false),
|
||||
stringFileDataContentIsTooLarge: sinon.stub().returns(false),
|
||||
}
|
||||
|
||||
this.ProjectHistoryRedisManager = SandboxedModule.require(modulePath, {
|
||||
@@ -61,22 +62,18 @@ describe('ProjectHistoryRedisManager', function () {
|
||||
})
|
||||
|
||||
it('should queue an update', function () {
|
||||
this.multi.rpush
|
||||
.calledWithExactly(
|
||||
`ProjectHistory:Ops:${this.project_id}`,
|
||||
this.ops[0],
|
||||
this.ops[1]
|
||||
)
|
||||
.should.equal(true)
|
||||
this.multi.rpush.should.have.been.calledWithExactly(
|
||||
`ProjectHistory:Ops:${this.project_id}`,
|
||||
this.ops[0],
|
||||
this.ops[1]
|
||||
)
|
||||
})
|
||||
|
||||
it('should set the queue timestamp if not present', function () {
|
||||
this.multi.setnx
|
||||
.calledWithExactly(
|
||||
`ProjectHistory:FirstOpTimestamp:${this.project_id}`,
|
||||
Date.now()
|
||||
)
|
||||
.should.equal(true)
|
||||
this.multi.setnx.should.have.been.calledWithExactly(
|
||||
`ProjectHistory:FirstOpTimestamp:${this.project_id}`,
|
||||
Date.now()
|
||||
)
|
||||
})
|
||||
})
|
||||
|
||||
@@ -118,9 +115,10 @@ describe('ProjectHistoryRedisManager', function () {
|
||||
file: this.file_id,
|
||||
}
|
||||
|
||||
this.ProjectHistoryRedisManager.promises.queueOps
|
||||
.calledWithExactly(this.project_id, JSON.stringify(update))
|
||||
.should.equal(true)
|
||||
this.ProjectHistoryRedisManager.promises.queueOps.should.have.been.calledWithExactly(
|
||||
this.project_id,
|
||||
JSON.stringify(update)
|
||||
)
|
||||
})
|
||||
})
|
||||
|
||||
@@ -166,9 +164,10 @@ describe('ProjectHistoryRedisManager', function () {
|
||||
doc: this.doc_id,
|
||||
}
|
||||
|
||||
this.ProjectHistoryRedisManager.promises.queueOps
|
||||
.calledWithExactly(this.project_id, JSON.stringify(update))
|
||||
.should.equal(true)
|
||||
this.ProjectHistoryRedisManager.promises.queueOps.should.have.been.calledWithExactly(
|
||||
this.project_id,
|
||||
JSON.stringify(update)
|
||||
)
|
||||
})
|
||||
|
||||
it('should queue an update with file metadata', async function () {
|
||||
@@ -350,9 +349,10 @@ describe('ProjectHistoryRedisManager', function () {
|
||||
doc: this.doc_id,
|
||||
}
|
||||
|
||||
this.ProjectHistoryRedisManager.promises.queueOps
|
||||
.calledWithExactly(this.project_id, JSON.stringify(update))
|
||||
.should.equal(true)
|
||||
this.ProjectHistoryRedisManager.promises.queueOps.should.have.been.calledWithExactly(
|
||||
this.project_id,
|
||||
JSON.stringify(update)
|
||||
)
|
||||
})
|
||||
|
||||
it('should not forward ranges if history ranges support is undefined', async function () {
|
||||
@@ -402,9 +402,10 @@ describe('ProjectHistoryRedisManager', function () {
|
||||
doc: this.doc_id,
|
||||
}
|
||||
|
||||
this.ProjectHistoryRedisManager.promises.queueOps
|
||||
.calledWithExactly(this.project_id, JSON.stringify(update))
|
||||
.should.equal(true)
|
||||
this.ProjectHistoryRedisManager.promises.queueOps.should.have.been.calledWithExactly(
|
||||
this.project_id,
|
||||
JSON.stringify(update)
|
||||
)
|
||||
})
|
||||
|
||||
it('should pass "false" as the createdBlob field if not provided', async function () {
|
||||
@@ -432,9 +433,10 @@ describe('ProjectHistoryRedisManager', function () {
|
||||
doc: this.doc_id,
|
||||
}
|
||||
|
||||
this.ProjectHistoryRedisManager.promises.queueOps
|
||||
.calledWithExactly(this.project_id, JSON.stringify(update))
|
||||
.should.equal(true)
|
||||
this.ProjectHistoryRedisManager.promises.queueOps.should.have.been.calledWithExactly(
|
||||
this.project_id,
|
||||
JSON.stringify(update)
|
||||
)
|
||||
})
|
||||
|
||||
it('should pass through the value of the createdBlob field', async function () {
|
||||
@@ -463,9 +465,10 @@ describe('ProjectHistoryRedisManager', function () {
|
||||
doc: this.doc_id,
|
||||
}
|
||||
|
||||
this.ProjectHistoryRedisManager.promises.queueOps
|
||||
.calledWithExactly(this.project_id, JSON.stringify(update))
|
||||
.should.equal(true)
|
||||
this.ProjectHistoryRedisManager.promises.queueOps.should.have.been.calledWithExactly(
|
||||
this.project_id,
|
||||
JSON.stringify(update)
|
||||
)
|
||||
})
|
||||
})
|
||||
|
||||
@@ -493,8 +496,8 @@ describe('ProjectHistoryRedisManager', function () {
|
||||
beforeEach(async function () {
|
||||
this.update = {
|
||||
resyncDocContent: {
|
||||
content: 'one\ntwo',
|
||||
version: this.version,
|
||||
content: 'one\ntwo',
|
||||
},
|
||||
projectHistoryId: this.projectHistoryId,
|
||||
path: this.pathname,
|
||||
@@ -516,19 +519,18 @@ describe('ProjectHistoryRedisManager', function () {
|
||||
})
|
||||
|
||||
it('should check if the doc is too large', function () {
|
||||
this.Limits.docIsTooLarge
|
||||
.calledWith(
|
||||
JSON.stringify(this.update).length,
|
||||
this.lines,
|
||||
this.settings.max_doc_length
|
||||
)
|
||||
.should.equal(true)
|
||||
this.Limits.docIsTooLarge.should.have.been.calledWith(
|
||||
JSON.stringify(this.update).length,
|
||||
this.lines,
|
||||
this.settings.max_doc_length
|
||||
)
|
||||
})
|
||||
|
||||
it('should queue an update', function () {
|
||||
this.ProjectHistoryRedisManager.promises.queueOps
|
||||
.calledWithExactly(this.project_id, JSON.stringify(this.update))
|
||||
.should.equal(true)
|
||||
this.ProjectHistoryRedisManager.promises.queueOps.should.have.been.calledWithExactly(
|
||||
this.project_id,
|
||||
JSON.stringify(this.update)
|
||||
)
|
||||
})
|
||||
})
|
||||
|
||||
@@ -551,9 +553,8 @@ describe('ProjectHistoryRedisManager', function () {
|
||||
})
|
||||
|
||||
it('should not queue an update if the doc is too large', function () {
|
||||
this.ProjectHistoryRedisManager.promises.queueOps.called.should.equal(
|
||||
false
|
||||
)
|
||||
this.ProjectHistoryRedisManager.promises.queueOps.should.not.have.been
|
||||
.called
|
||||
})
|
||||
})
|
||||
|
||||
@@ -561,10 +562,10 @@ describe('ProjectHistoryRedisManager', function () {
|
||||
beforeEach(async function () {
|
||||
this.update = {
|
||||
resyncDocContent: {
|
||||
content: 'onedeleted\ntwo',
|
||||
version: this.version,
|
||||
ranges: this.ranges,
|
||||
resolvedCommentIds: this.resolvedCommentIds,
|
||||
content: 'onedeleted\ntwo',
|
||||
},
|
||||
projectHistoryId: this.projectHistoryId,
|
||||
path: this.pathname,
|
||||
@@ -601,9 +602,76 @@ describe('ProjectHistoryRedisManager', function () {
|
||||
})
|
||||
|
||||
it('should queue an update', function () {
|
||||
this.ProjectHistoryRedisManager.promises.queueOps
|
||||
.calledWithExactly(this.project_id, JSON.stringify(this.update))
|
||||
.should.equal(true)
|
||||
this.ProjectHistoryRedisManager.promises.queueOps.should.have.been.calledWithExactly(
|
||||
this.project_id,
|
||||
JSON.stringify(this.update)
|
||||
)
|
||||
})
|
||||
})
|
||||
|
||||
describe('history-ot', function () {
|
||||
beforeEach(async function () {
|
||||
this.lines = {
|
||||
content: 'onedeleted\ntwo',
|
||||
comments: [{ id: 'id1', ranges: [{ pos: 0, length: 3 }] }],
|
||||
trackedChanges: [
|
||||
{
|
||||
range: { pos: 3, length: 7 },
|
||||
tracking: {
|
||||
type: 'delete',
|
||||
userId: 'user-id',
|
||||
ts: '2025-06-16T14:31:44.910Z',
|
||||
},
|
||||
},
|
||||
],
|
||||
}
|
||||
this.update = {
|
||||
resyncDocContent: {
|
||||
version: this.version,
|
||||
historyOTRanges: {
|
||||
comments: this.lines.comments,
|
||||
trackedChanges: this.lines.trackedChanges,
|
||||
},
|
||||
content: this.lines.content,
|
||||
},
|
||||
projectHistoryId: this.projectHistoryId,
|
||||
path: this.pathname,
|
||||
doc: this.doc_id,
|
||||
meta: { ts: new Date() },
|
||||
}
|
||||
|
||||
await this.ProjectHistoryRedisManager.promises.queueResyncDocContent(
|
||||
this.project_id,
|
||||
this.projectHistoryId,
|
||||
this.doc_id,
|
||||
this.lines,
|
||||
this.ranges,
|
||||
this.resolvedCommentIds,
|
||||
this.version,
|
||||
this.pathname,
|
||||
true
|
||||
)
|
||||
})
|
||||
|
||||
it('should include tracked deletes in the update', function () {
|
||||
this.ProjectHistoryRedisManager.promises.queueOps.should.have.been.calledWithExactly(
|
||||
this.project_id,
|
||||
JSON.stringify(this.update)
|
||||
)
|
||||
})
|
||||
|
||||
it('should check the doc length without tracked deletes', function () {
|
||||
this.Limits.stringFileDataContentIsTooLarge.should.have.been.calledWith(
|
||||
this.lines,
|
||||
this.settings.max_doc_length
|
||||
)
|
||||
})
|
||||
|
||||
it('should queue an update', function () {
|
||||
this.ProjectHistoryRedisManager.promises.queueOps.should.have.been.calledWithExactly(
|
||||
this.project_id,
|
||||
JSON.stringify(this.update)
|
||||
)
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user