package ws import ( "net/http/httptest" "strings" "testing" "time" "github.com/gin-gonic/gin" "github.com/gorilla/websocket" ) func TestControllerConnectAndBroadcast(t *testing.T) { gin.SetMode(gin.TestMode) hub := NewHub() controller := NewController(hub) router := gin.New() router.GET("/ws", controller.Connect) server := httptest.NewServer(router) defer server.Close() url := "ws" + strings.TrimPrefix(server.URL, "http") + "/ws?room=test&client_id=tester" conn, _, err := websocket.DefaultDialer.Dial(url, nil) if err != nil { t.Fatalf("Dial() error = %v", err) } defer conn.Close() _ = conn.SetReadDeadline(time.Now().Add(2 * time.Second)) // 连接后依次收到 welcome 和 joined presence。 for i := 0; i < 2; i++ { var message OutgoingMessage if err := conn.ReadJSON(&message); err != nil { t.Fatalf("initial ReadJSON() error = %v", err) } } if err := conn.WriteJSON(IncomingMessage{Type: EventMessage, Data: "hello"}); err != nil { t.Fatalf("WriteJSON() error = %v", err) } var message OutgoingMessage if err := conn.ReadJSON(&message); err != nil { t.Fatalf("ReadJSON() error = %v", err) } if message.Type != EventMessage || message.Data != "hello" || message.Room != "test" { t.Fatalf("unexpected broadcast: %+v", message) } }