import assert from 'node:assert/strict' import { readFileSync } from 'node:fs' import test from 'node:test' const layoutSource = readFileSync(new URL('./AppLayout.vue', import.meta.url), 'utf8') const shellStyles = readFileSync(new URL('../styles/shell.css', import.meta.url), 'utf8') const globalStyles = readFileSync(new URL('../styles/index.css', import.meta.url), 'utf8') const routerSource = readFileSync(new URL('../router/index.ts', import.meta.url), 'utf8') const sidebarMenuSource = readFileSync(new URL('../components/ClientSidebarMenu.vue', import.meta.url), 'utf8') const sidebarMenuNodeSource = readFileSync(new URL('../components/ClientSidebarMenuNode.vue', import.meta.url), 'utf8') test('source contract: renders the grouped sidebar menu and mobile drawer controls', () => { assert.match(layoutSource, /import \{ computed, nextTick, onBeforeUnmount, onMounted, ref, watch \} from 'vue'/) assert.match(layoutSource, /import \{[\s\S]*?\bX\s*\} from '@lucide\/vue'/) assert.match(layoutSource, /import ClientSidebarMenu from '@\/components\/ClientSidebarMenu\.vue'/) assert.match(layoutSource, /:class="\{ 'mobile-menu-open': mobileMenuOpen \}"/) assert.match(layoutSource, /]*class="client-sidebar-scrim"[^>]*aria-label="关闭导航"[^>]*@click="closeMobileMenu"/s) assert.match(layoutSource, //) assert.doesNotMatch(layoutSource, /]*aria-label=/) assert.match(layoutSource, /