package tools import ( "context" "encoding/json" "os" "path/filepath" "strings" "testing" "github.com/voocel/ainovel-cli/state" ) func TestContextToolReportsWarningsForCorruptedState(t *testing.T) { dir := t.TempDir() store := state.NewStore(dir) if err := store.Init(); err != nil { t.Fatalf("Init: %v", err) } if err := os.WriteFile(filepath.Join(dir, "outline.json"), []byte("{invalid"), 0o644); err != nil { t.Fatalf("write outline.json: %v", err) } if err := os.WriteFile(filepath.Join(dir, "meta", "progress.json"), []byte("{invalid"), 0o644); err != nil { t.Fatalf("write progress.json: %v", err) } tool := NewContextTool(store, References{}, "default") args, err := json.Marshal(map[string]any{"chapter": 2}) if err != nil { t.Fatalf("Marshal: %v", err) } result, err := tool.Execute(context.Background(), args) if err != nil { t.Fatalf("Execute: %v", err) } var payload struct { Warnings []string `json:"_warnings"` Summary string `json:"_loading_summary"` } if err := json.Unmarshal(result, &payload); err != nil { t.Fatalf("Unmarshal: %v", err) } if len(payload.Warnings) == 0 { t.Fatal("expected context warnings for corrupted files") } if !containsWarning(payload.Warnings, "outline") { t.Fatalf("expected outline warning, got %v", payload.Warnings) } if !containsWarning(payload.Warnings, "progress") { t.Fatalf("expected progress warning, got %v", payload.Warnings) } if !strings.Contains(payload.Summary, "告警:") { t.Fatalf("expected loading summary to contain warning count, got %q", payload.Summary) } } func containsWarning(warnings []string, key string) bool { for _, warning := range warnings { if strings.Contains(warning, key) { return true } } return false }