package validate import ( "context" "fmt" "os" "path/filepath" "strings" "testing" "testing/fstest" "go.maximumdirect.net/promptkit/internal/domain" ) func TestSchemaPreparationDoesNotDependOnSourceName(t *testing.T) { for _, test := range []struct { name, schema string rejected bool }{ {"source name", `{"$defs":{"v":{"type":"integer"}},"$ref":"schema.json#/$defs/v"}`, true}, {"unused source name", `{"$defs":{"v":{"$ref":"schema.json"}}}`, true}, {"fragment", `{"$defs":{"v":{"type":"integer"}},"$ref":"#/$defs/v"}`, false}, {"explicit ID", `{"$id":"https://example.invalid/schema.json","$defs":{"v":{"type":"integer"}},"$ref":"schema.json#/$defs/v"}`, false}, {"embedded ID", `{"$defs":{"v":{"$id":"child","type":"integer"}},"$ref":"child"}`, false}, } { t.Run(test.name, func(t *testing.T) { dir := t.TempDir() if err := os.WriteFile(filepath.Join(dir, "schema.json"), []byte(test.schema), 0600); err != nil { t.Fatal(err) } fsys := fstest.MapFS{"schema.json": &fstest.MapFile{Data: []byte(test.schema)}} for i, validator := range []ValidationPreparer{NewStandardValidator(dir), NewFSValidator(fsys, ".")} { t.Run(fmt.Sprint(i), func(t *testing.T) { _, err := validator.PrepareValidation(context.Background(), domain.OutputContract{Format: domain.FormatJSON, ValidationMode: domain.ValidationJSONSchema, SchemaPath: "schema.json"}) if test.rejected { if err == nil || !strings.Contains(err.Error(), "source location") { t.Fatalf("expected source-independent rejection, got %v", err) } } else if err != nil { t.Fatal(err) } }) } }) } }