package render import ( "testing" flatbuffers "github.com/google/flatbuffers/go" "scrabble/pkg/fbs/scrabblefb" ) const gameID = "7c9e6679-7425-40de-944b-e07fc1f90ae7" func yourTurnPayload(id string) []byte { b := flatbuffers.NewBuilder(0) gid := b.CreateString(id) scrabblefb.YourTurnEventStart(b) scrabblefb.YourTurnEventAddGameId(b, gid) b.Finish(scrabblefb.YourTurnEventEnd(b)) return b.FinishedBytes() } func nudgePayload(id string) []byte { b := flatbuffers.NewBuilder(0) gid := b.CreateString(id) scrabblefb.NudgeEventStart(b) scrabblefb.NudgeEventAddGameId(b, gid) b.Finish(scrabblefb.NudgeEventEnd(b)) return b.FinishedBytes() } func matchFoundPayload(id string) []byte { b := flatbuffers.NewBuilder(0) gid := b.CreateString(id) scrabblefb.MatchFoundEventStart(b) scrabblefb.MatchFoundEventAddGameId(b, gid) b.Finish(scrabblefb.MatchFoundEventEnd(b)) return b.FinishedBytes() } func notifyPayload(kind string) []byte { b := flatbuffers.NewBuilder(0) k := b.CreateString(kind) scrabblefb.NotificationEventStart(b) scrabblefb.NotificationEventAddKind(b, k) b.Finish(scrabblefb.NotificationEventEnd(b)) return b.FinishedBytes() } func TestRenderGameEvents(t *testing.T) { cases := []struct { name, kind string payload []byte }{ {"your_turn", "your_turn", yourTurnPayload(gameID)}, {"nudge", "nudge", nudgePayload(gameID)}, {"match_found", "match_found", matchFoundPayload(gameID)}, } for _, tc := range cases { t.Run(tc.name+" en", func(t *testing.T) { m, ok := Render(tc.kind, tc.payload, "en") if !ok { t.Fatal("expected ok") } if m.StartParam != "g"+gameID { t.Errorf("StartParam = %q, want g%s", m.StartParam, gameID) } if m.ButtonText != "Open game" { t.Errorf("ButtonText = %q, want Open game", m.ButtonText) } if m.Text == "" { t.Error("Text is empty") } }) t.Run(tc.name+" ru", func(t *testing.T) { m, ok := Render(tc.kind, tc.payload, "ru") if !ok { t.Fatal("expected ok") } if m.ButtonText != "Открыть игру" { t.Errorf("ButtonText = %q, want Открыть игру", m.ButtonText) } }) } } func TestRenderNotify(t *testing.T) { cases := map[string]struct { subKind string wantOK bool }{ "invitation": {"invitation", true}, "friend_request": {"friend_request", true}, "friend_added": {"friend_added", false}, "game_started": {"game_started", false}, } for name, tc := range cases { t.Run(name, func(t *testing.T) { m, ok := Render("notify", notifyPayload(tc.subKind), "en") if ok != tc.wantOK { t.Fatalf("ok = %v, want %v", ok, tc.wantOK) } if ok && m.StartParam != "" { t.Errorf("StartParam = %q, want empty (lobby)", m.StartParam) } }) } } func TestRenderSkipsUnpushedKinds(t *testing.T) { for _, kind := range []string{"opponent_moved", "chat_message", "unknown"} { if _, ok := Render(kind, nil, "en"); ok { t.Errorf("kind %q: ok = true, want false", kind) } } }