package companion import ( "context" "encoding/json" "io" "net/http" "strings" "testing" "time" ) func TestClientStreamLogEventsUsesComponentSessionBodyAndSSE(t *testing.T) { stamp := time.Date(2026, 8, 31, 2, 0, 0, 0, time.UTC) config := loadTestConfig(t) client := newTestClient(t, config, roundTripFunc(func(request *http.Request) (*http.Response, error) { if request.Method != http.MethodPost || request.URL.Scheme != "https" || request.URL.Host != "platform.example.test" || request.URL.Path != logEventsPath { t.Fatalf("unexpected log stream request: %s %s", request.Method, request.URL.String()) } if request.Header.Get("Authorization") != "" { t.Fatalf("component session must stay in the typed JSON body, got Authorization header") } if request.Header.Get("Accept") != "text/event-stream" || request.Header.Get("Content-Type") != "application/json" { t.Fatalf("unexpected log stream headers: %+v", request.Header) } var body logStreamRequest decodeRequest(t, request, &body) if body.SessionToken != "session-token" { t.Fatalf("unexpected session token body: %#v", body) } logPayload, _ := json.Marshal(LogStreamEvent{ServerInstanceID: "server-1", StreamID: "stream-1", Source: "process", StreamKey: "stdout", LogSessionID: "session-live", SessionStartedAt: stamp, LatestSeq: 7, Entry: LogEntry{Seq: 7, Timestamp: stamp.Add(time.Second), Line: "SCUM LOGIN 76561198000000001 10.0.0.1", Redacted: true}}) bodyText := strings.Join([]string{ "event: ready", "data: {\"serverInstanceId\":\"server-1\"}", "", "event: log", "data: " + string(logPayload), "", ": heartbeat", "", }, "\n") return &http.Response{StatusCode: http.StatusOK, Header: http.Header{"Content-Type": []string{"text/event-stream"}}, Body: io.NopCloser(strings.NewReader(bodyText)), Request: request}, nil }), stamp) client.mu.Lock() client.sessionToken = "session-token" client.sessionExpiresAt = stamp.Add(time.Hour) client.mu.Unlock() var events []LogStreamEvent if err := client.StreamLogEvents(context.Background(), func(event LogStreamEvent) error { events = append(events, event) return nil }); err != nil { t.Fatalf("stream log events: %v", err) } if len(events) != 1 || events[0].Entry.Seq != 7 || events[0].Entry.Line != "SCUM LOGIN 76561198000000001 10.0.0.1" { t.Fatalf("unexpected streamed log events: %#v", events) } } func TestReadLogEventStreamRejectsMalformedLogEvent(t *testing.T) { err := readLogEventStream(context.Background(), strings.NewReader("event: log\ndata: {not-json}\n\n"), func(LogStreamEvent) error { return nil }) if err == nil || !strings.Contains(err.Error(), "decode log event") { t.Fatalf("expected malformed log event rejection, got %v", err) } }