import assert from 'node:assert/strict' import { readFileSync } from 'node:fs' import test from 'node:test' import { fileURLToPath } from 'node:url' const sidebar = readFileSync( fileURLToPath(new URL('../src/components/layout/SidebarRail.vue', import.meta.url)), 'utf8' ) const sidebarStyles = readFileSync( fileURLToPath(new URL('../src/assets/styles/components/sidebar-rail.css', import.meta.url)), 'utf8' ) const topbar = readFileSync( fileURLToPath(new URL('../src/components/layout/TopBar.vue', import.meta.url)), 'utf8' ) const topbarStyles = readFileSync( fileURLToPath(new URL('../src/assets/styles/components/top-bar.css', import.meta.url)), 'utf8' ) const appShellRouteView = readFileSync( fileURLToPath(new URL('../src/views/AppShellRouteView.vue', import.meta.url)), 'utf8' ) const documentInbox = readFileSync( fileURLToPath(new URL('../src/composables/useDocumentCenterInbox.js', import.meta.url)), 'utf8' ) const documentNewState = readFileSync( fileURLToPath(new URL('../src/utils/documentCenterNewState.js', import.meta.url)), 'utf8' ) test('sidebar no longer renders document center unread indicators', () => { assert.doesNotMatch(sidebar, /useDocumentCenterInbox/) assert.doesNotMatch(sidebar, /hasUnread: documentInboxHasUnread/) assert.doesNotMatch(sidebar, /hasNewMessage/) assert.doesNotMatch(sidebar, /nav-label-text/) assert.doesNotMatch(sidebar, /nav-unread-dot/) assert.match(sidebar, /\{\{ item\.displayLabel \}\}<\/span>/) assert.doesNotMatch(sidebarStyles, /\.nav-label-text\s*\{/) assert.doesNotMatch(sidebarStyles, /\.nav-unread-dot/) assert.match(sidebarStyles, /\.nav-label\s*\{[\s\S]*overflow:\s*hidden;[\s\S]*text-overflow:\s*ellipsis;/) }) test('topbar bell owns document center unread notifications', () => { assert.match(topbar, /useDocumentCenterInbox/) assert.match(topbar, /unreadCount: documentInboxUnreadCount/) assert.match(topbar, /const workbenchNotificationCount = computed/) assert.match(topbar, /const count = workbenchNotificationCount\.value \+ Number\(documentInboxUnreadCount\.value \|\| 0\)/) assert.match(topbar, /const documentInboxNotification = computed/) assert.match(topbar, /id: 'document-center-unread'/) assert.match(topbar, /title: '单据中心有新单据'/) assert.match(topbar, /target: \{ type: 'documents-center' \}/) assert.match(topbar, /emit\('navigate', 'documents'\)/) assert.match(appShellRouteView, /@navigate="handleNavigate"/) assert.match(topbar, /startDocumentInboxPolling\(\)/) assert.match(topbar, /stopDocumentInboxPolling\(\)/) assert.match(topbar, /class="notification-type-icon" :class="item\.tone"/) assert.match(topbarStyles, /\.notification-head-copy\s*\{[\s\S]*display:\s*grid;/) assert.match(topbarStyles, /\.notification-tabs button em\s*\{[\s\S]*border-radius:\s*999px;/) assert.match(topbarStyles, /\.notification-row\s*\{[\s\S]*grid-template-columns:\s*34px minmax\(0,\s*1fr\) 16px;/) assert.match(topbarStyles, /\.notification-type-icon\.danger\s*\{[\s\S]*background:\s*#fff5f5;/) assert.doesNotMatch(topbarStyles, /\.notification-dot/) }) test('document inbox reuses document center viewed-key state', () => { assert.match(documentInbox, /DOCUMENT_VIEWED_KEYS_CHANGE_EVENT/) assert.match(documentInbox, /readViewedDocumentKeys/) assert.match(documentInbox, /countNewDocuments\(documentRows\.value, viewedDocumentKeys\.value\)/) assert.match(documentInbox, /fetchExpenseClaims/) assert.match(documentInbox, /fetchApprovalExpenseClaims/) assert.match(documentInbox, /fetchArchivedExpenseClaims/) assert.match(documentInbox, /window\.addEventListener\(DOCUMENT_VIEWED_KEYS_CHANGE_EVENT, refreshViewedDocumentKeys\)/) assert.match(documentNewState, /export const DOCUMENT_VIEWED_KEYS_CHANGE_EVENT/) assert.match(documentNewState, /window\.dispatchEvent\(new CustomEvent\(DOCUMENT_VIEWED_KEYS_CHANGE_EVENT\)\)/) })