From 58bd90d8d8af36be80bc6c7e0372b62950e3cb9b Mon Sep 17 00:00:00 2001 From: James Yu Date: Fri, 27 Sep 2024 11:41:30 +0800 Subject: [PATCH] Maximal sinon stub for unit tests --- src/completion/completer/citation.ts | 2 +- test/units/01_core_file.test.ts | 2 +- test/units/02_core_watcher.test.ts | 2 +- test/units/03_core_cache.test.ts | 2 +- test/units/04_core_root.test.ts | 2 +- test/units/05_compile_queue.test.ts | 2 +- test/units/06_compile_recipe.test.ts | 2 +- test/units/07_compile_external.test.ts | 2 +- test/units/08_compile_build.test.ts | 7 +++++-- test/units/09_viewer_server.test.ts | 2 +- test/units/10_viewer_pdf_server.test.ts | 2 +- test/units/11_parser_tex.test.ts | 2 +- test/units/12_parser_log.test.ts | 2 +- test/units/13_completion_latex.test.ts | 14 ++++++++++++++ test/units/utils.ts | 2 +- 15 files changed, 32 insertions(+), 15 deletions(-) create mode 100644 test/units/13_completion_latex.test.ts diff --git a/src/completion/completer/citation.ts b/src/completion/completer/citation.ts index 050b564a5..4ea1bff67 100644 --- a/src/completion/completer/citation.ts +++ b/src/completion/completer/citation.ts @@ -239,7 +239,7 @@ function updateAll(bibFiles?: string[]): CitationItem[] { async function parseBibFile(fileName: string) { logger.log(`Parsing .bib entries from ${fileName}`) const configuration = vscode.workspace.getConfiguration('latex-workshop', vscode.Uri.file(fileName)) - if (fs.statSync(fileName).size >= (configuration.get('bibtex.maxFileSize') as number) * 1024 * 1024) { + if ((await lw.external.stat(vscode.Uri.file(fileName))).size >= (configuration.get('bibtex.maxFileSize') as number) * 1024 * 1024) { logger.log(`Bib file is too large, ignoring it: ${fileName}`) data.bibEntries.delete(fileName) return diff --git a/test/units/01_core_file.test.ts b/test/units/01_core_file.test.ts index a6ab7ddba..6a4764159 100644 --- a/test/units/01_core_file.test.ts +++ b/test/units/01_core_file.test.ts @@ -10,7 +10,7 @@ describe(path.basename(__filename).split('.')[0] + ':', () => { const fixture = path.basename(__filename).split('.')[0] before(() => { - mock.init(lw, 'file') + mock.init(lw) }) after(() => { diff --git a/test/units/02_core_watcher.test.ts b/test/units/02_core_watcher.test.ts index ffaaf86f2..dd4ca2937 100644 --- a/test/units/02_core_watcher.test.ts +++ b/test/units/02_core_watcher.test.ts @@ -18,7 +18,7 @@ describe(path.basename(__filename).split('.')[0] + ':', () => { const getOnDeleteHandlers = () => _onDeleteHandlersSpy.call(lw.watcher.src) as Set<(uri: vscode.Uri) => void> before(() => { - mock.init(lw, 'file', 'watcher') + mock.init(lw, 'watcher') _onDidChangeSpy = sinon.spy(lw.watcher.src as any, 'onDidChange') _onDidDeleteSpy = sinon.spy(lw.watcher.src as any, 'onDidDelete') _watchersSpy = sinon.spy(lw.watcher.src as any, 'watchers', ['get']).get diff --git a/test/units/03_core_cache.test.ts b/test/units/03_core_cache.test.ts index e068249f3..6e19bda4a 100644 --- a/test/units/03_core_cache.test.ts +++ b/test/units/03_core_cache.test.ts @@ -8,7 +8,7 @@ describe(path.basename(__filename).split('.')[0] + ':', () => { const fixture = path.basename(__filename).split('.')[0] before(() => { - mock.init(lw, 'file', 'watcher', 'cache') + mock.init(lw, 'watcher', 'cache') }) after(() => { diff --git a/test/units/04_core_root.test.ts b/test/units/04_core_root.test.ts index c3773a04d..1071e68ff 100644 --- a/test/units/04_core_root.test.ts +++ b/test/units/04_core_root.test.ts @@ -8,7 +8,7 @@ describe(path.basename(__filename).split('.')[0] + ':', () => { const fixture = path.basename(__filename).split('.')[0] before(() => { - mock.init(lw, 'file', 'watcher', 'cache', 'root') + mock.init(lw, 'watcher', 'cache', 'root') }) after(() => { diff --git a/test/units/05_compile_queue.test.ts b/test/units/05_compile_queue.test.ts index 37dda6af3..0dae02fad 100644 --- a/test/units/05_compile_queue.test.ts +++ b/test/units/05_compile_queue.test.ts @@ -6,7 +6,7 @@ import { queue } from '../../src/compile/queue' describe(path.basename(__filename).split('.')[0] + ':', () => { before(() => { - mock.init(lw, 'file', 'root') + mock.init(lw) }) after(() => { diff --git a/test/units/06_compile_recipe.test.ts b/test/units/06_compile_recipe.test.ts index 068310829..6cf817b6b 100644 --- a/test/units/06_compile_recipe.test.ts +++ b/test/units/06_compile_recipe.test.ts @@ -12,7 +12,7 @@ describe(path.basename(__filename).split('.')[0] + ':', () => { let mkdirStub: sinon.SinonStub before(() => { - mock.init(lw, 'file', 'root') + mock.init(lw) getOutDirStub = sinon.stub(lw.file, 'getOutDir').returns('.') getIncludedTeXStub = lw.cache.getIncludedTeX as sinon.SinonStub mkdirStub = sinon.stub(lw.external, 'mkdirSync').returns(undefined) diff --git a/test/units/07_compile_external.test.ts b/test/units/07_compile_external.test.ts index c1aab1ab2..316be4f8d 100644 --- a/test/units/07_compile_external.test.ts +++ b/test/units/07_compile_external.test.ts @@ -10,7 +10,7 @@ import type { ExternalStep } from '../../src/types' describe(path.basename(__filename).split('.')[0] + ':', () => { before(() => { - mock.init(lw, 'file', 'root') + mock.init(lw) }) after(() => { diff --git a/test/units/08_compile_build.test.ts b/test/units/08_compile_build.test.ts index 9fbcaf79f..ad19fd18f 100644 --- a/test/units/08_compile_build.test.ts +++ b/test/units/08_compile_build.test.ts @@ -14,9 +14,9 @@ describe(path.basename(__filename).split('.')[0] + ':', () => { let findStub: sinon.SinonStub before(() => { - mock.init(lw, 'file', 'root') + mock.init(lw) ;(lw.cache.getIncludedTeX as sinon.SinonStub).returns([get.path('main.tex')]) - findStub = sinon.stub(lw.root, 'find') + findStub = lw.root.find as sinon.SinonStub ;(lw.extra.clean as sinon.SinonStub).resolves(Promise.resolve()) }) @@ -529,6 +529,8 @@ describe(path.basename(__filename).split('.')[0] + ':', () => { it('should auto-build when watched bib file is changed', () => { set.config('latex.autoBuild.run', 'onFileChange') + // Prevent an uncaught promise rejection at citation.parseBibFile + const stub = sinon.stub(lw.external, 'stat').resolves({ type: vscode.FileType.File, ctime: 0, mtime: 0, size: Number.MAX_SAFE_INTEGER }) log.start() for (const handler of lw.watcher.bib['onChangeHandlers']) { @@ -538,6 +540,7 @@ describe(path.basename(__filename).split('.')[0] + ':', () => { } log.stop() + stub.restore() assert.hasLog(`Auto build started detecting the change of a file: ${get.path('main.bib')}`) }) }) diff --git a/test/units/09_viewer_server.test.ts b/test/units/09_viewer_server.test.ts index 6a57d3b34..12f843a52 100644 --- a/test/units/09_viewer_server.test.ts +++ b/test/units/09_viewer_server.test.ts @@ -13,7 +13,7 @@ describe(path.basename(__filename).split('.')[0] + ':', () => { let websocket: ws.WebSocket before(async () => { - mock.init(lw, 'file', 'root', 'server') + mock.init(lw, 'server') handlerStub = lw.viewer.handler as sinon.SinonStub await connectWs() }) diff --git a/test/units/10_viewer_pdf_server.test.ts b/test/units/10_viewer_pdf_server.test.ts index fab61c415..17d240704 100644 --- a/test/units/10_viewer_pdf_server.test.ts +++ b/test/units/10_viewer_pdf_server.test.ts @@ -16,7 +16,7 @@ describe(path.basename(__filename).split('.')[0] + ':', () => { let handlerSpy: sinon.SinonSpy before(() => { - mock.init(lw, 'file', 'root', 'server', 'viewer') + mock.init(lw, 'server', 'viewer') handlerSpy = sinon.spy(lw.viewer, 'handler') }) diff --git a/test/units/11_parser_tex.test.ts b/test/units/11_parser_tex.test.ts index 1e687cea5..0a8d023f0 100644 --- a/test/units/11_parser_tex.test.ts +++ b/test/units/11_parser_tex.test.ts @@ -7,7 +7,7 @@ import type * as Ast from '@unified-latex/unified-latex-types' describe(path.basename(__filename).split('.')[0] + ':', () => { before(() => { - mock.init(lw, 'file', 'root', 'parser') + mock.init(lw, 'parser') }) after(() => { diff --git a/test/units/12_parser_log.test.ts b/test/units/12_parser_log.test.ts index 75ff5bcea..247b0d0e6 100644 --- a/test/units/12_parser_log.test.ts +++ b/test/units/12_parser_log.test.ts @@ -9,7 +9,7 @@ import { latexLogParser } from '../../src/parse/parser/latexlog' describe(path.basename(__filename).split('.')[0] + ':', () => { before(() => { - mock.init(lw, 'file', 'root', 'parser') + mock.init(lw, 'parser') }) after(() => { diff --git a/test/units/13_completion_latex.test.ts b/test/units/13_completion_latex.test.ts new file mode 100644 index 000000000..6c572e30e --- /dev/null +++ b/test/units/13_completion_latex.test.ts @@ -0,0 +1,14 @@ +import * as path from 'path' +import * as sinon from 'sinon' +import { lw } from '../../src/lw' +import { mock } from './utils' + +describe(path.basename(__filename).split('.')[0] + ':', () => { + before(() => { + mock.init(lw, 'root', 'completion') + }) + + after(() => { + sinon.restore() + }) +}) diff --git a/test/units/utils.ts b/test/units/utils.ts index 2dd58d99e..32db2b828 100644 --- a/test/units/utils.ts +++ b/test/units/utils.ts @@ -147,7 +147,7 @@ export const mock = { : Object.getOwnPropertyNames(Object.getPrototypeOf(obj)) items.forEach(item => { // Don't stub the unit to be tested or the logging/external functions. - if (ignore.includes(item) || ['log', 'external', 'constant'].includes(item)) { + if (ignore.includes(item) || ['file', 'log', 'external', 'constant'].includes(item)) { return } if (typeof obj[item] === 'object') {