2026-08-09 22:50:01 +08:00
/** Regression coverage for package-group subsystem-page ownership. */
import { mkdirSync , mkdtempSync , rmSync , writeFileSync } from 'node:fs'
import { tmpdir } from 'node:os'
import { dirname , join } from 'node:path'
2026-08-23 15:55:46 +08:00
import { describe , expect , it , onTestFinished } from 'vitest'
2026-08-09 22:50:01 +08:00
import { auditSubsystemPages } from './verify-subsystem-pages.ts'
function fixture ( ) : string {
const root = mkdtempSync ( join ( tmpdir ( ) , 'dsh-subsystem-pages-' ) )
2026-08-23 16:02:32 +08:00
onTestFinished ( ( ) = > {
rmSync ( root , { recursive : true , force : true } )
} )
2026-08-09 22:50:01 +08:00
return root
}
function write ( root : string , path : string , source : string ) : void {
const absolute = join ( root , path )
mkdirSync ( dirname ( absolute ) , { recursive : true } )
writeFileSync ( absolute , source )
}
describe ( 'package-group subsystem pages' , ( ) = > {
it ( 'accepts a direct page link and a justified no-page group' , ( ) = > {
const root = fixture ( )
2026-08-09 23:30:03 +08:00
write ( root , 'packages/alpha/README.md' , '[types](../../docs/subsystems/alpha.md#contract)\n' )
2026-08-09 22:50:01 +08:00
write ( root , 'packages/alpha/alpha/package.json' , '{}\n' )
write ( root , 'docs/subsystems/alpha.md' , '# Alpha\n' )
write ( root , 'packages/adapter/README.md' , '# Adapter\n' )
expect ( auditSubsystemPages ( root , { adapter : 'Adapter over an existing subsystem.' } ) ) . toEqual ( {
groups : 2 ,
linked : 1 ,
exempt : 1 ,
violations : [ ] ,
} )
} )
it ( 'rejects a new group whose README never declares subsystem ownership' , ( ) = > {
const root = fixture ( )
write ( root , 'packages/schedule/README.md' , '# Schedule\n' )
write ( root , 'packages/schedule/tool-schedule/package.json' , '{}\n' )
expect ( auditSubsystemPages ( root , { } ) . violations ) . toEqual ( [
2026-08-09 23:30:03 +08:00
'packages/schedule/README.md: no reader-visible direct docs/subsystems/*.md link; add the owning page and link, or add a justified GROUPS_WITHOUT_SUBSYSTEM_PAGE entry' ,
2026-08-09 22:50:01 +08:00
] )
} )
it ( 'does not treat the subsystem index or a Chinese counterpart as an owning page' , ( ) = > {
const root = fixture ( )
write (
root ,
'packages/wrong/README.md' ,
'[index](../../docs/subsystems/README.md) [Chinese](../../docs/subsystems/wrong.zh.md)\n' ,
)
write ( root , 'docs/subsystems/README.md' , '# Subsystems\n' )
write ( root , 'docs/subsystems/wrong.zh.md' , '# Wrong\n' )
expect ( auditSubsystemPages ( root , { } ) . violations ) . toEqual ( [
2026-08-09 23:30:03 +08:00
'packages/wrong/README.md: no reader-visible direct docs/subsystems/*.md link; add the owning page and link, or add a justified GROUPS_WITHOUT_SUBSYSTEM_PAGE entry' ,
] )
} )
it ( 'does not count links hidden in code, comments, or image syntax' , ( ) = > {
const root = fixture ( )
write (
root ,
'packages/hidden/README.md' ,
[
'`[inline](../../docs/subsystems/hidden.md)`' ,
'```md' ,
'[fenced](../../docs/subsystems/hidden.md)' ,
'```' ,
'<!-- [comment](../../docs/subsystems/hidden.md) -->' ,
'' ,
'' ,
] . join ( '\n' ) ,
)
write ( root , 'docs/subsystems/hidden.md' , '# Hidden\n' )
expect ( auditSubsystemPages ( root , { } ) . violations ) . toEqual ( [
'packages/hidden/README.md: no reader-visible direct docs/subsystems/*.md link; add the owning page and link, or add a justified GROUPS_WITHOUT_SUBSYSTEM_PAGE entry' ,
] )
} )
it ( 'rejects a link that escapes the subsystem directory' , ( ) = > {
const root = fixture ( )
write ( root , 'packages/escape/README.md' , '[escape](../../docs/subsystems/../architecture.md)\n' )
write ( root , 'docs/architecture.md' , '# Architecture\n' )
expect ( auditSubsystemPages ( root , { } ) . violations ) . toEqual ( [
'packages/escape/README.md: no reader-visible direct docs/subsystems/*.md link; add the owning page and link, or add a justified GROUPS_WITHOUT_SUBSYSTEM_PAGE entry' ,
2026-08-09 22:50:01 +08:00
] )
} )
it ( 'rejects missing group READMEs and missing linked pages' , ( ) = > {
const root = fixture ( )
write ( root , 'packages/no-readme/pkg/package.json' , '{}\n' )
write ( root , 'packages/broken/README.md' , '[missing](../../docs/subsystems/missing.md)\n' )
expect ( auditSubsystemPages ( root , { } ) . violations ) . toEqual ( [
'packages/broken/README.md: linked subsystem page does not exist: docs/subsystems/missing.md' ,
'packages/no-readme/README.md: package group has no group README declaring subsystem ownership' ,
] )
} )
it ( 'rejects blank, orphaned, and stale exemptions' , ( ) = > {
const root = fixture ( )
write ( root , 'packages/linked/README.md' , '[types](../../docs/subsystems/linked.md)\n' )
write ( root , 'docs/subsystems/linked.md' , '# Linked\n' )
write ( root , 'packages/blank/README.md' , '# Blank\n' )
expect ( auditSubsystemPages ( root , {
blank : ' ' ,
linked : 'No page.' ,
orphan : 'Removed group.' ,
} ) . violations ) . toEqual ( [
'exemption blank: missing justification for omitting a subsystem page' ,
'exemption orphan: no matching package group; remove the stale entry' ,
'packages/linked/README.md: links a subsystem page but remains exempt; remove the stale exemption' ,
] )
} )
} )