package mcp import ( "context" "encoding/json" "os" "strings" "testing" "github.com/sundynix/sundynix-shared/blob" "github.com/sundynix/sundynix-shared/contract" "github.com/sundynix/sundynix-mcp-go/internal/office" ) // blob 未就绪(MinIO 连不上)时,报告源/产物回落本地盘: // putSource → getSource 往返一致,putDocx 返回本地路径(非 minio:// 标记)。 // 这是单机/无对象存储的降级路径,必须始终可用。 func TestReport_LocalFallback_WhenBlobNotReady(t *testing.T) { // 隔离到临时目录,避免污染系统 temp 下的 sundynix-reports。 dir := t.TempDir() t.Setenv("SUNDYNIX_REPORTS_DIR", dir) g := &Gateway{blob: &blob.Store{}} // cli=nil → Ready()=false if g.blob.Ready() { t.Fatal("裸 blob.Store 应为未就绪") } ctx := context.Background() id := "report_local_fallback" // 存源 → 取源往返。 src := reportSource{Title: "标题", Sections: []office.Section{{Heading: "H", Body: "B"}}} data, _ := json.Marshal(src) if err := g.putSource(ctx, id, data); err != nil { t.Fatalf("putSource: %v", err) } got, err := g.getSource(ctx, id) if err != nil { t.Fatalf("getSource: %v", err) } var back reportSource if err := json.Unmarshal(got, &back); err != nil || back.Title != "标题" { t.Fatalf("源往返不一致: %v / %+v", err, back) } // 产物回落本地路径:返回真实路径、无 minio:// 前缀、文件存在。 ref, err := g.putDocx(ctx, id, []byte("PK\x03\x04fake-docx")) if err != nil { t.Fatalf("putDocx: %v", err) } if strings.HasPrefix(ref, contract.BlobScheme) { t.Errorf("blob 未就绪不应返回 minio:// 标记,得 %q", ref) } if _, serr := os.Stat(ref); serr != nil { t.Errorf("本地产物应落盘,stat %s: %v", ref, serr) } }