Merge pull request #23209 from overleaf/jdt-async-await-prj-entity-handler

Async/await the ProjectEntityHandler

GitOrigin-RevId: 873106c4ea56e13d864407b338a1924370ba6709
This commit is contained in:
Jimmy Domagala-Tang
2025-02-03 11:32:36 -05:00
committed by Copybot
parent e73b3b4c9f
commit 98b5bf2694
2 changed files with 343 additions and 422 deletions

View File

@@ -31,14 +31,16 @@ describe('ProjectEntityHandler', function () {
this.ProjectEntityHandler = SandboxedModule.require(modulePath, {
requires: {
'../Docstore/DocstoreManager': (this.DocstoreManager = {}),
'../Docstore/DocstoreManager': (this.DocstoreManager = {
promises: {},
}),
'../../Features/DocumentUpdater/DocumentUpdaterHandler':
this.DocumentUpdaterHandler,
'../../models/Project': {
Project: this.ProjectModel,
},
'./ProjectLocator': this.ProjectLocator,
'./ProjectGetter': (this.ProjectGetter = {}),
'./ProjectGetter': (this.ProjectGetter = { promises: {} }),
'../ThirdPartyDataStore/TpdsUpdateSender': this.TpdsUpdateSender,
},
})
@@ -82,13 +84,14 @@ describe('ProjectEntityHandler', function () {
],
},
]
this.ProjectGetter.getProjectWithoutDocLines = sinon
this.ProjectGetter.promises.getProjectWithoutDocLines = sinon
.stub()
.yields(null, this.project)
.resolves(this.project)
})
describe('getAllDocs', function () {
beforeEach(function () {
let fetchedDocs
beforeEach(async function () {
this.docs = [
{
_id: this.doc1._id,
@@ -101,18 +104,21 @@ describe('ProjectEntityHandler', function () {
rev: (this.rev2 = 2),
},
]
this.DocstoreManager.getAllDocs = sinon
this.DocstoreManager.promises.getAllDocs = sinon
.stub()
.callsArgWith(1, null, this.docs)
this.ProjectEntityHandler.getAllDocs(projectId, this.callback)
.resolves(this.docs)
fetchedDocs =
await this.ProjectEntityHandler.promises.getAllDocs(projectId)
})
it('should get the doc lines and rev from the docstore', function () {
this.DocstoreManager.getAllDocs.calledWith(projectId).should.equal(true)
this.DocstoreManager.promises.getAllDocs
.calledWith(projectId)
.should.equal(true)
})
it('should call the callback with the docs with the lines and rev included', function () {
this.callback.should.have.been.calledWith(null, {
expect(fetchedDocs).to.deep.equal({
'/doc1': {
_id: this.doc1._id,
lines: this.lines1,
@@ -132,13 +138,17 @@ describe('ProjectEntityHandler', function () {
})
describe('getAllFiles', function () {
beforeEach(function () {
let allFiles
beforeEach(async function () {
this.callback = sinon.stub()
this.ProjectEntityHandler.getAllFiles(projectId, this.callback)
allFiles = await this.ProjectEntityHandler.promises.getAllFiles(
projectId,
this.callback
)
})
it('should call the callback with the files', function () {
this.callback.should.have.been.calledWith(null, {
expect(allFiles).to.deep.equal({
'/file1': { ...this.file1, folder: this.project.rootFolder[0] },
'/folder1/file2': { ...this.file2, folder: this.folder1 },
})
@@ -176,83 +186,66 @@ describe('ProjectEntityHandler', function () {
})
describe('getDocPathByProjectIdAndDocId', function () {
beforeEach(function () {
this.callback = sinon.stub()
})
it('should call the callback with the path for an existing doc id at the root level', function () {
this.ProjectEntityHandler.getDocPathByProjectIdAndDocId(
projectId,
this.doc1._id,
this.callback
)
this.callback.calledWith(null, `/${this.doc1.name}`).should.equal(true)
it('should call the callback with the path for an existing doc id at the root level', async function () {
const path =
await this.ProjectEntityHandler.promises.getDocPathByProjectIdAndDocId(
projectId,
this.doc1._id
)
expect(path).to.deep.equal(`/${this.doc1.name}`)
})
it('should call the callback with the path for an existing doc id nested within a folder', function () {
this.ProjectEntityHandler.getDocPathByProjectIdAndDocId(
projectId,
this.doc2._id,
this.callback
)
this.callback
.calledWith(null, `/folder1/${this.doc2.name}`)
.should.equal(true)
it('should call the callback with the path for an existing doc id nested within a folder', async function () {
const path =
await this.ProjectEntityHandler.promises.getDocPathByProjectIdAndDocId(
projectId,
this.doc2._id
)
expect(path).to.deep.equal(`/folder1/${this.doc2.name}`)
})
it('should call the callback with a NotFoundError for a non-existing doc', function () {
this.ProjectEntityHandler.getDocPathByProjectIdAndDocId(
projectId,
'non-existing-id',
this.callback
)
expect(this.callback.firstCall.args[0]).to.be.an.instanceof(
Errors.NotFoundError
)
it('should call the callback with a NotFoundError for a non-existing doc', async function () {
await expect(
this.ProjectEntityHandler.promises.getDocPathByProjectIdAndDocId(
projectId,
'non-existing-id'
)
).to.be.rejectedWith(Errors.NotFoundError)
})
it('should call the callback with a NotFoundError for an existing file', function () {
this.ProjectEntityHandler.getDocPathByProjectIdAndDocId(
projectId,
this.file1._id,
this.callback
)
expect(this.callback.firstCall.args[0]).to.be.an.instanceof(
Errors.NotFoundError
)
it('should call the callback with a NotFoundError for an existing file', async function () {
await expect(
this.ProjectEntityHandler.promises.getDocPathByProjectIdAndDocId(
projectId,
this.file1._id
)
).to.be.rejectedWith(Errors.NotFoundError)
})
})
describe('_getAllFolders', function () {
beforeEach(function () {
describe('_getAllFolders', async function () {
let folders
beforeEach(async function () {
this.callback = sinon.stub()
this.ProjectEntityHandler._getAllFolders(projectId, this.callback)
folders =
await this.ProjectEntityHandler.promises._getAllFolders(projectId)
})
it('should get the project without the docs lines', function () {
this.ProjectGetter.getProjectWithoutDocLines
this.ProjectGetter.promises.getProjectWithoutDocLines
.calledWith(projectId)
.should.equal(true)
})
it('should call the callback with the folders', function () {
this.callback
.calledWith(null, [
{ path: '/', folder: this.project.rootFolder[0] },
{ path: '/folder1', folder: this.folder1 },
])
.should.equal(true)
expect(folders).to.deep.equal([
{ path: '/', folder: this.project.rootFolder[0] },
{ path: '/folder1', folder: this.folder1 },
])
})
})
describe('_getAllFoldersFromProject', function () {
beforeEach(function () {
this.callback = sinon.stub()
this.ProjectEntityHandler._getAllFoldersFromProject(
this.project,
this.callback
)
})
it('should return the folders', function () {
expect(
this.ProjectEntityHandler._getAllFoldersFromProject(this.project)
@@ -303,13 +296,13 @@ describe('ProjectEntityHandler', function () {
],
},
]
this.ProjectGetter.getProjectWithoutDocLines = sinon
this.ProjectGetter.promises.getProjectWithoutDocLines = sinon
.stub()
.yields(null, this.project)
.resolves(this.project)
})
describe('getAllDocs', function () {
beforeEach(function () {
beforeEach(async function () {
this.docs = [
{
_id: this.doc1._id,
@@ -322,128 +315,102 @@ describe('ProjectEntityHandler', function () {
rev: (this.rev2 = 2),
},
]
this.DocstoreManager.getAllDocs = sinon
this.DocstoreManager.promises.getAllDocs = sinon
.stub()
.callsArgWith(1, null, this.docs)
this.ProjectEntityHandler.getAllDocs(projectId, this.callback)
.resolves(this.docs)
})
it('should get the doc lines and rev from the docstore', function () {
this.DocstoreManager.getAllDocs.calledWith(projectId).should.equal(true)
})
it('should call the callback with an error', function () {
this.callback.should.have.been.calledWith(sinon.match.defined)
it('should call the callback with an error', async function () {
await expect(this.ProjectEntityHandler.promises.getAllDocs(projectId))
.to.be.rejected
})
})
describe('getAllFiles', function () {
beforeEach(function () {
this.callback = sinon.stub()
this.ProjectEntityHandler.getAllFiles(projectId, this.callback)
})
it('should call the callback with and error', function () {
this.callback.should.have.been.calledWith(sinon.match.defined)
it('should call the callback with and error', async function () {
await expect(this.ProjectEntityHandler.promises.getAllFiles(projectId))
.to.be.rejected
})
})
describe('getDocPathByProjectIdAndDocId', function () {
beforeEach(function () {
this.callback = sinon.stub()
})
it('should call the callback with an error for an existing doc id at the root level', function () {
this.ProjectEntityHandler.getDocPathByProjectIdAndDocId(
projectId,
this.doc1._id,
this.callback
)
this.callback.should.have.been.calledWith(sinon.match.instanceOf(Error))
it('should call the callback with an error for an existing doc id at the root level', async function () {
await expect(
this.ProjectEntityHandler.promises.getDocPathByProjectIdAndDocId(
projectId,
this.doc1._id
)
).to.be.rejectedWith(Error)
})
it('should call the callback with an error for an existing doc id nested within a folder', function () {
this.ProjectEntityHandler.getDocPathByProjectIdAndDocId(
projectId,
this.doc2._id,
this.callback
)
this.callback.should.have.been.calledWith(sinon.match.instanceOf(Error))
it('should call the callback with an error for an existing doc id nested within a folder', async function () {
await expect(
this.ProjectEntityHandler.promises.getDocPathByProjectIdAndDocId(
projectId,
this.doc2._id
)
).to.be.rejectedWith(Error)
})
it('should call the callback with an error for a non-existing doc', function () {
this.ProjectEntityHandler.getDocPathByProjectIdAndDocId(
projectId,
'non-existing-id',
this.callback
)
this.callback.should.have.been.calledWith(sinon.match.instanceOf(Error))
it('should call the callback with an error for a non-existing doc', async function () {
await expect(
this.ProjectEntityHandler.promises.getDocPathByProjectIdAndDocId(
projectId,
'non-existing-id'
)
).to.be.rejectedWith(Error)
})
it('should call the callback with an error for an existing file', function () {
this.ProjectEntityHandler.getDocPathByProjectIdAndDocId(
projectId,
this.file1._id,
this.callback
)
this.callback.should.have.been.calledWith(sinon.match.instanceOf(Error))
it('should call the callback with an error for an existing file', async function () {
await expect(
this.ProjectEntityHandler.promises.getDocPathByProjectIdAndDocId(
projectId,
this.file1._id
)
).to.be.rejectedWith(Error)
})
})
describe('_getAllFolders', function () {
beforeEach(function () {
this.callback = sinon.stub()
this.ProjectEntityHandler._getAllFolders(projectId, this.callback)
})
it('should get the project without the docs lines', function () {
this.ProjectGetter.getProjectWithoutDocLines
.calledWith(projectId)
.should.equal(true)
})
it('should call the callback with an error', function () {
this.callback.should.have.been.calledWith(sinon.match.defined)
it('should call the callback with an error', async function () {
await expect(
this.ProjectEntityHandler.promises._getAllFolders(projectId)
).to.be.rejected
})
})
describe('getAllEntities', function () {
beforeEach(function () {
this.ProjectGetter.getProject = sinon.stub().yields(null, this.project)
this.callback = sinon.stub()
this.ProjectEntityHandler.getAllEntities(projectId, this.callback)
this.ProjectGetter.promises.getProject = sinon
.stub()
.resolves(this.project)
})
it('should call the callback with an error', function () {
this.callback.should.have.been.calledWith(sinon.match.defined)
it('should call the callback with an error', async function () {
await expect(
this.ProjectEntityHandler.promises.getAllEntities(projectId)
).to.be.rejected
})
})
describe('getAllDocPathsFromProjectById', function () {
beforeEach(function () {
this.callback = sinon.stub()
this.ProjectEntityHandler.getAllDocPathsFromProjectById(
projectId,
this.callback
)
})
it('should call the callback with an error', function () {
this.callback.should.have.been.calledWith(sinon.match.defined)
it('should call the callback with an error', async function () {
await expect(
this.ProjectEntityHandler.promises.getAllDocPathsFromProjectById(
projectId
)
).to.be.rejected
})
})
describe('getDocPathFromProjectByDocId', function () {
beforeEach(function () {
this.callback = sinon.stub()
this.ProjectEntityHandler.getDocPathFromProjectByDocId(
projectId,
this.doc1._id,
this.callback
)
})
it('should call the callback with an error', function () {
this.callback.should.have.been.calledWith(sinon.match.defined)
it('should call the callback with an error', async function () {
await expect(
this.ProjectEntityHandler.promises.getDocPathFromProjectByDocId(
projectId,
this.doc1._id
)
).to.be.rejected
})
})
})
@@ -454,23 +421,23 @@ describe('ProjectEntityHandler', function () {
this.rev = 5
this.version = 42
this.ranges = { mock: 'ranges' }
this.DocstoreManager.getDoc = sinon
.stub()
.callsArgWith(3, null, this.lines, this.rev, this.version, this.ranges)
this.ProjectEntityHandler.getDoc(projectId, docId, this.callback)
this.callback = sinon.stub()
this.DocstoreManager.promises.getDoc = sinon.stub().resolves({
lines: this.lines,
rev: this.rev,
version: this.version,
ranges: this.ranges,
})
})
it('should call the docstore', function () {
this.DocstoreManager.getDoc
.calledWith(projectId, docId)
.should.equal(true)
})
it('should call the callback with the lines, version and rev', function () {
this.callback
.calledWith(null, this.lines, this.rev, this.version, this.ranges)
.should.equal(true)
it('should call the callback with the lines, version and rev', function (done) {
this.ProjectEntityHandler.getDoc(projectId, docId, doc => {
this.DocstoreManager.promises.getDoc
.calledWith(projectId, docId)
.should.equal(true)
expect(doc).to.exist
done()
})
})
})
@@ -483,14 +450,17 @@ describe('ProjectEntityHandler', function () {
this.version = 42
this.ranges = { mock: 'ranges' }
this.DocstoreManager.getDoc = sinon
.stub()
.callsArgWith(3, null, this.lines, this.rev, this.version, this.ranges)
this.DocstoreManager.promises.getDoc = sinon.stub().resolves({
lines: this.lines,
rev: this.rev,
version: this.version,
ranges: this.ranges,
})
result = await this.ProjectEntityHandler.promises.getDoc(projectId, docId)
})
it('should call the docstore', function () {
this.DocstoreManager.getDoc
this.DocstoreManager.promises.getDoc
.calledWith(projectId, docId)
.should.equal(true)
})