dcdc8d1ddd
全栈知识治理平台首次入库(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 干净
88 lines
3.2 KiB
Go
88 lines
3.2 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"testing"
|
|
|
|
"knowledge-governance/internal/governance"
|
|
postgresstore "knowledge-governance/internal/platform/postgres"
|
|
"knowledge-governance/internal/platform/weknora"
|
|
)
|
|
|
|
func TestVerifyPublicationReturnsSanitizedEvidence(t *testing.T) {
|
|
store := &reportStoreStub{
|
|
publication: postgresstore.PublicationForValidation{ID: "tp-1", TestKBID: "kb-1", KnowledgeID: "knowledge-secret-id"},
|
|
acceptance: []governance.AcceptanceRecord{
|
|
{CheckType: "knowledge_exists", State: string(governance.AcceptancePassed)},
|
|
{CheckType: "chunks_present", State: string(governance.AcceptancePassed)},
|
|
{CheckType: "retrieval_hit", State: string(governance.AcceptanceManualRequired)},
|
|
},
|
|
}
|
|
client := &reportClientStub{
|
|
knowledge: weknora.Knowledge{ID: "knowledge-secret-id", KnowledgeBaseID: "kb-1", ParseStatus: "completed"},
|
|
chunks: []weknora.Chunk{
|
|
{ID: "chunk-1", KnowledgeID: "knowledge-secret-id", ChunkType: "text"},
|
|
{ID: "chunk-2", KnowledgeID: "knowledge-secret-id", ChunkType: "text"},
|
|
},
|
|
search: []weknora.SearchResult{{KnowledgeID: "knowledge-secret-id", Content: "answer contains MIKU-GOV-P3-5927", Score: 0.02}},
|
|
}
|
|
|
|
report, err := verifyPublication(context.Background(), store, client, "tp-1", "unique marker", "MIKU-GOV-P3-5927")
|
|
if err != nil {
|
|
t.Fatalf("verifyPublication() error = %v", err)
|
|
}
|
|
if report.PublicationID != "tp-1" || report.RemoteStatus != "completed" || report.ChunkTotal != 2 || !report.AllChunksMatch || report.SearchResultCount != 1 || report.TargetSearchHits != 1 || !report.MarkerFound || !report.StructuralPassed || report.SemanticState != "manual_required" {
|
|
t.Fatalf("report = %#v", report)
|
|
}
|
|
encoded, err := json.Marshal(report)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
for _, forbidden := range []string{"knowledge-secret-id", "chunk-1", "unique marker", "MIKU-GOV-P3-5927"} {
|
|
if string(encoded) == forbidden || contains(string(encoded), forbidden) {
|
|
t.Fatalf("report leaked %q: %s", forbidden, encoded)
|
|
}
|
|
}
|
|
}
|
|
|
|
func contains(value, fragment string) bool {
|
|
for index := 0; index+len(fragment) <= len(value); index++ {
|
|
if value[index:index+len(fragment)] == fragment {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
type reportStoreStub struct {
|
|
publication postgresstore.PublicationForValidation
|
|
acceptance []governance.AcceptanceRecord
|
|
}
|
|
|
|
func (store *reportStoreStub) LoadPublicationForValidation(context.Context, string) (postgresstore.PublicationForValidation, error) {
|
|
return store.publication, nil
|
|
}
|
|
|
|
func (store *reportStoreStub) ListAcceptanceResults(context.Context, string) ([]governance.AcceptanceRecord, error) {
|
|
return store.acceptance, nil
|
|
}
|
|
|
|
type reportClientStub struct {
|
|
knowledge weknora.Knowledge
|
|
chunks []weknora.Chunk
|
|
search []weknora.SearchResult
|
|
}
|
|
|
|
func (client *reportClientStub) GetKnowledge(context.Context, string) (weknora.Knowledge, error) {
|
|
return client.knowledge, nil
|
|
}
|
|
|
|
func (client *reportClientStub) ListChunks(context.Context, string, int, int, []string) ([]weknora.Chunk, int64, error) {
|
|
return client.chunks, int64(len(client.chunks)), nil
|
|
}
|
|
|
|
func (client *reportClientStub) SearchKnowledge(context.Context, weknora.SearchRequest) ([]weknora.SearchResult, error) {
|
|
return client.search, nil
|
|
}
|