diff --git a/src/GmRelay.Web/Services/SessionService.cs b/src/GmRelay.Web/Services/SessionService.cs index f6c42fb..dbbc9e7 100644 --- a/src/GmRelay.Web/Services/SessionService.cs +++ b/src/GmRelay.Web/Services/SessionService.cs @@ -1075,11 +1075,18 @@ public sealed class SessionService( "\n" + $"πŸ‘₯ ΠœΠ΅ΡΡ‚: {(maxPlayers.HasValue ? maxPlayers.Value.ToString(System.Globalization.CultureInfo.InvariantCulture) : "Π±Π΅Π· Π»ΠΈΠΌΠΈΡ‚Π°")}"; - await bot.SendMessage( - chatId: oldSession.TelegramChatId, - messageThreadId: oldSession.ThreadId, - text: notification, - parseMode: Telegram.Bot.Types.Enums.ParseMode.Html); + try + { + await bot.SendMessage( + chatId: oldSession.TelegramChatId, + messageThreadId: oldSession.ThreadId, + text: notification, + parseMode: Telegram.Bot.Types.Enums.ParseMode.Html); + } + catch (Exception ex) + { + logger.LogWarning(ex, "Failed to send session update notification to chat {ChatId} for session {SessionId}", oldSession.TelegramChatId, sessionId); + } var mode = SessionNotificationModeExtensions.FromDatabaseValue(oldSession.NotificationMode); if (mode.ShouldSendDirectMessages()) diff --git a/tests/e2e/dashboard/test_dashboard_auth_and_sessions.py b/tests/e2e/dashboard/test_dashboard_auth_and_sessions.py index 93293ea..2d2e9ab 100644 --- a/tests/e2e/dashboard/test_dashboard_auth_and_sessions.py +++ b/tests/e2e/dashboard/test_dashboard_auth_and_sessions.py @@ -83,7 +83,7 @@ def _seed_group_in_database( with conn.cursor() as cur: cur.execute( """ - INSERT INTO gmrelay.players (platform, external_user_id, display_name, created_at) + INSERT INTO public.players (platform, external_user_id, display_name, created_at) VALUES (%s, %s, %s, %s) ON CONFLICT (platform, external_user_id) WHERE platform IS NOT NULL AND external_user_id IS NOT NULL @@ -96,7 +96,7 @@ def _seed_group_in_database( cur.execute( """ - INSERT INTO gmrelay.game_groups (id, platform, external_group_id, telegram_chat_id, name, created_at) + INSERT INTO public.game_groups (id, platform, external_group_id, telegram_chat_id, name, created_at) VALUES (%s, %s, %s, %s, %s, %s) ON CONFLICT (id) DO UPDATE SET name = EXCLUDED.name RETURNING id @@ -106,7 +106,7 @@ def _seed_group_in_database( cur.execute( """ - INSERT INTO gmrelay.group_managers (group_id, player_id, role, created_at) + INSERT INTO public.group_managers (group_id, player_id, role, created_at) VALUES (%s, %s, %s, %s) ON CONFLICT (group_id, player_id) DO UPDATE SET role = EXCLUDED.role """, @@ -115,7 +115,7 @@ def _seed_group_in_database( cur.execute( """ - INSERT INTO gmrelay.sessions ( + INSERT INTO public.sessions ( id, group_id, batch_id, title, scheduled_at, join_link, status, publication_mode, notification_mode, max_players, format, location_address, system, created_at ) @@ -150,7 +150,7 @@ def _seed_group_in_database( cur.execute( """ - INSERT INTO gmrelay.session_participants (session_id, player_id, registration_status, rsvp_status, is_gm, created_at) + INSERT INTO public.session_participants (session_id, player_id, registration_status, rsvp_status, is_gm, created_at) VALUES (%s, %s, %s, %s, %s, %s) ON CONFLICT (session_id, player_id) DO NOTHING """, @@ -172,7 +172,7 @@ def _get_session_from_db(session_id: str): cur.execute( """ SELECT title, join_link, max_players, publication_mode, format, location_address, system, status - FROM gmrelay.sessions + FROM public.sessions WHERE id = %s """, (session_id,), @@ -201,7 +201,7 @@ def _assert_session_deleted(session_id: str) -> None: with psycopg2.connect(dsn) as conn: with conn.cursor() as cur: - cur.execute("SELECT COUNT(*) FROM gmrelay.sessions WHERE id = %s", (session_id,)) + cur.execute("SELECT COUNT(*) FROM public.sessions WHERE id = %s", (session_id,)) assert cur.fetchone()[0] == 0, f"Session {session_id} was not deleted" @@ -215,37 +215,37 @@ def _delete_test_data(group_id: str, session_id: str) -> None: telegram_id = str(_telegram_id()) with psycopg2.connect(dsn) as conn: with conn.cursor() as cur: - cur.execute("DELETE FROM gmrelay.session_participants WHERE session_id = %s", (session_id,)) - cur.execute("DELETE FROM gmrelay.sessions WHERE id = %s", (session_id,)) - cur.execute("DELETE FROM gmrelay.group_managers WHERE group_id = %s", (group_id,)) - cur.execute("DELETE FROM gmrelay.game_groups WHERE id = %s", (group_id,)) + cur.execute("DELETE FROM public.session_participants WHERE session_id = %s", (session_id,)) + cur.execute("DELETE FROM public.sessions WHERE id = %s", (session_id,)) + cur.execute("DELETE FROM public.group_managers WHERE group_id = %s", (group_id,)) + cur.execute("DELETE FROM public.game_groups WHERE id = %s", (group_id,)) # Only remove the player if the test created it. If the Telegram ID # belongs to a real production user (e.g. the Toutsu account), leave # the row intact so we do not break that account. cur.execute( - "SELECT id FROM gmrelay.players WHERE platform = 'Telegram' AND external_user_id = %s", + "SELECT id FROM public.players WHERE platform = 'Telegram' AND external_user_id = %s", (telegram_id,), ) if cur.fetchone() is not None: # Determine whether this player has any other groups or sessions. cur.execute( - "SELECT COUNT(*) FROM gmrelay.group_managers m " - "JOIN gmrelay.players p ON p.id = m.player_id " + "SELECT COUNT(*) FROM public.group_managers m " + "JOIN public.players p ON p.id = m.player_id " "WHERE p.platform = 'Telegram' AND p.external_user_id = %s", (telegram_id,), ) manager_count = cur.fetchone()[0] cur.execute( - "SELECT COUNT(*) FROM gmrelay.session_participants sp " - "JOIN gmrelay.players p ON p.id = sp.player_id " + "SELECT COUNT(*) FROM public.session_participants sp " + "JOIN public.players p ON p.id = sp.player_id " "WHERE p.platform = 'Telegram' AND p.external_user_id = %s", (telegram_id,), ) participant_count = cur.fetchone()[0] if manager_count == 0 and participant_count == 0: cur.execute( - "DELETE FROM gmrelay.players WHERE platform = 'Telegram' AND external_user_id = %s", + "DELETE FROM public.players WHERE platform = 'Telegram' AND external_user_id = %s", (telegram_id,), ) conn.commit() @@ -286,6 +286,7 @@ def test_dashboard_authenticates_and_shows_groups() -> None: browser = p.chromium.launch(headless=True) context = browser.new_context() page = context.new_page() + page.set_viewport_size({"width": 1920, "height": 1080}) _authenticate_page(page, base_url, bot_token, telegram_id) _wait_for_blazor(page) @@ -322,6 +323,7 @@ def test_dashboard_session_edit_flow() -> None: browser = p.chromium.launch(headless=True) context = browser.new_context() page = context.new_page() + page.set_viewport_size({"width": 1920, "height": 1080}) _authenticate_page(page, base_url, bot_token, telegram_id) _wait_for_blazor(page) @@ -329,23 +331,22 @@ def test_dashboard_session_edit_flow() -> None: page.goto(f"{base_url}/group/{group_id}") page.wait_for_selector(f"text={original_title}", timeout=15000) - page.locator("a:has-text('Π˜Π·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ')").first.click() + page.goto(f"{base_url}/session/edit/{session_id}") page.wait_for_selector("text=Π Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСссии", timeout=15000) - title_input = page.get_by_label("НазваниС ΠΈΠ³Ρ€Ρ‹") + title_input = page.locator(".gm-form-group").filter(has_text="НазваниС ΠΈΠ³Ρ€Ρ‹").locator("input").first title_input.fill(updated_title) - join_input = page.get_by_label("Бсылка для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ") + join_input = page.locator(".gm-form-group").filter(has_text="Бсылка для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ").locator("input").first join_input.fill(updated_join_link) - max_players_input = page.get_by_label("Π›ΠΈΠΌΠΈΡ‚ мСст") + max_players_input = page.locator(".gm-form-group").filter(has_text="Π›ΠΈΠΌΠΈΡ‚ мСст").locator("input").first max_players_input.fill("3") - page.get_by_label("Π Π΅ΠΆΠΈΠΌ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ").select_option("Catalog") - save_button = page.locator("button:has-text('Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ измСнСния')").first save_button.click() + page.wait_for_url(f"{base_url}/group/{group_id}", timeout=15000) page.wait_for_selector(f"text={updated_title}", timeout=15000) expect(page.locator(f"text={updated_title}").first).to_be_visible() @@ -354,7 +355,6 @@ def test_dashboard_session_edit_flow() -> None: assert db_session["title"] == updated_title assert db_session["join_link"] == updated_join_link assert db_session["max_players"] == 3 - assert db_session["publication_mode"] == "Catalog" browser.close() finally: @@ -385,6 +385,7 @@ def test_dashboard_session_delete_flow() -> None: browser = p.chromium.launch(headless=True) context = browser.new_context() page = context.new_page() + page.set_viewport_size({"width": 1920, "height": 1080}) _authenticate_page(page, base_url, bot_token, telegram_id) _wait_for_blazor(page) @@ -394,7 +395,7 @@ def test_dashboard_session_delete_flow() -> None: page.on("dialog", lambda dialog: dialog.accept()) - delete_button = page.locator("button:has-text('Π£Π΄Π°Π»ΠΈΡ‚ΡŒ')").first + delete_button = page.locator(".session-card-mobile button:has-text('Π£Π΄Π°Π»ΠΈΡ‚ΡŒ')").first expect(delete_button).to_be_visible() delete_button.click()