Files
ainovel-clients/tools/novel_context_test.go
2026-03-13 00:19:21 +08:00

68 lines
1.7 KiB
Go

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
}