import assert from 'node:assert/strict' import { readFileSync } from 'node:fs' import test from 'node:test' import { fileURLToPath } from 'node:url' const appShell = readFileSync( fileURLToPath(new URL('../src/views/AppShellRouteView.vue', import.meta.url)), 'utf8' ) const appShellComposable = readFileSync( fileURLToPath(new URL('../src/composables/useAppShell.js', import.meta.url)), 'utf8' ) const workbench = readFileSync( fileURLToPath(new URL('../src/components/business/PersonalWorkbench.vue', import.meta.url)), 'utf8' ) const aiMode = readFileSync( fileURLToPath(new URL('../src/components/business/PersonalWorkbenchAiMode.vue', import.meta.url)), 'utf8' ) const aiDetailReference = readFileSync( fileURLToPath(new URL('../src/utils/aiDocumentDetailReference.js', import.meta.url)), 'utf8' ) test('workbench document detail keeps workbench as the return target', () => { assert.match(workbench, /source:\s*'workbench'/) assert.match(workbench, /returnTo:\s*'workbench'/) assert.match(appShell, /:back-label="detailBackLabel"/) assert.match(appShell, /String\(payload\.returnTo \|\| ''\)\.trim\(\) === 'workbench'/) assert.match(appShell, /String\(payload\.source \|\| ''\)\.trim\(\) === 'workbench'/) assert.match(appShell, /const detailPayload = request \|\| \{[\s\S]*detailLookupOnly:\s*true[\s\S]*\}/) assert.match(appShell, /openRequestDetail\(detailPayload,\s*\{ returnTo \}\)/) assert.match(appShellComposable, /const detailReturnTarget = computed/) assert.match(appShellComposable, /detailReturnTarget\.value === 'workbench' \? '返回首页' : '返回单据中心'/) assert.match(appShellComposable, /nextQuery\.returnTo = 'workbench'/) assert.match(appShellComposable, /router\.push\(\{ name: 'app-workbench' \}\)/) assert.match(appShellComposable, /router\.push\(\{ name: 'app-documents', query: buildDocumentReturnQuery\(\) \}\)/) }) test('AI detail links resolve real claim identity before opening document detail', () => { assert.match(aiMode, /buildAiDocumentDetailRequest/) assert.match(aiMode, /parseAiApplicationDetailHref/) assert.match(aiMode, /parseAiDocumentDetailHref/) assert.match(aiDetailReference, /detailLookupOnly:\s*true/) assert.match(aiDetailReference, /params\.get\('claim_id'\)/) assert.match(aiDetailReference, /params\.get\('claim_no'\)/) assert.match(aiDetailReference, /isBusinessDocumentReference/) assert.match(aiDetailReference, /const claimId = explicitClaimId \|\| \(!referenceIsBusinessNo \? reference : ''\)/) assert.match(aiDetailReference, /const claimNo = explicitClaimNo \|\| \(referenceIsBusinessNo \? reference : ''\)/) assert.match( appShell, /v-else-if="activeView === 'documents' && detailMode && !selectedRequest"[\s\S]*正在加载完整单据详情/ ) assert.match( appShell, /const detailPayload = request \|\| \{[\s\S]*detailLookupOnly:\s*true[\s\S]*\}/ ) assert.match(appShell, /isBusinessDocumentReference/) assert.match(appShell, /const requestCandidates = Array\.isArray\(workbenchRequests\.value\)/) assert.match(appShell, /claimId:\s*fallbackClaimId/) assert.match(appShell, /claimNo:\s*fallbackClaimNo/) assert.match( appShellComposable, /const isDetailLookupOnlyRequest = isDetailLookupOnlyPayload\(request\)[\s\S]*selectedRequestSnapshot\.value = isDetailLookupOnlyRequest \? null : request \|\| null/ ) assert.match(appShellComposable, /const workbenchRequests = computed/) assert.match(appShellComposable, /workbenchRequests\.value\.find\(\(item\) => isSameRequestIdentity\(item, requestId\)\)/) assert.match( appShellComposable, /void refreshSelectedRequestDetail\(isDetailLookupOnlyRequest \? requestId : request\)/ ) })