83 lines
2.2 KiB
Go
83 lines
2.2 KiB
Go
package llm
|
|
|
|
import (
|
|
"encoding/json"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestDiagnosticsWriterProducesValidJSONArtifacts(t *testing.T) {
|
|
dir := t.TempDir()
|
|
writer := NewDiagnosticsWriter(dir, nil)
|
|
|
|
artifacts, err := writer.WriteInteraction(
|
|
"validation:batch-1",
|
|
map[string]any{"stage": "validation", "attempt": 1},
|
|
map[string]any{"messages": []map[string]any{{"role": "user", "content": "hello"}}},
|
|
map[string]any{"result": "ok"},
|
|
nil,
|
|
)
|
|
if err != nil {
|
|
t.Fatalf("WriteInteraction: %v", err)
|
|
}
|
|
if artifacts.ErrorPayloadPath != "" {
|
|
t.Fatalf("expected no error payload path, got %q", artifacts.ErrorPayloadPath)
|
|
}
|
|
|
|
assertValidJSONFile(t, artifacts.RequestMetadataPath)
|
|
assertValidJSONFile(t, artifacts.RequestPayloadPath)
|
|
assertValidJSONFile(t, artifacts.ResponsePayloadPath)
|
|
}
|
|
|
|
func TestDiagnosticsWriterRedactsSecrets(t *testing.T) {
|
|
dir := t.TempDir()
|
|
secret := "top-secret-token"
|
|
writer := NewDiagnosticsWriter(dir, []string{secret})
|
|
|
|
artifacts, err := writer.WriteInteraction(
|
|
"module glossary / request",
|
|
map[string]any{"authorization": "Bearer " + secret},
|
|
map[string]any{"api_key": secret, "nested": map[string]any{"value": secret}},
|
|
map[string]any{"echo": secret},
|
|
map[string]any{"error": "failed with " + secret},
|
|
)
|
|
if err != nil {
|
|
t.Fatalf("WriteInteraction: %v", err)
|
|
}
|
|
|
|
for _, path := range []string{
|
|
artifacts.RequestMetadataPath,
|
|
artifacts.RequestPayloadPath,
|
|
artifacts.ResponsePayloadPath,
|
|
artifacts.ErrorPayloadPath,
|
|
} {
|
|
raw, readErr := os.ReadFile(path)
|
|
if readErr != nil {
|
|
t.Fatalf("read %s: %v", path, readErr)
|
|
}
|
|
content := string(raw)
|
|
if strings.Contains(content, secret) {
|
|
t.Fatalf("secret leaked in %s: %s", filepath.Base(path), content)
|
|
}
|
|
if !strings.Contains(content, redactedSecret) {
|
|
t.Fatalf("redaction marker missing in %s: %s", filepath.Base(path), content)
|
|
}
|
|
if !json.Valid(raw) {
|
|
t.Fatalf("invalid json in %s", filepath.Base(path))
|
|
}
|
|
}
|
|
}
|
|
|
|
func assertValidJSONFile(t *testing.T, path string) {
|
|
t.Helper()
|
|
raw, err := os.ReadFile(path)
|
|
if err != nil {
|
|
t.Fatalf("read %s: %v", path, err)
|
|
}
|
|
if !json.Valid(raw) {
|
|
t.Fatalf("invalid json in %s", filepath.Base(path))
|
|
}
|
|
}
|