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) }) }) })