Files
go-sip/internal/rpc/approved_fixture_test.go
T

84 lines
2.2 KiB
Go

package rpc
import (
"context"
"encoding/json"
"github.com/coder/websocket"
"net/http"
"os"
"testing"
"time"
)
func approvedFullTestJSON(t *testing.T) []byte {
t.Helper()
raw, err := os.ReadFile("../../contracts/schema/examples/config-read-task-full.json")
if err != nil {
t.Fatal(err)
}
var body map[string]any
if json.Unmarshal(raw, &body) != nil {
t.Fatal("decode full task fixture")
}
a := body["agent"].(map[string]any)
a["llm"] = map[string]any{"provider_ref": "openai_compatible", "model": "example-chat", "params": map[string]any{"temperature": 0, "max_tokens": 256}}
a["tts"] = map[string]any{"provider_ref": "ali_bailian", "model": "qwen3-tts-flash", "voice": "Cherry", "params": map[string]any{"format": "pcm", "sample_rate": 16000}}
raw, err = json.Marshal(body)
if err != nil {
t.Fatal(err)
}
return raw
}
func serveApprovedTTSMock(t *testing.T, w http.ResponseWriter, r *http.Request, observe func(map[string]any)) {
t.Helper()
conn, err := websocket.Accept(w, r, nil)
if err != nil {
t.Error(err)
return
}
defer conn.CloseNow()
ctx, cancel := context.WithTimeout(r.Context(), 3*time.Second)
defer cancel()
read := func() map[string]any {
_, raw, err := conn.Read(ctx)
if err != nil {
t.Error(err)
return nil
}
var command map[string]any
if json.Unmarshal(raw, &command) != nil {
t.Error("invalid task command")
}
return command
}
start := read()
if start == nil {
return
}
id := start["header"].(map[string]any)["task_id"].(string)
event := func(name string) {
raw, _ := json.Marshal(map[string]any{"header": map[string]any{"task_id": id, "event": name}, "payload": map[string]any{}})
if err := conn.Write(ctx, websocket.MessageText, raw); err != nil {
t.Error(err)
}
}
event("task-started")
next := read()
if next == nil {
return
}
finish := read()
if finish == nil {
return
}
p := start["payload"].(map[string]any)
input := next["payload"].(map[string]any)["input"]
observe(map[string]any{"model": p["model"], "parameters": p["parameters"], "input": input})
if err := conn.Write(ctx, websocket.MessageBinary, []byte{1, 0, 2, 0}); err != nil {
t.Error(err)
return
}
event("task-finished")
}