From d678c59105dc65fb444c6ea484f5a6115e90483a Mon Sep 17 00:00:00 2001 From: Toutsu Date: Sat, 13 Jun 2026 15:59:53 +0300 Subject: [PATCH] test: add Web TelegramSessionBatchRenderer tests Mirrors the Bot renderer tests for the duplicated Web renderer so both Telegram consumers are covered against regressions. --- .../WebTelegramSessionBatchRendererTests.cs | 81 +++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 tests/GmRelay.Bot.Tests/Web/Rendering/WebTelegramSessionBatchRendererTests.cs diff --git a/tests/GmRelay.Bot.Tests/Web/Rendering/WebTelegramSessionBatchRendererTests.cs b/tests/GmRelay.Bot.Tests/Web/Rendering/WebTelegramSessionBatchRendererTests.cs new file mode 100644 index 0000000..530cd84 --- /dev/null +++ b/tests/GmRelay.Bot.Tests/Web/Rendering/WebTelegramSessionBatchRendererTests.cs @@ -0,0 +1,81 @@ +using GmRelay.Shared.Domain; +using GmRelay.Shared.Rendering; +using GmRelay.Web.Services; + +namespace GmRelay.Bot.Tests.Web.Rendering; + +public sealed class WebTelegramSessionBatchRendererTests +{ + [Fact] + public void Render_ShouldShowStructuredGameCard() + { + var sessionId = Guid.NewGuid(); + var sessions = new[] + { + new SessionBatchDto( + sessionId, + new DateTime(2026, 6, 13, 16, 0, 0, DateTimeKind.Utc), + SessionStatus.Planned, + 4, + "https://vtt.example/game", + "Hybrid", + "Moscow, Kubik Bar", + "Mystery one-shot in Bamberg.", + "D\u0026D 5e", + 240, + true) + }; + var participants = new[] + { + new ParticipantBatchDto(sessionId, "Alice", "alice", ParticipantRegistrationStatus.Active), + new ParticipantBatchDto(sessionId, "Bob", null, ParticipantRegistrationStatus.Waitlisted) + }; + + var view = SessionBatchViewBuilder.Build("Structured Test", sessions, participants); + var (text, markup) = TelegramSessionBatchRenderer.Render(view); + + Assert.Contains("🏷", text); + Assert.Contains("Система:", text); + Assert.Contains("D\u0026amp;D 5e", text); + Assert.Contains("Формат:", text); + Assert.Contains("Hybrid", text); + Assert.Contains("Тип:", text); + Assert.Contains("One-shot", text); + Assert.Contains("⏱", text); + Assert.Contains("Длительность:", text); + Assert.Contains("4 ч", text); + Assert.Contains("📝", text); + Assert.Contains("Описание:", text); + Assert.Contains("Mystery one-shot in Bamberg.", text); + Assert.Contains("🔗", text); + Assert.Contains("Ссылка:", text); + Assert.Contains("📍", text); + Assert.Contains("Адрес:", text); + Assert.Contains("@alice", text); + Assert.Contains("Bob", text); + Assert.Contains("Лист ожидания", text); + + var buttons = markup.InlineKeyboard.SelectMany(row => row).ToList(); + Assert.Equal(2, buttons.Count); + } + + [Fact] + public void Render_ShouldHandleMissingOptionalFields() + { + var sessionId = Guid.NewGuid(); + var sessions = new[] { new SessionBatchDto(sessionId, DateTime.UtcNow, SessionStatus.Planned, 4, "") }; + var participants = Array.Empty(); + + var view = SessionBatchViewBuilder.Build("Minimal", sessions, participants); + var (text, _) = TelegramSessionBatchRenderer.Render(view); + + Assert.Contains("📅", text); + Assert.Contains("👥", text); + Assert.DoesNotContain("Система:", text); + Assert.DoesNotContain("Формат:", text); + Assert.DoesNotContain("Длительность:", text); + Assert.DoesNotContain("Описание:", text); + Assert.DoesNotContain("Ссылка:", text); + Assert.DoesNotContain("Адрес:", text); + } +}