import { describe, expect, it } from 'vitest'; import { readFileSync } from 'node:fs'; import { resolve } from 'node:path'; const read = (path: string) => readFileSync(resolve(process.cwd(), path), 'utf8'); describe('数据质量治理管理端契约', () => { it('历史纳管必须先走只读预览再执行写入', () => { const api = read('src/api/aihr/processing.ts'); const page = read('src/views/knowledge/processing.vue'); expect(api).toContain("url: '/api/knowledge/quality/legacy/preview'"); expect(api).toContain("method: 'get'"); expect(page).toContain('await previewLegacyQualityAssets(50)'); expect(page).toContain('不会自动批准或恢复生产检索'); expect(page.indexOf('await previewLegacyQualityAssets(50)')).toBeLessThan(page.indexOf('await stageLegacyQualityAssets(50)')); }); it('术语采用草稿、人工批准、驳回、修订和停用流程', () => { const api = read('src/api/aihr/processing.ts'); const page = read('src/views/knowledge/processing.vue'); expect(api).toContain('/api/knowledge/quality/glossary/${id}/approve'); expect(api).toContain('/api/knowledge/quality/glossary/${id}/reject'); expect(api).toContain('/api/knowledge/quality/glossary/${id}/deprecate'); expect(page).toContain('人工批准前不会参与检索'); expect(page).toContain('活动版本只扩展检索词,不作为回答事实'); expect(page).toContain('openGlossaryDraft(row)'); }); it('keeps review publishing disabled until quality details finish loading', () => { const page = read('src/views/knowledge/processing.vue'); expect(page).toContain('v-loading="qualityDetailLoading"'); expect(page).toContain('!qualityDetailLoading && !qualityIssues.length'); expect(page).toContain( ':disabled="qualityDetailLoading || unresolvedQualityConflicts.length > 0 || !semanticAnalysisComplete || !privacyDerivativeReady"' ); expect(page).toContain('if (selectedQualityAsset.value?.id !== asset.id) return;'); }); it('shows only the governed privacy derivative and blocks versions without a residual scan', () => { const api = read('src/api/aihr/processing.ts'); const page = read('src/views/knowledge/processing.vue'); expect(api).toContain('/api/knowledge/quality/assets/${assetId}/privacy-preview'); expect(page).toContain('脱敏派生版本'); expect(page).toContain('该历史版本尚未生成脱敏派生内容'); expect(page).toContain("['CLEAN', 'REDACTED'].includes"); expect(page).not.toContain('originalContentPreview'); }); });