Files
knowledge-governance/internal/qaopsmirror/master_quality_integration_test.go
T
姚章浩 f5e0f8d20f
build / build (push) Successful in 1m7s
feat(qa-ops): 建立独立正式主表并保真导入历史问答
将可维护总表与可替换2.0镜像分离,稳定来源关联和原始事件键保留;
源端更新/删除不覆盖主表或人工复核。首次收录保留原评估审计,
主表输入/复核独立持久化;历史原标注不冒充新AI或冻结证据。

历史导入绑定源哈希、逐行批准清单与真实恢复备份;三字段精确去重,
批次及原字段留档,重复执行不覆盖后续修改。仅操作本地治理库。

验证:完整make verify退出0;镜像与区域两组隔离PG race退出0;
真实恢复数据隔离导入12522、跳过792、暂缓1,总表15050;
重放保留模拟修改,结构down拒绝丢历史;真实浏览器第41周551条完整,
历史原标注和独立主表复核读回通过,移动布局及JS异常0。
2026-10-19 08:49:18 +08:00

62 lines
2.4 KiB
Go

package qaopsmirror
import (
"context"
"knowledge-governance/internal/dobotaiops"
pg "knowledge-governance/internal/platform/postgres"
"knowledge-governance/internal/qaopsquality"
"testing"
"time"
)
func TestMasterHumanReviewIsIndependentOfSourceInputUpdates(t *testing.T) {
p := mirrorFixture(t)
ctx := context.Background()
s := NewStore(p, "fixture-master-quality")
queue := pg.NewStore(p)
source := &fixtureSource{rows: []dobotaiops.MirrorRecord{fixtureEntry("master-review", "first")}}
job := claimMirrorJob(t, s, queue, "review-first")
if e := s.HandleSync(ctx, *job, func(context.Context) (Source, error) { return source, nil }); e != nil {
t.Fatal(e)
}
if e := queue.Complete(ctx, job.ID, job.LeaseOwner, time.Now()); e != nil {
t.Fatal(e)
}
rec, e := s.GetMasterRecord(ctx, s.tenant, "master-review")
if e != nil {
t.Fatal(e)
}
quality := s.MasterQualityStore()
key := []dobotaiops.QualityKey{{ID: rec.ID, InputHash: rec.QualityInputHash}}
views, e := quality.ReadViews(ctx, key)
if e != nil {
t.Fatal(e)
}
v := views[rec.ID]
request := qaopsquality.SaveRequest{InputHash: v.InputHash, InputEpoch: v.InputEpoch, BaseRevision: v.Revision, Nonce: "fixture_master_review_001", Reason: "fixture only", Fields: qaopsquality.Fields{Coverage: "covered", Correctness: "correct", ProductCategory: "fixture-local"}}
if _, e = quality.Save(ctx, rec, request, "fixture-admin"); e != nil {
t.Fatal(e)
}
source.rows = []dobotaiops.MirrorRecord{fixtureEntry("master-review", "changed at source")}
job = claimMirrorJob(t, s, queue, "review-source-change")
if e = s.HandleSync(ctx, *job, func(context.Context) (Source, error) { return source, nil }); e != nil {
t.Fatal(e)
}
views, e = quality.ReadViews(ctx, key)
if e != nil || views[rec.ID].State != "reviewed" || views[rec.ID].Effective.ProductCategory != "fixture-local" {
t.Fatal("source sync invalidated a locally-owned master review", e)
}
current, e := qaopsquality.NewStore(p, s.tenant).ReadViews(ctx, []dobotaiops.QualityKey{{ID: rec.ID, InputHash: sourceRecordHash(t, source.rows[0])}})
if e != nil || current[rec.ID].Revision != 0 {
t.Fatal("master review modified original source evaluation", e)
}
}
func sourceRecordHash(t *testing.T, r dobotaiops.MirrorRecord) string {
t.Helper()
v, e := dobotaiops.DecodeMirrorPayload(string(r.Payload))
if e != nil {
t.Fatal(e)
}
return v.QualityInputHash
}