import {test} from 'node:test'; import assert from 'node:assert/strict'; import {auditSidebars} from './sidebar-coverage.mjs'; const fixture = () => [{plugin:'strategy', version:'current', documents:[ {id:'overview', path:'/strategy/overview/', sidebar:'main'}, {id:'nested/reference', path:'/strategy/reference/', sidebar:'main'}, ], sidebars:{main:[{type:'category', label:'Stage', href:'/strategy/overview', items:[ {type:'category', label:'Reference', items:[{type:'link', docId:'nested/reference', href:'/strategy/reference'}]}, ]}]}}]; const entries = ['strategy:current:main']; test('resolved nested entries and linked category overviews both count', () => { assert.equal(auditSidebars(fixture(), entries).length, 2); }); test('missing docs fail even if Docusaurus assigns a displayed sidebar', () => { const data = fixture(); data[0].sidebars.main[0].items = []; assert.throws(() => auditSidebars(data, entries), /Missing sidebar document/); }); test('new publishable docs and absent category overview links fail closed', () => { const data = fixture(); data[0].documents.push({id:'new', path:'/new'}); assert.throws(() => auditSidebars(data, entries), /Unreachable sidebar/); const withoutLink = fixture(); delete withoutLink[0].sidebars.main[0].href; assert.throws(() => auditSidebars(withoutLink, entries), /Missing sidebar document/); }); test('duplicate normalized routes and duplicate sidebar entries fail', () => { const data = fixture(); data[0].documents.push({...data[0].documents[0], path:'/strategy/overview'}); assert.throws(() => auditSidebars(data, entries), /Duplicate document ID/); data[0].documents.at(-1).id = 'different'; assert.throws(() => auditSidebars(data, entries), /Duplicate document route/); const duplicate = fixture(); duplicate[0].sidebars.main.push({type:'link', href:'/strategy/overview/'}); assert.throws(() => auditSidebars(duplicate, entries), /Duplicate sidebar route/); }); test('unlisted entries and unresolved sidebar types fail', () => { const data = fixture(); data[0].sidebars.main[0].unlisted = true; assert.throws(() => auditSidebars(data, entries), /Hidden sidebar item/); data[0].sidebars.main[0] = {type:'autogenerated'}; assert.throws(() => auditSidebars(data, entries), /Unresolved sidebar type/); }); test('disconnected plugin menus fail, cross-plugin sidebar links make them reachable', () => { const data = fixture(); data.push({plugin:'default', version:'current', documents:[{id:'help', path:'/docs/help', sidebar:'docs'}], sidebars:{docs:[{type:'link', href:'/docs/help'}]}}); assert.throws(() => auditSidebars(data, entries), /Unreachable sidebar/); data[0].sidebars.main.push({type:'link', href:'/docs/help/'}); assert.equal(auditSidebars(data, entries).length, 3); });