From 164b77646a1af681aeb1d309a35fccab15a91b16 Mon Sep 17 00:00:00 2001 From: Guillaume Grossetie Date: Sat, 25 Nov 2023 13:56:32 +0100 Subject: [PATCH] Fix glob pattern while building the content catalog (#827) --- examples/.vscode/settings.json | 2 + .../antora/contributing.adoc | 0 .../antora/multiComponents/README.adoc | 0 .../antora/multiComponents/api/antora.yml | 0 .../api/modules/auth/pages/jwt/page2.adoc | 0 .../pages/modules/multiComponents/page6.adoc | 0 .../api/modules/auth/pages/modules/page4.adoc | 0 .../api/modules/auth/pages/page3.adoc | 0 .../api/modules/writer-guide.adoc | 0 .../antora/multiComponents/cli/antora.yml | 0 .../cli/modules/commands/images/seaswell.png | Bin .../cli/modules/commands/pages/page1.adoc | 0 .../modules/api/docs/antora.yml | 0 .../modules/asciidoc/pages/modules/page5.adoc | 0 .../asciidoctorWebViewConverterTest.adoc | 0 {test-workspace => examples}/attributes.adoc | 0 .../css/asciidoctor.css | 0 {test-workspace => examples}/diagrams.adoc | 0 {test-workspace => examples}/footer.txt | 0 {test-workspace => examples}/full.adoc | 0 {test-workspace => examples}/graphviz.adoc | 0 {test-workspace => examples}/image.adoc | 0 .../images/web-console.png | Bin {test-workspace => examples}/include.adoc | 0 {test-workspace => examples}/script.pl | 0 {test-workspace => examples}/simple.adoc | 0 {test-workspace => examples}/toc.adoc | 0 src/features/antora/antoraSupport.ts | 6 +- src/test/antoraCompletionProvider.test.ts | 74 +++++--- src/test/antoraSupport.test.ts | 179 +++++++++++++----- src/test/asciidocParser.test.ts | 51 +++-- src/test/asciidoctorWebViewConverter.test.ts | 23 ++- src/test/asciidoctorconfig.test.ts | 29 +-- src/test/workspaceHelper.ts | 12 ++ test-workspace/.gitkeep | 0 35 files changed, 261 insertions(+), 115 deletions(-) create mode 100644 examples/.vscode/settings.json rename {test-workspace => examples}/antora/contributing.adoc (100%) rename {test-workspace => examples}/antora/multiComponents/README.adoc (100%) rename {test-workspace => examples}/antora/multiComponents/api/antora.yml (100%) rename {test-workspace => examples}/antora/multiComponents/api/modules/auth/pages/jwt/page2.adoc (100%) rename {test-workspace => examples}/antora/multiComponents/api/modules/auth/pages/modules/multiComponents/page6.adoc (100%) rename {test-workspace => examples}/antora/multiComponents/api/modules/auth/pages/modules/page4.adoc (100%) rename {test-workspace => examples}/antora/multiComponents/api/modules/auth/pages/page3.adoc (100%) rename {test-workspace => examples}/antora/multiComponents/api/modules/writer-guide.adoc (100%) rename {test-workspace => examples}/antora/multiComponents/cli/antora.yml (100%) rename {test-workspace => examples}/antora/multiComponents/cli/modules/commands/images/seaswell.png (100%) rename {test-workspace => examples}/antora/multiComponents/cli/modules/commands/pages/page1.adoc (100%) rename {test-workspace => examples}/antora/multiComponents/modules/api/docs/antora.yml (100%) rename {test-workspace => examples}/antora/multiComponents/modules/api/docs/modules/asciidoc/pages/modules/page5.adoc (100%) rename {test-workspace => examples}/asciidoctorWebViewConverterTest.adoc (100%) rename {test-workspace => examples}/attributes.adoc (100%) rename {test-workspace => examples}/css/asciidoctor.css (100%) rename {test-workspace => examples}/diagrams.adoc (100%) rename {test-workspace => examples}/footer.txt (100%) rename {test-workspace => examples}/full.adoc (100%) rename {test-workspace => examples}/graphviz.adoc (100%) rename {test-workspace => examples}/image.adoc (100%) rename {test-workspace => examples}/images/web-console.png (100%) rename {test-workspace => examples}/include.adoc (100%) rename {test-workspace => examples}/script.pl (100%) rename {test-workspace => examples}/simple.adoc (100%) rename {test-workspace => examples}/toc.adoc (100%) create mode 100644 test-workspace/.gitkeep diff --git a/examples/.vscode/settings.json b/examples/.vscode/settings.json new file mode 100644 index 00000000..7a73a41b --- /dev/null +++ b/examples/.vscode/settings.json @@ -0,0 +1,2 @@ +{ +} \ No newline at end of file diff --git a/test-workspace/antora/contributing.adoc b/examples/antora/contributing.adoc similarity index 100% rename from test-workspace/antora/contributing.adoc rename to examples/antora/contributing.adoc diff --git a/test-workspace/antora/multiComponents/README.adoc b/examples/antora/multiComponents/README.adoc similarity index 100% rename from test-workspace/antora/multiComponents/README.adoc rename to examples/antora/multiComponents/README.adoc diff --git a/test-workspace/antora/multiComponents/api/antora.yml b/examples/antora/multiComponents/api/antora.yml similarity index 100% rename from test-workspace/antora/multiComponents/api/antora.yml rename to examples/antora/multiComponents/api/antora.yml diff --git a/test-workspace/antora/multiComponents/api/modules/auth/pages/jwt/page2.adoc b/examples/antora/multiComponents/api/modules/auth/pages/jwt/page2.adoc similarity index 100% rename from test-workspace/antora/multiComponents/api/modules/auth/pages/jwt/page2.adoc rename to examples/antora/multiComponents/api/modules/auth/pages/jwt/page2.adoc diff --git a/test-workspace/antora/multiComponents/api/modules/auth/pages/modules/multiComponents/page6.adoc b/examples/antora/multiComponents/api/modules/auth/pages/modules/multiComponents/page6.adoc similarity index 100% rename from test-workspace/antora/multiComponents/api/modules/auth/pages/modules/multiComponents/page6.adoc rename to examples/antora/multiComponents/api/modules/auth/pages/modules/multiComponents/page6.adoc diff --git a/test-workspace/antora/multiComponents/api/modules/auth/pages/modules/page4.adoc b/examples/antora/multiComponents/api/modules/auth/pages/modules/page4.adoc similarity index 100% rename from test-workspace/antora/multiComponents/api/modules/auth/pages/modules/page4.adoc rename to examples/antora/multiComponents/api/modules/auth/pages/modules/page4.adoc diff --git a/test-workspace/antora/multiComponents/api/modules/auth/pages/page3.adoc b/examples/antora/multiComponents/api/modules/auth/pages/page3.adoc similarity index 100% rename from test-workspace/antora/multiComponents/api/modules/auth/pages/page3.adoc rename to examples/antora/multiComponents/api/modules/auth/pages/page3.adoc diff --git a/test-workspace/antora/multiComponents/api/modules/writer-guide.adoc b/examples/antora/multiComponents/api/modules/writer-guide.adoc similarity index 100% rename from test-workspace/antora/multiComponents/api/modules/writer-guide.adoc rename to examples/antora/multiComponents/api/modules/writer-guide.adoc diff --git a/test-workspace/antora/multiComponents/cli/antora.yml b/examples/antora/multiComponents/cli/antora.yml similarity index 100% rename from test-workspace/antora/multiComponents/cli/antora.yml rename to examples/antora/multiComponents/cli/antora.yml diff --git a/test-workspace/antora/multiComponents/cli/modules/commands/images/seaswell.png b/examples/antora/multiComponents/cli/modules/commands/images/seaswell.png similarity index 100% rename from test-workspace/antora/multiComponents/cli/modules/commands/images/seaswell.png rename to examples/antora/multiComponents/cli/modules/commands/images/seaswell.png diff --git a/test-workspace/antora/multiComponents/cli/modules/commands/pages/page1.adoc b/examples/antora/multiComponents/cli/modules/commands/pages/page1.adoc similarity index 100% rename from test-workspace/antora/multiComponents/cli/modules/commands/pages/page1.adoc rename to examples/antora/multiComponents/cli/modules/commands/pages/page1.adoc diff --git a/test-workspace/antora/multiComponents/modules/api/docs/antora.yml b/examples/antora/multiComponents/modules/api/docs/antora.yml similarity index 100% rename from test-workspace/antora/multiComponents/modules/api/docs/antora.yml rename to examples/antora/multiComponents/modules/api/docs/antora.yml diff --git a/test-workspace/antora/multiComponents/modules/api/docs/modules/asciidoc/pages/modules/page5.adoc b/examples/antora/multiComponents/modules/api/docs/modules/asciidoc/pages/modules/page5.adoc similarity index 100% rename from test-workspace/antora/multiComponents/modules/api/docs/modules/asciidoc/pages/modules/page5.adoc rename to examples/antora/multiComponents/modules/api/docs/modules/asciidoc/pages/modules/page5.adoc diff --git a/test-workspace/asciidoctorWebViewConverterTest.adoc b/examples/asciidoctorWebViewConverterTest.adoc similarity index 100% rename from test-workspace/asciidoctorWebViewConverterTest.adoc rename to examples/asciidoctorWebViewConverterTest.adoc diff --git a/test-workspace/attributes.adoc b/examples/attributes.adoc similarity index 100% rename from test-workspace/attributes.adoc rename to examples/attributes.adoc diff --git a/test-workspace/css/asciidoctor.css b/examples/css/asciidoctor.css similarity index 100% rename from test-workspace/css/asciidoctor.css rename to examples/css/asciidoctor.css diff --git a/test-workspace/diagrams.adoc b/examples/diagrams.adoc similarity index 100% rename from test-workspace/diagrams.adoc rename to examples/diagrams.adoc diff --git a/test-workspace/footer.txt b/examples/footer.txt similarity index 100% rename from test-workspace/footer.txt rename to examples/footer.txt diff --git a/test-workspace/full.adoc b/examples/full.adoc similarity index 100% rename from test-workspace/full.adoc rename to examples/full.adoc diff --git a/test-workspace/graphviz.adoc b/examples/graphviz.adoc similarity index 100% rename from test-workspace/graphviz.adoc rename to examples/graphviz.adoc diff --git a/test-workspace/image.adoc b/examples/image.adoc similarity index 100% rename from test-workspace/image.adoc rename to examples/image.adoc diff --git a/test-workspace/images/web-console.png b/examples/images/web-console.png similarity index 100% rename from test-workspace/images/web-console.png rename to examples/images/web-console.png diff --git a/test-workspace/include.adoc b/examples/include.adoc similarity index 100% rename from test-workspace/include.adoc rename to examples/include.adoc diff --git a/test-workspace/script.pl b/examples/script.pl similarity index 100% rename from test-workspace/script.pl rename to examples/script.pl diff --git a/test-workspace/simple.adoc b/examples/simple.adoc similarity index 100% rename from test-workspace/simple.adoc rename to examples/simple.adoc diff --git a/test-workspace/toc.adoc b/examples/toc.adoc similarity index 100% rename from test-workspace/toc.adoc rename to examples/toc.adoc diff --git a/src/features/antora/antoraSupport.ts b/src/features/antora/antoraSupport.ts index 0b77a882..1349f0f7 100644 --- a/src/features/antora/antoraSupport.ts +++ b/src/features/antora/antoraSupport.ts @@ -270,7 +270,8 @@ export async function getAntoraDocumentContext (textDocumentUri: Uri, workspaceS .map(async (antoraConfig) => { const workspaceFolder = getWorkspaceFolder(antoraConfig.uri) const workspaceRelative = posixpath.relative(workspaceFolder.uri.path, antoraConfig.contentSourceRootPath) - const files = await Promise.all((await vscode.workspace.findFiles(workspaceRelative + '/modules/*/{attachments,examples,images,pages,partials,assets}/**')).map(async (file) => { + const globPattern = 'modules/*/{attachments,examples,images,pages,partials,assets}/**' + const files = await Promise.all((await vscode.workspace.findFiles(`${workspaceRelative ? `${workspaceRelative}/` : ''}${globPattern}`)).map(async (file) => { const contentSourceRootPath = antoraConfig.contentSourceRootPath return { base: contentSourceRootPath, @@ -288,13 +289,12 @@ export async function getAntoraDocumentContext (textDocumentUri: Uri, workspaceS }, } })) - const contentAggregate = { + return { name: antoraConfig.config.name, version: antoraConfig.config.version, ...antoraConfig.config, files, } - return contentAggregate }))) let classifyContent = await import('@antora/content-classifier') if ('default' in classifyContent) { diff --git a/src/test/antoraCompletionProvider.test.ts b/src/test/antoraCompletionProvider.test.ts index 5841b818..a17fb172 100644 --- a/src/test/antoraCompletionProvider.test.ts +++ b/src/test/antoraCompletionProvider.test.ts @@ -3,33 +3,61 @@ import * as vscode from 'vscode' import assert from 'assert' import AntoraCompletionProvider from '../features/antora/antoraCompletionProvider' import { Position } from 'vscode' -import { getDefaultWorkspaceFolderUri } from '../util/workspace' - -let workspaceUri +import { createDirectory, createFile, disableAntoraSupport, enableAntoraSupport, removeFiles } from './workspaceHelper' suite('Antora CompletionsProvider', () => { - setup(() => { - workspaceUri = getDefaultWorkspaceFolderUri() + const createdFiles: vscode.Uri[] = [] + suiteSetup(async () => { + createdFiles.push(await createDirectory('docs')) + await createFile(`name: "api" +version: "1.0" +title: Antora +asciidoc: + attributes: + source-language: asciidoc@ + xrefstyle: short@ + example-caption: false +`, 'docs', 'api', 'antora.yml') + + createdFiles.push(await createFile('', 'help.adoc')) + const asciidocFile = await createFile(`image::images/ocean/waves/seaswell.png[] + +image::images/mountain.jpeg[] + +link:help.adoc[] +`, 'asciidoctorWebViewConverterTest.adoc') + createdFiles.push(asciidocFile) + }) + suiteTeardown(async () => { + await removeFiles(createdFiles) }) test('Should return completion items', async () => { - const provider = new AntoraCompletionProvider() - const file = await vscode.workspace.openTextDocument(vscode.Uri.joinPath(workspaceUri, 'antora', 'multiComponents', 'api', 'modules', 'auth', 'pages', 'jwt', 'page2.adoc')) - const completionsItems = await provider.provideCompletionItems(file, new Position(3, 1)) - assert.deepStrictEqual(completionsItems[0].label, { - description: 'asciidoc@', - label: 'source-language', - }) - assert.strictEqual(completionsItems[0].insertText, '{asciidoc@}') - assert.deepStrictEqual(completionsItems[1].label, { - description: 'short@', - label: 'xrefstyle', - }) - assert.strictEqual(completionsItems[1].insertText, '{short@}') - assert.deepStrictEqual(completionsItems[2].label, { - description: false, - label: 'example-caption', + try { + const provider = new AntoraCompletionProvider() + const file = await createFile(`= JWT Token + +`, 'docs', 'api', 'modules', 'auth', 'pages', 'jwt', 'index.adoc') + const textDocument = await vscode.workspace.openTextDocument(file) + await enableAntoraSupport() + const completionsItems = await provider.provideCompletionItems(textDocument, new Position(2, 1)) + assert.deepStrictEqual(completionsItems[0].label, { + description: 'asciidoc@', + label: 'source-language', + }) + assert.strictEqual(completionsItems[0].insertText, '{asciidoc@}') + assert.deepStrictEqual(completionsItems[1].label, { + description: 'short@', + label: 'xrefstyle', + }) + assert.strictEqual(completionsItems[1].insertText, '{short@}') + assert.deepStrictEqual(completionsItems[2].label, { + description: false, + label: 'example-caption', - }) - assert.strictEqual(completionsItems[2].insertText, '{false}') + }) + assert.strictEqual(completionsItems[2].insertText, '{false}') + } finally { + await disableAntoraSupport() + } }) }) diff --git a/src/test/antoraSupport.test.ts b/src/test/antoraSupport.test.ts index 92f88069..55b7bbec 100644 --- a/src/test/antoraSupport.test.ts +++ b/src/test/antoraSupport.test.ts @@ -3,14 +3,11 @@ import * as vscode from 'vscode' import * as assert from 'assert' import 'mocha' import { findAntoraConfigFile, getAntoraDocumentContext } from '../features/antora/antoraSupport' -import { createDirectories, createDirectory, createFile, createLink, removeFiles } from './workspaceHelper' +import { createDirectories, createDirectory, createFile, createLink, disableAntoraSupport, enableAntoraSupport, removeFiles } from './workspaceHelper' import { extensionContext } from './helper' import { getDefaultWorkspaceFolderUri } from '../util/workspace' -async function testGetAntoraConfig ({ - asciidocPathUri, - antoraConfigExpectedUri, -}) { +async function testGetAntoraConfig ({ asciidocPathUri, antoraConfigExpectedUri }) { const antoraConfigUri = await findAntoraConfigFile(asciidocPathUri) if (antoraConfigExpectedUri === undefined) { assert.strictEqual(antoraConfigUri, undefined) @@ -25,51 +22,107 @@ async function testGetAntoraConfig ({ } } -suite('Antora Support', () => { - const workspaceUri = getDefaultWorkspaceFolderUri() - const testCases = [ - { - title: 'Should return Antora config for document inside "pages" directory which is inside another directory', - asciidocPathSegments: ['antora', 'multiComponents', 'cli', 'modules', 'commands', 'pages', 'page1.adoc'], - antoraConfigExpectedPathSegments: ['antora', 'multiComponents', 'cli', 'antora.yml'], - }, - { +suite('Antora support with multi-documentation components', () => { + const createdFiles = [] + const testCases = [] + suiteSetup(async () => { + createdFiles.push(await createDirectory('docs')) + // documentation component: docs/multiComponents/api + const apiDocumentationComponentPaths = ['docs', 'multiComponents', 'api'] + const apiAntoraPaths = [...apiDocumentationComponentPaths, 'antora.yml'] + await createFile(`name: "api" +version: "1.0" +`, ...apiAntoraPaths) + const endpointsPaths = [...apiDocumentationComponentPaths, 'modules', 'auth', 'pages', 'endpoints.adoc'] + await createFile('= Endpoints', ...endpointsPaths) + const ssoPaths = [...apiDocumentationComponentPaths, 'modules', 'auth', 'pages', '3rd-party', 'sso.adoc'] + await createFile('= Single Sign On', ...ssoPaths) + const tokenBasedPaths = [...apiDocumentationComponentPaths, 'modules', 'auth', 'pages', 'modules', 'token-based.adoc'] + await createFile('= Token Based', ...tokenBasedPaths) + const patPaths = [...apiDocumentationComponentPaths, 'modules', 'auth', 'pages', 'modules', 'token', 'pat.adoc'] + await createFile('= Personal Access Token', ...patPaths) + //await createFile('= Client Id & Client Secret', ...[...apiDocumentationComponentPaths, 'modules', 'auth', 'pages', 'modules', 'credentials', 'secret.adoc']) + testCases.push({ + title: 'Should return Antora config for document inside a "modules" subdirectory', + asciidocPathSegments: tokenBasedPaths, + antoraConfigExpectedPathSegments: apiAntoraPaths, + }) + testCases.push({ title: 'Should return Antora config for document inside "pages" directory', - asciidocPathSegments: ['antora', 'multiComponents', 'api', 'modules', 'auth', 'pages', 'page3.adoc'], - antoraConfigExpectedPathSegments: ['antora', 'multiComponents', 'api', 'antora.yml'], - }, - { + asciidocPathSegments: endpointsPaths, + antoraConfigExpectedPathSegments: apiAntoraPaths, + }) + testCases.push({ title: 'Should return Antora config for document inside a subdirectory', - asciidocPathSegments: ['antora', 'multiComponents', 'api', 'modules', 'auth', 'pages', 'jwt', 'page2.adoc'], - antoraConfigExpectedPathSegments: ['antora', 'multiComponents', 'api', 'antora.yml'], - }, - { - title: 'Should return Antora config for document inside a "modules" subdirectory', - asciidocPathSegments: ['antora', 'multiComponents', 'api', 'modules', 'auth', 'pages', 'modules', 'page4.adoc'], - antoraConfigExpectedPathSegments: ['antora', 'multiComponents', 'api', 'antora.yml'], - }, - { - title: 'Should return Antora config for document inside a "modules" directory which is inside an Antora modules in a component named "modules"', - asciidocPathSegments: ['antora', 'multiComponents', 'modules', 'api', 'docs', 'modules', 'asciidoc', 'pages', 'modules', 'page5.adoc'], - antoraConfigExpectedPathSegments: ['antora', 'multiComponents', 'modules', 'api', 'docs', 'antora.yml'], - }, - { + asciidocPathSegments: ssoPaths, + antoraConfigExpectedPathSegments: apiAntoraPaths, + }) + testCases.push({ title: 'Should return Antora config for document inside a directory which has the same name as the workspace', - asciidocPathSegments: ['antora', 'multiComponents', 'api', 'modules', 'auth', 'pages', 'modules', 'multiComponents', 'page6.adoc'], - antoraConfigExpectedPathSegments: ['antora', 'multiComponents', 'api', 'antora.yml'], - }, - { + asciidocPathSegments: patPaths, + antoraConfigExpectedPathSegments: apiAntoraPaths, + }) + + // documentation component: docs/multiComponents/cli + const cliDocumentationComponentPaths = ['docs', 'multiComponents', 'cli'] + const cliAntoraPaths = [...cliDocumentationComponentPaths, 'antora.yml'] + await createFile(`name: "cli" +version: "2.0" +`, ...cliAntoraPaths) + await createFile('', ...[...cliDocumentationComponentPaths, 'modules', 'commands', 'images', 'output.png']) + const convertPaths = [...cliDocumentationComponentPaths, 'module', 'commands', 'pages', 'convert.adoc'] + await createFile(`= Convert Command + +image::2.0@cli:commands:output.png[] + +image::commands:output.png[] + +image::output.png[] +`, ...convertPaths) + testCases.push({ + title: 'Should return Antora config for document inside "pages" directory which is inside another directory', + asciidocPathSegments: convertPaths, + antoraConfigExpectedPathSegments: cliAntoraPaths, + }) + + // documentation component: docs/multiComponents/modules/api/docs/modules + const modulesDocumentationComponentPaths = ['docs', 'multiComponents', 'modules', 'api', 'docs', 'modules'] + const modulesAntoraPaths = [...modulesDocumentationComponentPaths, 'antora.yml'] + await createFile(`name: asciidoc +version: ~ + `, ...modulesAntoraPaths) + const admonitionPagePaths = [...modulesDocumentationComponentPaths, 'blocks', 'pages', 'admonition.adoc'] + await createFile(`= Admonition Block + +`, ...admonitionPagePaths) + testCases.push({ + title: 'Should return Antora config for document inside a "modules" directory which is inside an Antora modules in a component named "modules"', + asciidocPathSegments: admonitionPagePaths, + antoraConfigExpectedPathSegments: modulesAntoraPaths, + }) + + // outside documentation modules + const writerGuidePaths = ['docs', 'multiComponents', 'api', 'modules', 'writer-guide.adoc'] + await createFile('= Writer Guide', ...writerGuidePaths) + testCases.push({ title: 'Should not return Antora config for document outside "modules" Antora folder', - asciidocPathSegments: ['antora', 'multiComponents', 'api', 'modules', 'writer-guide.adoc'], + asciidocPathSegments: writerGuidePaths, antoraConfigExpectedPathSegments: undefined, - }, - { - title: 'Should not return Antora config for document outside of workspace', - asciidocPathSegments: ['antora', 'contributing.adoc'], + }) + const contributingPaths = ['docs', 'contributing.adoc'] + await createFile('= Contributing', ...contributingPaths) + testCases.push({ + title: 'Should not return Antora config for document outside of documentation modules', + asciidocPathSegments: contributingPaths, antoraConfigExpectedPathSegments: undefined, - }, - ] + }) + }) + + suiteTeardown(async () => { + await removeFiles(createdFiles) + }) + const workspaceUri = getDefaultWorkspaceFolderUri() for (const testCase of testCases) { test(testCase.title, async () => testGetAntoraConfig({ asciidocPathUri: vscode.Uri.joinPath(workspaceUri, ...testCase.asciidocPathSegments), @@ -92,11 +145,8 @@ suite('Antora Support', () => { version: '7.1' `, 'antora-test', 'docs', 'antora.yml') // enable Antora support - const workspaceConfiguration = vscode.workspace.getConfiguration('asciidoc', null) - await workspaceConfiguration.update('antora.enableAntoraSupport', true) + await enableAntoraSupport() const workspaceState = extensionContext.workspaceState - await workspaceState.update('antoraSupportSetting', true) - // GO! const result = await getAntoraDocumentContext(asciidocFile, workspaceState) const components = result.getComponents() assert.strictEqual(components !== undefined, true, 'Components must not be undefined') @@ -108,9 +158,40 @@ version: '7.1' throw err } finally { await removeFiles(createdFiles) - await extensionContext.workspaceState.update('antoraSupportSetting', undefined) - await vscode.workspace.getConfiguration('asciidoc', null).update('antora.enableAntoraSupport', undefined) + await disableAntoraSupport() } } }) }) + +suite('Antora support with single documentation component', () => { + test('Should build content catalog', async () => { + const createdFiles = [] + try { + createdFiles.push(await createDirectory('modules')) + await createDirectories('modules', 'ROOT', 'pages') + const asciidocFile = await createFile('image:mountain.jpeg[]', 'modules', 'ROOT', 'pages', 'landscape.adoc') + createdFiles.push(asciidocFile) + createdFiles.push(await createFile('', 'modules', 'ROOT', 'images', 'mountain.jpeg')) + createdFiles.push(await createFile(`name: ROOT +version: ~ +`, 'antora.yml')) + await enableAntoraSupport() + const workspaceState = extensionContext.workspaceState + const result = await getAntoraDocumentContext(asciidocFile, workspaceState) + const images = result.getImages() + assert.strictEqual(images !== undefined, true, 'Images must not be undefined') + assert.strictEqual(images.length > 0, true, 'Must contains one image') + assert.strictEqual(images[0].src.basename, 'mountain.jpeg') + assert.strictEqual(images[0].src.component, 'ROOT') + assert.strictEqual(images[0].src.family, 'image') + assert.strictEqual(images[0].src.version, null) + } catch (err) { + console.error('Something bad happened!', err) + throw err + } finally { + await removeFiles(createdFiles) + await disableAntoraSupport() + } + }) +}) diff --git a/src/test/asciidocParser.test.ts b/src/test/asciidocParser.test.ts index 701dc7bc..f0c73618 100644 --- a/src/test/asciidocParser.test.ts +++ b/src/test/asciidocParser.test.ts @@ -10,7 +10,7 @@ import { AsciidoctorExtensions } from '../features/asciidoctorExtensions' import { AsciidoctorDiagnostic } from '../features/asciidoctorDiagnostic' import { AsciidoctorExtensionsSecurityPolicyArbiter } from '../security' import { InMemoryDocument } from './inMemoryDocument' -import { getDefaultWorkspaceFolderUri } from '../util/workspace' +import { createDirectory, createFile, disableAntoraSupport, enableAntoraSupport, removeFiles } from './workspaceHelper' class TestWebviewResourceProvider implements WebviewResourceProvider { asWebviewUri (resource: vscode.Uri): vscode.Uri { @@ -48,24 +48,37 @@ class AsciidocContributionProviderTest implements AsciidocContributionProvider { suite('AsciiDoc parser with Antora support enabled', function () { this.timeout(60000) - const workspaceUri = getDefaultWorkspaceFolderUri() test('convert Antora page', async () => { - await extensionContext.workspaceState.update('antoraSupportSetting', true) - await vscode.workspace.getConfiguration('asciidoc', null).update('antora.enableAntoraSupport', true) - const asciidocParser = new AsciidocEngine( - new AsciidocContributionProviderTest(extensionContext.extensionUri), - new AsciidoctorConfig(), - new AsciidoctorExtensions(AsciidoctorExtensionsSecurityPolicyArbiter.activate(extensionContext)), - new AsciidoctorDiagnostic('test') - ) - const result = await asciidocParser.convertFromTextDocument( - new InMemoryDocument( - vscode.Uri.file(`${workspaceUri.path}/antora/multiComponents/api/modules/auth/pages/page.adoc`), - 'Download from the {url-vscode-marketplace}[Visual Studio Code Marketplace].' - ), - extensionContext, - new TestWebviewResourceProvider() - ) - assert.strictEqual(result.html.includes('

Download from the Visual Studio Code Marketplace.

'), true) + const createdFiles = [] + try { + createdFiles.push(await createDirectory('docs')) + await createFile(`name: "antora" +version: "1.1.1" +title: Antora +asciidoc: + attributes: + url-vscode-marketplace: https://marketplace.visualstudio.com/vscode +`, 'docs', 'antora.yml') + const asciidocFile = await createFile('', 'docs', 'modules', 'ROOT', 'pages', 'index.adoc') // virtual + await enableAntoraSupport() + const asciidocParser = new AsciidocEngine( + new AsciidocContributionProviderTest(extensionContext.extensionUri), + new AsciidoctorConfig(), + new AsciidoctorExtensions(AsciidoctorExtensionsSecurityPolicyArbiter.activate(extensionContext)), + new AsciidoctorDiagnostic('test') + ) + const result = await asciidocParser.convertFromTextDocument( + new InMemoryDocument( + asciidocFile, + 'Download from the {url-vscode-marketplace}[Visual Studio Code Marketplace].' + ), + extensionContext, + new TestWebviewResourceProvider() + ) + assert.strictEqual(result.html.includes('

Download from the Visual Studio Code Marketplace.

'), true) + } finally { + await removeFiles(createdFiles) + await disableAntoraSupport() + } }) }) diff --git a/src/test/asciidoctorWebViewConverter.test.ts b/src/test/asciidoctorWebViewConverter.test.ts index f98ac749..c4dea506 100644 --- a/src/test/asciidoctorWebViewConverter.test.ts +++ b/src/test/asciidoctorWebViewConverter.test.ts @@ -7,6 +7,7 @@ import assert from 'assert' import sinon from 'sinon' import { AntoraDocumentContext } from '../features/antora/antoraSupport' import { getDefaultWorkspaceFolderUri } from '../util/workspace' +import { createDirectory, createFile, removeFiles } from './workspaceHelper' const asciidoctor = require('@asciidoctor/core') const processor = asciidoctor() @@ -58,6 +59,26 @@ async function testAsciidoctorWebViewConverter ( } suite('AsciidoctorWebViewConverter', async () => { + const createdFiles: vscode.Uri[] = [] + suiteSetup(async () => { + createdFiles.push(await createDirectory('images')) + await createFile('', 'images', 'ocean', 'waves', 'seaswell.png') + await createFile('', 'images', 'mountain.jpeg') + createdFiles.push(await createFile('', 'help.adoc')) + const asciidocFile = await createFile(`image::images/ocean/waves/seaswell.png[] + +image::images/mountain.jpeg[] + +link:help.adoc[] +`, 'asciidoctorWebViewConverterTest.adoc') + createdFiles.push(await createDirectory('docs')) + await createFile('', 'docs', 'modules', 'ROOT', 'pages', 'dummy.adoc') // virtual file + createdFiles.push(asciidocFile) + }) + suiteTeardown(async () => { + await removeFiles(createdFiles) + }) + const workspaceUri = getDefaultWorkspaceFolderUri() // WIP need to find more interesting test cases const testCases = [ @@ -75,7 +96,7 @@ suite('AsciidoctorWebViewConverter', async () => { }, { title: 'Should resolve image src with Antora id\'s input and Antora support activated', - filePath: ['antora', 'multiComponents', 'cli', 'modules', 'commands', 'pages', 'page1.adoc'], + filePath: ['docs', 'modules', 'ROOT', 'pages', 'dummy.adoc'], input: 'image::2.0@cli:commands:seaswell.png[]', antoraDocumentContext: createAntoraDocumentContextStub(`${workspaceUri.path}/antora/multiComponents/cli/modules/commands/images/seaswell.png`), expected: `
diff --git a/src/test/asciidoctorconfig.test.ts b/src/test/asciidoctorconfig.test.ts index 201c5f92..405acd15 100644 --- a/src/test/asciidoctorconfig.test.ts +++ b/src/test/asciidoctorconfig.test.ts @@ -10,7 +10,7 @@ import { AsciidocEngine } from '../asciidocEngine' import { AsciidoctorConfig } from '../features/asciidoctorConfig' import { AsciidoctorExtensions } from '../features/asciidoctorExtensions' import { AsciidoctorDiagnostic } from '../features/asciidoctorDiagnostic' -import { createFile } from './workspaceHelper' +import { createDirectory, createFile, removeFiles } from './workspaceHelper' import { getDefaultWorkspaceFolderUri } from '../util/workspace' class EmptyAsciidocContributions implements AsciidocContributions { @@ -144,23 +144,15 @@ suite('asciidoc.Asciidoctorconfig', () => { :root-and-level1: Value of root-and-level1 specified in root. Should not appear. :root-and-level1-and-level2: Value of root-and-level1-and-level2 specified in root. Should not appear.`)) createdFiles.push(rootConfigFile) - - const level1ConfigFile = vscode.Uri.joinPath(workspaceUri, 'level-empty', 'level1', configFileName) - await vscode.workspace.fs.writeFile(level1ConfigFile, Buffer.from( + createdFiles.push(await createDirectory('level-empty')) + await createFile( `:only-level1: Only level 1. Should appear. :root-and-level1: Value of root-and-level1 specified in level1. Should appear. -:root-and-level1-and-level2: Value of root-and-level1-and-level2 specified in level1. Should not appear.`)) - createdFiles.push(level1ConfigFile) - - const level2ConfigFile = vscode.Uri.joinPath(workspaceUri, 'level-empty', 'level1', 'level2', configFileName) - await vscode.workspace.fs.writeFile(level2ConfigFile, Buffer.from( +:root-and-level1-and-level2: Value of root-and-level1-and-level2 specified in level1. Should not appear.`, 'level-empty', 'level1', configFileName) + await createFile( `:only-level2: Only level 2. Should appear. -:root-and-level1-and-level2: Value of root-and-level1-and-level2 specified in level2. Should appear.`)) - createdFiles.push(level2ConfigFile) - - const adocFile = vscode.Uri.joinPath(workspaceUri, 'level-empty', 'level1', 'level2', 'fileToTestRecursiveAsciidoctorConfigs.adoc') - await vscode.workspace.fs.writeFile(adocFile, Buffer.from( - `{only-root} +:root-and-level1-and-level2: Value of root-and-level1-and-level2 specified in level2. Should appear.`, 'level-empty', 'level1', 'level2', configFileName) + const adocFile = await createFile(`{only-root} {only-level1} @@ -169,8 +161,7 @@ suite('asciidoc.Asciidoctorconfig', () => { {root-and-level1} {root-and-level1-and-level2} - `)) - createdFiles.push(adocFile) + `, 'level-empty', 'level1', 'level2', 'fileToTestRecursiveAsciidoctorConfigs.adoc') const textDocument = await vscode.workspace.openTextDocument(adocFile) const asciidocParser = new AsciidocEngine( @@ -183,9 +174,7 @@ suite('asciidoc.Asciidoctorconfig', () => { }) suiteTeardown(async () => { - for (const createdFile of createdFiles) { - await vscode.workspace.fs.delete(createdFile) - } + await removeFiles(createdFiles) }) test('Var from root level is substituted', async () => { diff --git a/src/test/workspaceHelper.ts b/src/test/workspaceHelper.ts index 8589a50d..56a6c164 100644 --- a/src/test/workspaceHelper.ts +++ b/src/test/workspaceHelper.ts @@ -1,5 +1,6 @@ import vscode, { FileSystemError, FileType } from 'vscode' import { getDefaultWorkspaceFolderUri, normalizeUri } from '../util/workspace' +import { extensionContext } from './helper' export async function removeFiles (files: vscode.Uri[]) { for (const file of files) { @@ -64,3 +65,14 @@ export async function createLink (existingPathSegments: string[], newPathSegment await fs.symlink(existingPath.fsPath, newPath.fsPath) return normalizeUri(newPath) } + +export async function enableAntoraSupport () { + const workspaceConfiguration = vscode.workspace.getConfiguration('asciidoc', null) + await workspaceConfiguration.update('antora.enableAntoraSupport', true) + await extensionContext.workspaceState.update('antoraSupportSetting', true) +} + +export async function disableAntoraSupport () { + await extensionContext.workspaceState.update('antoraSupportSetting', undefined) + await vscode.workspace.getConfiguration('asciidoc', null).update('antora.enableAntoraSupport', undefined) +} diff --git a/test-workspace/.gitkeep b/test-workspace/.gitkeep new file mode 100644 index 00000000..e69de29b