68 lines
1.7 KiB
Go
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
|
|
}
|