package contracts import ( "encoding/json" "testing" ) func TestASRInputSampleRateExamples(t *testing.T) { schema, err := CompileCurrent("http-task-detail.schema.json") if err != nil { t.Fatal(err) } for _, tc := range []struct { name string rate float64 }{ {"8khz", 8000}, {"16khz", 16000}, } { t.Run(tc.name, func(t *testing.T) { fixture, err := Files.ReadFile("schema/examples/config-read-task-asr-" + tc.name + ".json") if err != nil { t.Fatal(err) } var doc map[string]any if err := json.Unmarshal(fixture, &doc); err != nil { t.Fatal(err) } params := doc["agent"].(map[string]any)["asr"].(map[string]any)["params"].(map[string]any) if got := params["sample_rate"]; got != tc.rate { t.Fatalf("sample_rate=%v, want %v", got, tc.rate) } if err := schema.Validate(doc); err != nil { t.Fatal(err) } }) } } // Schema acceptance describes the task input, not a working resampler or a // provider's actual capabilities. Do not bind it to Agent's internal rate. func TestASRSampleRateSchemaDoesNotBindInternalFormat(t *testing.T) { schema, err := CompileCurrent("http-task-detail.schema.json") if err != nil { t.Fatal(err) } for _, mode := range []string{"asr", "full"} { fixture, err := Files.ReadFile("schema/examples/config-read-task-" + mode + ".json") if err != nil { t.Fatal(err) } for _, tc := range []struct { name string params map[string]any valid bool }{ {"empty parameters remain valid", map[string]any{}, true}, {"8khz input", map[string]any{"sample_rate": 8000}, true}, {"16khz input", map[string]any{"sample_rate": 16000}, true}, {"no fixed supported-rate enumeration", map[string]any{"sample_rate": 48000}, true}, {"nested parameters remain invalid", map[string]any{"sample_rate": map[string]any{"hz": 8000}}, false}, } { t.Run(mode+"/"+tc.name, func(t *testing.T) { var doc map[string]any if err := json.Unmarshal(fixture, &doc); err != nil { t.Fatal(err) } doc["agent"].(map[string]any)["asr"].(map[string]any)["params"] = tc.params if err := schema.Validate(doc); (err == nil) != tc.valid { t.Fatalf("valid=%t, want %t: %v", err == nil, tc.valid, err) } }) } } }