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

217 lines
5.5 KiB
JavaScript

import { expect } from 'chai'
import sinon from 'sinon'
import esmock from 'esmock'
const modulePath = '../../../../app/src/Features/Metadata/MetaHandler.mjs'
describe('MetaHandler', function () {
beforeEach(async function () {
this.projectId = 'someprojectid'
this.docId = 'somedocid'
this.lines = [
'\\usepackage{ foo, bar }',
'\\usepackage{baz}',
'one',
'\\label{aaa}',
'two',
'commented label % \\label{bbb}', // bbb should not be in the returned labels
'\\label{ccc}%bar', // ccc should be in the returned labels
'\\label{ddd} % bar', // ddd should be in the returned labels
'\\label{ e,f,g }', // e,f,g should be in the returned labels
]
this.docs = {
[this.docId]: {
_id: this.docId,
lines: this.lines,
},
}
this.ProjectEntityHandler = {
promises: {
getAllDocs: sinon.stub().resolves(this.docs),
getDoc: sinon.stub().resolves(this.docs[this.docId]),
},
}
this.DocumentUpdaterHandler = {
promises: {
flushDocToMongo: sinon.stub().resolves(),
flushProjectToMongo: sinon.stub().resolves(),
},
}
this.packageMapping = {
foo: [
{
caption: '\\bar',
snippet: '\\bar',
meta: 'foo-cmd',
score: 12,
},
{
caption: '\\bat[]{}',
snippet: '\\bar[$1]{$2}',
meta: 'foo-cmd',
score: 10,
},
],
baz: [
{
caption: '\\longercommandtest{}',
snippet: '\\longercommandtest{$1}',
meta: 'baz-cmd',
score: 50,
},
],
}
this.MetaHandler = await esmock.strict(modulePath, {
'../../../../app/src/Features/Project/ProjectEntityHandler':
this.ProjectEntityHandler,
'../../../../app/src/Features/DocumentUpdater/DocumentUpdaterHandler':
this.DocumentUpdaterHandler,
'../../../../app/src/Features/Metadata/packageMapping':
this.packageMapping,
})
})
describe('getMetaForDoc', function () {
it('should extract all the labels and packages', async function () {
const result = await this.MetaHandler.promises.getMetaForDoc(
this.projectId,
this.docId
)
expect(result).to.deep.equal({
labels: ['aaa', 'ccc', 'ddd', 'e,f,g'],
packages: {
foo: this.packageMapping.foo,
baz: this.packageMapping.baz,
},
packageNames: ['foo', 'bar', 'baz'],
})
this.DocumentUpdaterHandler.promises.flushDocToMongo.should.be.calledWith(
this.projectId,
this.docId
)
this.ProjectEntityHandler.promises.getDoc.should.be.calledWith(
this.projectId,
this.docId
)
})
})
describe('getAllMetaForProject', function () {
it('should extract all metadata', async function () {
this.ProjectEntityHandler.promises.getAllDocs = sinon.stub().resolves({
doc_one: {
_id: 'id_one',
lines: ['one', '\\label{aaa} two', 'three'],
},
doc_two: {
_id: 'id_two',
lines: ['four'],
},
doc_three: {
_id: 'id_three',
lines: ['\\label{bbb}', 'five six', 'seven eight \\label{ccc} nine'],
},
doc_four: {
_id: 'id_four',
lines: [
'\\usepackage[width=\\textwidth]{baz}',
'\\usepackage{amsmath}',
],
},
doc_five: {
_id: 'id_five',
lines: [
'\\usepackage{foo,baz}',
'\\usepackage[options=foo]{hello}',
'some text',
'\\section{this}\\label{sec:intro}',
'In Section \\ref{sec:intro} we saw',
'nothing',
],
},
})
const result = await this.MetaHandler.promises.getAllMetaForProject(
this.projectId
)
expect(result).to.deep.equal({
id_one: {
labels: ['aaa'],
packages: {},
packageNames: [],
},
id_two: {
labels: [],
packages: {},
packageNames: [],
},
id_three: {
labels: ['bbb', 'ccc'],
packages: {},
packageNames: [],
},
id_four: {
labels: [],
packages: {
baz: [
{
caption: '\\longercommandtest{}',
snippet: '\\longercommandtest{$1}',
meta: 'baz-cmd',
score: 50,
},
],
},
packageNames: ['baz', 'amsmath'],
},
id_five: {
labels: ['sec:intro'],
packages: {
foo: [
{
caption: '\\bar',
snippet: '\\bar',
meta: 'foo-cmd',
score: 12,
},
{
caption: '\\bat[]{}',
snippet: '\\bar[$1]{$2}',
meta: 'foo-cmd',
score: 10,
},
],
baz: [
{
caption: '\\longercommandtest{}',
snippet: '\\longercommandtest{$1}',
meta: 'baz-cmd',
score: 50,
},
],
},
packageNames: ['foo', 'baz', 'hello'],
},
})
this.DocumentUpdaterHandler.promises.flushProjectToMongo.should.be.calledWith(
this.projectId
)
this.ProjectEntityHandler.promises.getAllDocs.should.be.calledWith(
this.projectId
)
})
})
})