package main import ( "context" "net/http" "net/http/httptest" "strings" "testing" ) func TestSmallestInstalledPicksTheLeastBytes(t *testing.T) { if got := smallestInstalled(map[string]int64{"big": 9e9, "small": 4e8, "mid": 1e9}); got != "small" { t.Fatal(got) } if got := smallestInstalled(map[string]int64{"b": 5, "a": 5}); got != "a" { t.Fatalf("ties must be broken by name so the choice is stable: %q", got) } if smallestInstalled(nil) != "" { t.Fatal("no models -> empty") } } func TestInstallHintUsesTheConfiguredServerNotAFixedDomain(t *testing.T) { t.Setenv("WXCH_SERVER", "wss://control.example.org/ws/agent") if got := serverBase(); got != "https://control.example.org" { t.Fatal(got) } if h := installHint(); !strings.Contains(h, "https://control.example.org/get") || strings.Contains(h, "wxch.org") { t.Fatal(h) } t.Setenv("WXCH_SERVER", "ws://127.0.0.1:8080/ws/agent") if got := serverBase(); got != "http://127.0.0.1:8080" { t.Fatal(got) } } func TestAskOnceAcceptsContentOrThinking(t *testing.T) { answers := []string{ `{"choices":[{"message":{"content":"OK"}}]}`, `{"choices":[{"message":{"content":"","reasoning_content":"Okay, the user wants one word"}}]}`, `{"choices":[{"message":{"content":""}}]}`, } i := 0 srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Write([]byte(answers[i])) i++ })) defer srv.Close() if s, err := askOnce(context.Background(), srv.URL, "m"); err != nil || s != "OK" { t.Fatalf("%q %v", s, err) } if s, err := askOnce(context.Background(), srv.URL, "m"); err != nil || !strings.HasPrefix(s, "Okay") { t.Fatalf("a thinking model that ran out of tokens is still alive: %q %v", s, err) } if _, err := askOnce(context.Background(), srv.URL, "m"); err == nil { t.Fatal("an empty answer must fail the self-test") } } func TestAskOnceReportsHTTPErrors(t *testing.T) { srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { http.Error(w, "model not loaded", 503) })) defer srv.Close() if _, err := askOnce(context.Background(), srv.URL, "m"); err == nil || !strings.Contains(err.Error(), "503") { t.Fatalf("%v", err) } } func TestOneLineTrimsAndCollapses(t *testing.T) { if got := oneLine("a\n b\t c", 20); got != "a b c" { t.Fatal(got) } if got := oneLine(strings.Repeat("x", 100), 10); len([]rune(got)) != 11 { t.Fatal(got) } }