Files
overleaf-cep/services/web/test/unit/src/Metadata/MetaControllerTests.mjs
Andrew Rumble 2bfb55a305 Update tests
GitOrigin-RevId: 9272720e0f6865c54257c43bd98d8e6003251aa2
2024-10-17 08:06:17 +00:00

164 lines
5.0 KiB
JavaScript

import { expect } from 'chai'
import sinon from 'sinon'
import esmock from 'esmock'
import MockResponse from '../helpers/MockResponse.js'
const modulePath = '../../../../app/src/Features/Metadata/MetaController.mjs'
describe('MetaController', function () {
beforeEach(async function () {
this.EditorRealTimeController = {
emitToRoom: sinon.stub(),
}
this.MetaHandler = {
promises: {
getAllMetaForProject: sinon.stub(),
getMetaForDoc: sinon.stub(),
},
}
this.MetadataController = await esmock.strict(modulePath, {
'../../../../app/src/Features/Editor/EditorRealTimeController':
this.EditorRealTimeController,
'../../../../app/src/Features/Metadata/MetaHandler': this.MetaHandler,
})
})
describe('getMetadata', function () {
it('should respond with json', async function () {
const projectMeta = {
'doc-id': {
labels: ['foo'],
packages: { a: { commands: [] } },
packageNames: ['a'],
},
}
this.MetaHandler.promises.getAllMetaForProject = sinon
.stub()
.resolves(projectMeta)
const req = { params: { project_id: 'project-id' } }
const res = new MockResponse()
const next = sinon.stub()
await this.MetadataController.getMetadata(req, res, next)
this.MetaHandler.promises.getAllMetaForProject.should.have.been.calledWith(
'project-id'
)
res.json.should.have.been.calledOnceWith({
projectId: 'project-id',
projectMeta,
})
next.should.not.have.been.called
})
it('should handle an error', async function () {
this.MetaHandler.promises.getAllMetaForProject = sinon
.stub()
.throws(new Error('woops'))
const req = { params: { project_id: 'project-id' } }
const res = new MockResponse()
const next = sinon.stub()
await this.MetadataController.getMetadata(req, res, next)
this.MetaHandler.promises.getAllMetaForProject.should.have.been.calledWith(
'project-id'
)
res.json.should.not.have.been.called
next.should.have.been.calledWithMatch(error => error instanceof Error)
})
})
describe('broadcastMetadataForDoc', function () {
it('should broadcast on broadcast:true ', async function () {
this.MetaHandler.promises.getMetaForDoc = sinon.stub().resolves({
labels: ['foo'],
packages: { a: { commands: [] } },
packageNames: ['a'],
})
this.EditorRealTimeController.emitToRoom = sinon.stub()
const req = {
params: { project_id: 'project-id', doc_id: 'doc-id' },
body: { broadcast: true },
}
const res = new MockResponse()
const next = sinon.stub()
await this.MetadataController.broadcastMetadataForDoc(req, res, next)
this.MetaHandler.promises.getMetaForDoc.should.have.been.calledWith(
'project-id'
)
res.json.should.not.have.been.called
res.sendStatus.should.have.been.calledOnceWith(200)
next.should.not.have.been.called
this.EditorRealTimeController.emitToRoom.should.have.been.calledOnce
const { lastCall } = this.EditorRealTimeController.emitToRoom
expect(lastCall.args[0]).to.equal('project-id')
expect(lastCall.args[1]).to.equal('broadcastDocMeta')
expect(lastCall.args[2]).to.have.all.keys(['docId', 'meta'])
})
it('should return json on broadcast:false ', async function () {
const docMeta = {
labels: ['foo'],
packages: { a: [] },
packageNames: ['a'],
}
this.MetaHandler.promises.getMetaForDoc = sinon.stub().resolves(docMeta)
this.EditorRealTimeController.emitToRoom = sinon.stub()
const req = {
params: { project_id: 'project-id', doc_id: 'doc-id' },
body: { broadcast: false },
}
const res = new MockResponse()
const next = sinon.stub()
await this.MetadataController.broadcastMetadataForDoc(req, res, next)
this.MetaHandler.promises.getMetaForDoc.should.have.been.calledWith(
'project-id'
)
this.EditorRealTimeController.emitToRoom.should.not.have.been.called
res.json.should.have.been.calledOnceWith({
docId: 'doc-id',
meta: docMeta,
})
next.should.not.have.been.called
})
it('should handle an error', async function () {
this.MetaHandler.promises.getMetaForDoc = sinon
.stub()
.throws(new Error('woops'))
this.EditorRealTimeController.emitToRoom = sinon.stub()
const req = {
params: { project_id: 'project-id', doc_id: 'doc-id' },
body: { broadcast: true },
}
const res = new MockResponse()
const next = sinon.stub()
await this.MetadataController.broadcastMetadataForDoc(req, res, next)
this.MetaHandler.promises.getMetaForDoc.should.have.been.calledWith(
'project-id'
)
res.json.should.not.have.been.called
next.should.have.been.calledWithMatch(error => error instanceof Error)
})
})
})