You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
vitepress/__tests__/unit/client/theme-default/support/sidebar.test.ts

219 lines
5.2 KiB

import {
getFlatSideBarLinks,
getSidebar,
hasActiveLink
} from 'client/theme-default/support/sidebar'
describe('client/theme-default/support/sidebar', () => {
describe('getSidebar', () => {
const root = [
{
text: 'A',
collapsible: true,
items: [{ text: 'A', link: '' }]
},
{
text: 'B',
items: [{ text: 'B', link: '' }]
}
]
const another = [
{
text: 'C',
items: [{ text: 'C', link: '' }]
}
]
describe('normal sidebar sort', () => {
const normalSidebar = {
'/': root,
'/multi-sidebar/': another
}
test('gets `/` sidebar', () => {
expect(getSidebar(normalSidebar, '/')).toStrictEqual(root)
})
test('gets `/multi-sidebar/` sidebar', () => {
expect(getSidebar(normalSidebar, '/multi-sidebar/')).toStrictEqual(
another
)
})
test('gets `/` sidebar again', () => {
expect(getSidebar(normalSidebar, '/some-entry.html')).toStrictEqual(
root
)
})
})
describe('reversed sidebar sort', () => {
const reversedSidebar = {
'/multi-sidebar/': another,
'/': root
}
test('gets `/` sidebar', () => {
expect(getSidebar(reversedSidebar, '/')).toStrictEqual(root)
})
test('gets `/multi-sidebar/` sidebar', () => {
expect(getSidebar(reversedSidebar, '/multi-sidebar/')).toStrictEqual(
another
)
})
test('gets `/` sidebar again', () => {
expect(getSidebar(reversedSidebar, '/some-entry.html')).toStrictEqual(
root
)
})
})
describe('nested sidebar sort', () => {
const nested = [
{
text: 'D',
items: [{ text: 'D', link: '' }]
}
]
const nestedSidebar = {
'/': root,
'/multi-sidebar/': another,
'/multi-sidebar/nested/': nested
}
test('gets `/` sidebar', () => {
expect(getSidebar(nestedSidebar, '/')).toStrictEqual(root)
})
test('gets `/multi-sidebar/` sidebar', () => {
expect(getSidebar(nestedSidebar, '/multi-sidebar/')).toStrictEqual(
another
)
})
test('gets `/multi-sidebar/nested/` sidebar', () => {
expect(
getSidebar(nestedSidebar, '/multi-sidebar/nested/')
).toStrictEqual(nested)
})
test('gets `/` sidebar again', () => {
expect(getSidebar(nestedSidebar, '/some-entry.html')).toStrictEqual(
root
)
})
})
test('applies base only to internal links', () => {
expect(
getSidebar(
{
'/en/': {
base: '/en/',
items: [
{
text: 'Guide',
items: [
{ text: 'Intro', link: 'intro' },
{ text: 'Root', link: '/root' },
{ text: 'External', link: 'https://example.com/' }
]
}
]
}
},
'/en/intro'
)
).toStrictEqual([
{
text: 'Guide',
items: [
{ text: 'Intro', link: '/en/intro' },
{ text: 'Root', link: '/en/root' },
{ text: 'External', link: 'https://example.com/' }
]
}
])
})
})
describe('getFlatSideBarLinks', () => {
test('flattens nested items and preserves link metadata', () => {
const sidebar = [
{
text: 'Group',
items: [
{ text: 'Intro', link: '/intro' },
{
text: 'External',
link: 'https://example.com/',
target: '_self',
rel: 'noopener',
docFooterText: 'Go external'
}
]
}
]
expect(getFlatSideBarLinks(sidebar)).toStrictEqual([
{
text: 'Intro',
link: '/intro',
docFooterText: undefined,
rel: undefined,
target: undefined
},
{
text: 'External',
link: 'https://example.com/',
docFooterText: 'Go external',
rel: 'noopener',
target: '_self'
}
])
})
})
describe('hasActiveLink', () => {
test('checks `SidebarItem`', () => {
const item = {
text: 'Item 001',
items: [
{ text: 'Item 001', link: '/active-1' },
{ text: 'Item 002', link: '/active-2' }
]
}
expect(hasActiveLink('active-1', '', item)).toBe(true)
expect(hasActiveLink('inactive', '', item)).toBe(false)
})
test('checks `SidebarItem[]`', () => {
const item = [
{
text: 'Item 001',
items: [
{ text: 'Item 001', link: '/active-1' },
{ text: 'Item 002', link: '/active-2' }
]
},
{
text: 'Item 002',
items: [
{ text: 'Item 003', link: '/active-3' },
{ text: 'Item 004', link: '/active-4' }
]
}
]
expect(hasActiveLink('active-1', '', item)).toBe(true)
expect(hasActiveLink('active-3', '', item)).toBe(true)
expect(hasActiveLink('inactive', '', item)).toBe(false)
})
})
})