package services import ( "net/http" "strings" "testing" "code.tczkiot.com/wlw/ai-agent/internal/pkg/dto/response" ) func TestRealtimeEventJSONUsesSnakeCaseFields(t *testing.T) { event := RealtimeEvent{ EventID: "event-1", Type: "message.created", Data: RealtimeMessageCreatedPayload{ ConversationID: 12, MessageID: 34, }, } body, err := marshalRealtimeEvent(event) if err != nil { t.Fatal(err) } text := string(body) for _, field := range []string{`"event_id"`, `"conversation_id"`, `"message_id"`} { if !strings.Contains(text, field) { t.Fatalf("expected %s in %s", field, text) } } if strings.Contains(text, "eventId") || strings.Contains(text, "conversationId") { t.Fatalf("unexpected camelCase field in %s", text) } } func TestWebsocketUpgradeHeaderEchoesBearerProtocol(t *testing.T) { req, err := http.NewRequest(http.MethodGet, "http://example.com/api/ws/dashboard", nil) if err != nil { t.Fatal(err) } req.Header.Set("Sec-WebSocket-Protocol", "bearer.header-safe-token") header := websocketUpgradeHeader(req) if got := header.Get("Sec-WebSocket-Protocol"); got != "bearer.header-safe-token" { t.Fatalf("expected bearer protocol to be echoed, got %q", got) } } func TestWebsocketUpgradeHeaderIgnoresNonBearerProtocol(t *testing.T) { req, err := http.NewRequest(http.MethodGet, "http://example.com/api/ws/dashboard", nil) if err != nil { t.Fatal(err) } req.Header.Set("Sec-WebSocket-Protocol", "chat") if header := websocketUpgradeHeader(req); header != nil { t.Fatalf("expected non-bearer protocol to be ignored, got %v", header) } } func TestWsNotificationTopic(t *testing.T) { svc := newWsService() if got := svc.notificationTopic(123); got != "notification:123" { t.Fatalf("expected notification:123, got %q", got) } } func TestWsNotificationCreatedEventType(t *testing.T) { event := RealtimeNotificationCreatedEvent{ Payload: RealtimeNotificationCreatedPayload{ Notification: response.NotificationResponse{ID: 1}, }, } if got := event.EventType(); got != "notification.created" { t.Fatalf("expected notification.created, got %q", got) } if payload := event.EventPayload(); payload == nil { t.Fatalf("expected payload") } }