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); } }