package calls import ( "bufio" "context" "encoding/json" "net/http" "net/http/httptest" "net/url" "regexp" "strings" "testing" "time" ) func TestHomeConnectionKeepsCurrentCallAndAgentRoutes(t *testing.T) { f := newHomeRouterFixture(t) f.link(t) started := f.do("POST", "/meetings/start", "") if started.Code != http.StatusOK { t.Fatalf("start call: %d", started.Code) } links := regexp.MustCompile(`href="(/m/[A-Za-z0-9]+/join)"`).FindStringSubmatch(started.Body.String()) if len(links) != 2 { t.Fatal("missing holding page link") } target := links[1] if !strings.HasPrefix(target, "/m/") { t.Fatal("start call lost room destination") } if w := f.do("GET", target, ""); w.Code != 200 { t.Fatalf("call page: %d", w.Code) } room := strings.TrimSuffix(target, "/join") if w := f.do("GET", room+"/stream?probe=1", ""); w.Code != http.StatusNoContent { t.Fatalf("Home stream probe: %d", w.Code) } server := httptest.NewServer(f.handler) defer server.Close() ctx, cancel := context.WithTimeout(t.Context(), 5*time.Second) defer cancel() req, err := http.NewRequestWithContext(ctx, "GET", server.URL+room+"/stream", nil) if err != nil { t.Fatal(err) } origin, _ := url.Parse(homeTestOrigin) req.Host = origin.Host req.Header.Set("Accept", "text/event-stream") for _, c := range f.cookies { req.AddCookie(c) } resp, err := server.Client().Do(req) if err != nil { t.Fatal(err) } defer resp.Body.Close() if resp.StatusCode != 200 { t.Fatalf("Home stream: %d", resp.StatusCode) } scanner := bufio.NewScanner(resp.Body) var hello struct{ Peer string } for scanner.Scan() { if strings.HasPrefix(scanner.Text(), "data:") { if err := json.Unmarshal([]byte(strings.TrimSpace(strings.TrimPrefix(scanner.Text(), "data:"))), &hello); err != nil { t.Fatal(err) } if hello.Peer != "" { break } } } if hello.Peer == "" { t.Fatalf("Home stream missing hello: %v", scanner.Err()) } payload, err := json.Marshal(map[string]string{"type": "join", "peer": hello.Peer}) if err != nil { t.Fatal(err) } signal := httptest.NewRequest("POST", homeTestOrigin+room+"/signal", strings.NewReader(string(payload))) signal.Header.Set("Origin", homeTestOrigin) signal.Header.Set("Content-Type", "application/json") for _, c := range f.cookies { signal.AddCookie(c) } joined := httptest.NewRecorder() f.handler.ServeHTTP(joined, signal) if joined.Code != 200 { t.Fatalf("Home join signal: %d", joined.Code) } if w := f.do("GET", room+"/ice?peer="+hello.Peer, ""); w.Code != 200 { t.Fatalf("Home admitted ICE: %d", w.Code) } resp.Body.Close() cancel() if w := f.do("GET", "/settings", ""); w.Code != 200 || !strings.Contains(w.Body.String(), "alice@example.test") { t.Fatalf("settings lost existing principal: %d", w.Code) } created := f.do("POST", "/settings/agents", "name=home-integration-test") if created.Code != 200 { t.Fatalf("create agent: %d", created.Code) } token := regexp.MustCompile(`value="(mt_[A-Za-z0-9_-]+)"`).FindStringSubmatch(created.Body.String()) if len(token) != 2 { t.Fatal("missing once-shown agent token") } api := func(method, path, body, bearer string, cookies bool) *httptest.ResponseRecorder { r := httptest.NewRequest(method, homeTestOrigin+path, strings.NewReader(body)) r.Header.Set("Content-Type", "application/json") if bearer != "" { r.Header.Set("Authorization", "Bearer "+bearer) } if cookies { for _, c := range f.cookies { r.AddCookie(c) } } w := httptest.NewRecorder() f.handler.ServeHTTP(w, r) return w } if w := api("GET", "/api/v1/meetings", "", token[1], false); w.Code != 200 { t.Fatalf("bearer API with Home enabled: %d", w.Code) } if w := api("POST", "/api/v1/meetings", `{"title":"Agent call"}`, token[1], false); w.Code != 201 { t.Fatalf("bearer mutation incorrectly requires browser proof: %d", w.Code) } if w := api("GET", "/api/v1/meetings", "", "", true); w.Code != 401 { t.Fatalf("API accepted ambient Home cookie: %d", w.Code) } r := httptest.NewRequest("POST", homeTestOrigin+"/meetings/start", nil) for _, c := range f.cookies { r.AddCookie(c) } w := httptest.NewRecorder() f.handler.ServeHTTP(w, r) if w.Code != 403 { t.Fatalf("browser mutation lost CSRF protection: %d", w.Code) } homeSignout(t, f.do("POST", "/signout", "")) if w := f.do("GET", target, ""); w.Code != 303 { t.Fatalf("room survives signout: %d", w.Code) } }