From bd1fa09dc2a47cd8e512c912e2f977188554d6ad Mon Sep 17 00:00:00 2001 From: Daniel Roth Date: Thu, 4 Jun 2026 12:50:16 +0000 Subject: [PATCH] =?UTF-8?q?Playwright=20tmp=20dirs=20are=20cleaned=20up=20?= =?UTF-8?q?after=20browser=20close=20=F0=9F=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pashub_fetcher/tests/test_token_getter.py | 50 +++++++++++++++++++ backend/pashub_fetcher/token_getter.py | 2 + 2 files changed, 52 insertions(+) create mode 100644 backend/pashub_fetcher/tests/test_token_getter.py diff --git a/backend/pashub_fetcher/tests/test_token_getter.py b/backend/pashub_fetcher/tests/test_token_getter.py new file mode 100644 index 00000000..2c847d16 --- /dev/null +++ b/backend/pashub_fetcher/tests/test_token_getter.py @@ -0,0 +1,50 @@ +from unittest.mock import MagicMock, patch + +from backend.pashub_fetcher.token_getter import get_token_from_local_storage + + +def _configure_playwright_mock(mock_sync_playwright: MagicMock) -> None: + mock_page = MagicMock() + mock_page.url = "https://pashub.net/dashboard" + mock_page.evaluate.return_value = "fake-token" + + mock_context = MagicMock() + mock_context.new_page.return_value = mock_page + + mock_browser = MagicMock() + mock_browser.new_context.return_value = mock_context + + mock_p = MagicMock() + mock_p.chromium.launch.return_value = mock_browser + + mock_sync_playwright.return_value.__enter__.return_value = mock_p + + +@patch("backend.pashub_fetcher.token_getter.shutil.rmtree") +@patch("backend.pashub_fetcher.token_getter.glob.glob") +@patch("backend.pashub_fetcher.token_getter.sync_playwright") +def test_playwright_tmp_dirs_are_cleaned_up_after_browser_close( + mock_sync_playwright: MagicMock, + mock_glob: MagicMock, + mock_rmtree: MagicMock, +) -> None: + # Arrange + fake_artifacts = ["/tmp/playwright-artifacts-abc12"] + fake_profiles = ["/tmp/playwright_chromiumdev_profile-xyz99"] + + def glob_side_effect(pattern: str) -> list[str]: + if "playwright-artifacts-*" in pattern: + return fake_artifacts + if "playwright_chromiumdev_profile-*" in pattern: + return fake_profiles + return [] + + mock_glob.side_effect = glob_side_effect + _configure_playwright_mock(mock_sync_playwright) + + # Act + get_token_from_local_storage("user@example.com", "secret") + + # Assert + mock_rmtree.assert_any_call("/tmp/playwright-artifacts-abc12", ignore_errors=True) + mock_rmtree.assert_any_call("/tmp/playwright_chromiumdev_profile-xyz99", ignore_errors=True) diff --git a/backend/pashub_fetcher/token_getter.py b/backend/pashub_fetcher/token_getter.py index 2e2d1440..990e79d0 100644 --- a/backend/pashub_fetcher/token_getter.py +++ b/backend/pashub_fetcher/token_getter.py @@ -1,4 +1,6 @@ +import glob import os +import shutil from playwright.sync_api import sync_playwright, TimeoutError as PlaywrightTimeoutError