Files
knowledge-governance/web/src/SourceLinkManager.test.tsx
T
zheromiku dcdc8d1ddd feat: 知识治理平台(含已验证发布/回滚契约)
全栈知识治理平台首次入库(P1-P10 + 发布链路模拟验证闭环):

- 治理核心:源目录/变更集/人工审核/发布批次/发布执行(fail-closed 闸口)
- 测试通道:WeKnora 测试 KB 上传/轮询/验收;poll 完成时写入
  parser_generation/index_generation,修复 manual/seed 路径发布闸口永久拦截
- 发布适配器 v071(本地 source=测试角色 / 云端 target=生产角色 模拟验证通过):
  * ES 导出/导入 mapping 自适应(.keyword 子字段、可选 tenant_id)
  * OSS locator 支持嵌套 scheme;chunks.seq_id 由目标序列分配
  * bundle 归档同身份重试原子替换;verifier 按 bundle chunk_type 计数
  * 回滚 job payload 支持 prior_execution_id(strict 解码)
- 三通道发布+回滚演练实测:publish 4/4 verified,检索命中,
  rollback 4/4 rolled_back,目标端 PG is_enabled=false、ES is_enabled=false
- 前端 A·Data-console 风格全站统一,120 用例通过
- 门禁:go vet / go test 全包通过,gofmt 干净
2026-09-30 10:54:06 +08:00

27 lines
2.6 KiB
TypeScript

import { renderToStaticMarkup } from 'react-dom/server'
import { describe,expect,it,vi } from 'vitest'
import { SourceLinkManagerView } from './SourceLinkManager'
import type { CatalogSource } from './sourceCatalog'
const sources:CatalogSource[]=[
{connection_id:'ding',source_type:'dingtalk',name:'公司级技术支持知识库',root_node_id:'r1',folder_count:8,file_count:3468,observed_at:'2026-09-08T00:00:00Z',snapshot_only:true,snapshot_status:'ready',last_refresh_duration_ms:0},
{connection_id:'pp',source_type:'pp',name:'PP资料下载中心',root_node_id:'r2',folder_count:64,file_count:613,observed_at:'2026-09-08T00:00:00Z',snapshot_only:true,snapshot_status:'ready',last_refresh_duration_ms:0},
{connection_id:'alist',source_type:'alist',name:'国内工业',root_node_id:'r3',folder_count:1688,file_count:4880,observed_at:'2026-09-08T00:00:00Z',snapshot_only:true,snapshot_status:'ready',last_refresh_duration_ms:0},
]
describe('SourceLinkManagerView',()=>{
it('shows understandable URL credential and login fields without accepting real secrets locally',()=>{
const html=renderToStaticMarkup(<SourceLinkManagerView sources={sources} selected={sources[0]} validated={false} loading={false} error={null} onSelect={vi.fn()} onValidate={vi.fn()} onRefresh={vi.fn()} />)
for(const text of ['来源链接','本地模拟配置','公司级技术支持知识库','PP资料下载中心','国内工业','知识库链接','认证方式','专用浏览器扫码登录','Key或Token','本地模拟阶段不接收真实Key','模拟登录并验证目录','不保存真实Key'])expect(html).toContain(text)
expect(html).not.toContain('secret_ref')
expect(html).not.toContain('base_url')
})
it('separates an AList site address from its starting directory and labels simulated status honestly',()=>{
const html=renderToStaticMarkup(<SourceLinkManagerView sources={sources} selected={sources[2]} validated={false} loading={false} error={null} onSelect={vi.fn()} onValidate={vi.fn()} onRefresh={vi.fn()} />)
for(const text of ['AList站点地址','起始目录','/国内工业','模拟验证待执行','不下载文件内容,只读取目录和元数据'])expect(html).toContain(text)
expect(html).not.toContain('实时连接待验证')
})
it('does not show a successful zero-source state after errors',()=>{
const html=renderToStaticMarkup(<SourceLinkManagerView sources={[]} selected={null} validated={false} loading={false} error="加载失败" onSelect={vi.fn()} onValidate={vi.fn()} onRefresh={vi.fn()} />)
expect(html).toContain('加载失败');expect(html).not.toContain('尚无来源链接')
})
})