feat: add messages feature

This commit is contained in:
2026-06-25 01:11:13 +03:30
parent 27c20b1d34
commit 9a86d2bd4d
4 changed files with 100 additions and 1 deletions
+64
View File
@@ -30,6 +30,8 @@ type anyMsg struct {
Players []PlayerInfo `json:"players"`
Code string `json:"code"` // table_lobby
Host bool `json:"host"` // table_lobby
Text string `json:"text"` // chat
Emoji string `json:"emoji"` // chat
}
// TestFourPlayersFullGame یک بازی کامل را روی WebSocket واقعی با ۴ ربات اجرا می‌کند.
@@ -585,6 +587,68 @@ func TestRefundOnAbort(t *testing.T) {
}
}
// TestChatBroadcast: پیامِ چتِ یک بازیکن باید برای همه‌ی میز (شاملِ گیرنده‌ی دیگر)
// با جایگاهِ فرستنده و متن پخش شود.
func TestChatBroadcast(t *testing.T) {
hub := testHub()
srv := httptest.NewServer(http.HandlerFunc(hub.ServeWS))
defer srv.Close()
wsURL := "ws" + strings.TrimPrefix(srv.URL, "http")
conns := make([]*websocket.Conn, 4)
seats := make([]int, 4)
for i := 0; i < 4; i++ {
c, _, err := websocket.DefaultDialer.Dial(wsURL+"?token="+strconv.Itoa(i), nil)
if err != nil {
t.Fatalf("dial %d: %v", i, err)
}
defer c.Close()
conns[i] = c
_ = c.WriteJSON(map[string]string{"type": "join_queue"})
}
// منتظرِ matched برای دانستنِ جایگاهِ فرستنده.
for i := 0; i < 4; i++ {
_ = conns[i].SetReadDeadline(time.Now().Add(3 * time.Second))
for {
_, raw, err := conns[i].ReadMessage()
if err != nil {
t.Fatalf("read matched %d: %v", i, err)
}
var m anyMsg
_ = json.Unmarshal(raw, &m)
if m.Type == "matched" {
seats[i] = m.Seat
break
}
}
}
// فرستنده: بازیکن ۰ یک پیام می‌فرستد.
_ = conns[0].WriteJSON(map[string]string{"type": "chat", "text": "سلام"})
// گیرنده: بازیکن ۱ باید پیامِ chat با جایگاهِ بازیکن ۰ و متنِ درست بگیرد.
_ = conns[1].SetReadDeadline(time.Now().Add(3 * time.Second))
got := false
for !got {
_, raw, err := conns[1].ReadMessage()
if err != nil {
t.Fatalf("read chat: %v", err)
}
var m anyMsg
_ = json.Unmarshal(raw, &m)
if m.Type == "chat" {
if m.Seat != seats[0] {
t.Fatalf("chat seat = %d, want %d", m.Seat, seats[0])
}
if m.Text != "سلام" {
t.Fatalf("chat text = %q, want سلام", m.Text)
}
got = true
}
}
}
// legalCard یک کارت مجاز انتخاب می‌کند (follow suit در صورت امکان).
func legalCard(hand []string, leadSuit string) string {
if leadSuit != "" {