docusaurus/packages/docusaurus-plugin-content-docs/src/__tests__/slug.test.ts

237 lines
6.2 KiB
TypeScript

/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
import getSlug from '../slug';
describe('getSlug', () => {
it('defaults to dirname/id', () => {
expect(
getSlug({
baseID: 'doc',
source: '@site/docs/dir/doc.md',
sourceDirName: '/dir',
}),
).toBe('/dir/doc');
expect(
getSlug({
baseID: 'doc',
source: '@site/docs/dir/subdir/doc.md',
sourceDirName: '/dir/subdir',
}),
).toBe('/dir/subdir/doc');
});
it('handles conventional doc indexes', () => {
expect(
getSlug({
baseID: 'doc',
source: '@site/docs/dir/subdir/index.md',
sourceDirName: '/dir/subdir',
}),
).toBe('/dir/subdir/');
expect(
getSlug({
baseID: 'doc',
source: '@site/docs/dir/subdir/inDEx.mdx',
sourceDirName: '/dir/subdir',
}),
).toBe('/dir/subdir/');
expect(
getSlug({
baseID: 'doc',
source: '@site/docs/dir/subdir/readme.md',
sourceDirName: '/dir/subdir',
}),
).toBe('/dir/subdir/');
expect(
getSlug({
baseID: 'doc',
source: '@site/docs/dir/subdir/reADMe.mdx',
sourceDirName: '/dir/subdir',
}),
).toBe('/dir/subdir/');
expect(
getSlug({
baseID: 'doc',
source: '@site/docs/dir/subdir/subdir.md',
sourceDirName: '/dir/subdir',
}),
).toBe('/dir/subdir/');
expect(
getSlug({
baseID: 'doc',
source: '@site/docs/dir/subdir/suBDir.mdx',
sourceDirName: '/dir/subdir',
}),
).toBe('/dir/subdir/');
});
it('ignores conventional doc index when explicit slug front matter is provided', () => {
expect(
getSlug({
baseID: 'doc',
source: '@site/docs/dir/subdir/index.md',
sourceDirName: '/dir/subdir',
frontMatterSlug: '/my/frontMatterSlug',
}),
).toBe('/my/frontMatterSlug');
});
it('can strip dir number prefixes', () => {
expect(
getSlug({
baseID: 'doc',
source: '@site/docs/001-dir1/002-dir2/doc.md',
sourceDirName: '/001-dir1/002-dir2',
stripDirNumberPrefixes: true,
}),
).toBe('/dir1/dir2/doc');
expect(
getSlug({
baseID: 'doc',
source: '@site/docs/001-dir1/002-dir2/doc.md',
sourceDirName: '/001-dir1/002-dir2',
stripDirNumberPrefixes: false,
}),
).toBe('/001-dir1/002-dir2/doc');
});
// See https://github.com/facebook/docusaurus/issues/3223
it('handles special chars in doc path', () => {
expect(
getSlug({
baseID: 'my dôc',
source: '@site/docs/dir with spâce/hey $hello/doc.md',
sourceDirName: '/dir with spâce/hey $hello',
}),
).toBe('/dir with spâce/hey $hello/my dôc');
});
it('throws for invalid routes', () => {
expect(() =>
getSlug({
baseID: 'my dôc',
source: '@site/docs/dir with spâce/hey $hello/doc.md',
sourceDirName: '/dir with spâce/hey $hello',
frontMatterSlug: '//',
}),
).toThrowErrorMatchingInlineSnapshot(`
"We couldn't compute a valid slug for document with ID "my dôc" in "/dir with spâce/hey $hello" directory.
The slug we computed looks invalid: //.
Maybe your slug front matter is incorrect or there are special characters in the file path?
By using front matter to set a custom slug, you should be able to fix this error:
---
slug: /my/customDocPath
---
"
`);
});
it('handles current dir', () => {
expect(
getSlug({baseID: 'doc', source: '@site/docs/doc.md', sourceDirName: '.'}),
).toBe('/doc');
expect(
getSlug({baseID: 'doc', source: '@site/docs/doc.md', sourceDirName: '/'}),
).toBe('/doc');
});
it('resolves absolute slug front matter', () => {
expect(
getSlug({
baseID: 'any',
source: '@site/docs/doc.md',
sourceDirName: '.',
frontMatterSlug: '/abc/def',
}),
).toBe('/abc/def');
expect(
getSlug({
baseID: 'any',
source: '@site/docs/any/doc.md',
sourceDirName: './any',
frontMatterSlug: '/abc/def',
}),
).toBe('/abc/def');
expect(
getSlug({
baseID: 'any',
source: '@site/docs/any/any/doc.md',
sourceDirName: './any/any',
frontMatterSlug: '/abc/def',
}),
).toBe('/abc/def');
});
it('resolves relative slug front matter', () => {
expect(
getSlug({
baseID: 'any',
source: '@site/docs/doc.md',
sourceDirName: '.',
frontMatterSlug: 'abc/def',
}),
).toBe('/abc/def');
expect(
getSlug({
baseID: 'any',
source: '@site/docs/dir/doc.md',
sourceDirName: '/dir',
frontMatterSlug: 'abc/def',
}),
).toBe('/dir/abc/def');
expect(
getSlug({
baseID: 'any',
source: '@site/docs/nonSlashedDir/doc.md',
sourceDirName: 'nonSlashedDir',
frontMatterSlug: 'abc/def',
}),
).toBe('/nonSlashedDir/abc/def');
expect(
getSlug({
baseID: 'any',
source: '@site/docs/dir/subdir/doc.md',
sourceDirName: 'dir/subdir',
frontMatterSlug: 'abc/def',
}),
).toBe('/dir/subdir/abc/def');
expect(
getSlug({
baseID: 'any',
source: '@site/docs/dir/doc.md',
sourceDirName: '/dir',
frontMatterSlug: './abc/def',
}),
).toBe('/dir/abc/def');
expect(
getSlug({
baseID: 'any',
source: '@site/docs/dir/doc.md',
sourceDirName: '/dir',
frontMatterSlug: './abc/../def',
}),
).toBe('/dir/def');
expect(
getSlug({
baseID: 'any',
source: '@site/docs/dir/subdir/doc.md',
sourceDirName: '/dir/subdir',
frontMatterSlug: '../abc/def',
}),
).toBe('/dir/abc/def');
expect(
getSlug({
baseID: 'any',
source: '@site/docs/dir/subdirDoc.md',
sourceDirName: '/dir/subdir',
frontMatterSlug: '../../../../../abc/../def',
}),
).toBe('/def');
});
});