feat: govern knowledge assets and source citations
This commit is contained in:
@@ -0,0 +1,52 @@
|
||||
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');
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user