Skip to content

Commit 6734fa0

Browse files
committed
Run resource sensititve tests alone on Mac
Add extra wait buffer to flaky test sensitive to timing issues Properly consume first `SystemInfoEvent` in fixture to ensure no interference with tests
1 parent de3a0d2 commit 6734fa0

File tree

6 files changed

+31
-3
lines changed

6 files changed

+31
-3
lines changed

tests/unit/_autoscaling/test_snapshotter.py

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from __future__ import annotations
22

3+
import asyncio
34
from datetime import datetime, timedelta, timezone
45
from logging import getLogger
56
from typing import TYPE_CHECKING, cast
@@ -23,8 +24,22 @@
2324

2425
@pytest.fixture
2526
async def event_manager() -> AsyncGenerator[LocalEventManager, None]:
26-
# Use a long interval to avoid interference from periodic system info events during tests
27-
async with LocalEventManager(system_info_interval=timedelta(hours=9999)) as event_manager:
27+
# Use a long interval to avoid interference from periodic system info events during tests and ensure the first
28+
# automatic event is consumed before yielding.
29+
30+
event_manager = LocalEventManager(system_info_interval=timedelta(hours=9999))
31+
32+
initial_system_info_consumed = asyncio.Event()
33+
34+
async def consume_automatic_system_info(_: EventSystemInfoData) -> None:
35+
initial_system_info_consumed.set()
36+
37+
event_manager.on(event=Event.SYSTEM_INFO, listener=consume_automatic_system_info)
38+
39+
async with event_manager:
40+
await initial_system_info_consumed.wait()
41+
event_manager.off(event=Event.SYSTEM_INFO, listener=consume_automatic_system_info)
42+
2843
yield event_manager
2944

3045

tests/unit/_utils/test_recurring_task.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import pytest
88

99
from crawlee._utils.recurring_task import RecurringTask
10+
from tests.unit.utils import run_alone_on_mac
1011

1112

1213
@pytest.fixture
@@ -41,6 +42,7 @@ async def test_start_and_stop(function: AsyncMock, delay: timedelta) -> None:
4142
assert rt.task.done()
4243

4344

45+
@run_alone_on_mac
4446
async def test_execution(function: AsyncMock, delay: timedelta) -> None:
4547
task = RecurringTask(function, delay)
4648

tests/unit/browsers/test_browser_pool.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import pytest
66

77
from crawlee.browsers import BrowserPool, PlaywrightBrowserPlugin
8+
from tests.unit.utils import run_alone_on_mac
89

910
if TYPE_CHECKING:
1011
from yarl import URL
@@ -92,6 +93,7 @@ async def test_new_page_with_each_plugin(server_url: URL) -> None:
9293
assert browser_pool.total_pages_count == 2
9394

9495

96+
@run_alone_on_mac
9597
async def test_with_default_plugin_constructor(server_url: URL) -> None:
9698
async with BrowserPool.with_default_plugin(headless=True, browser_type='firefox') as browser_pool:
9799
assert len(browser_pool.plugins) == 1

tests/unit/crawlers/_basic/test_basic_crawler.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1373,6 +1373,7 @@ async def test_timeout_in_handler(sleep_type: str) -> None:
13731373
# Test is skipped in older Python versions.
13741374
from asyncio import timeout # type:ignore[attr-defined] # noqa: PLC0415
13751375

1376+
non_realtime_system_coefficient = 2
13761377
handler_timeout = timedelta(seconds=1)
13771378
max_request_retries = 3
13781379
double_handler_timeout_s = handler_timeout.total_seconds() * 2
@@ -1401,7 +1402,7 @@ async def handler(context: BasicCrawlingContext) -> None:
14011402

14021403
# Timeout in pytest, because previous implementation would run crawler until following:
14031404
# "The request queue seems to be stuck for 300.0s, resetting internal state."
1404-
async with timeout(max_request_retries * double_handler_timeout_s):
1405+
async with timeout(max_request_retries * double_handler_timeout_s * non_realtime_system_coefficient):
14051406
await crawler.run(['https://a.placeholder.com'])
14061407

14071408
assert crawler.statistics.state.requests_finished == 1

tests/unit/request_loaders/test_sitemap_request_loader.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from crawlee.http_clients._base import HttpClient
99
from crawlee.request_loaders._sitemap_request_loader import SitemapRequestLoader
1010
from crawlee.storages import KeyValueStore
11+
from tests.unit.utils import run_alone_on_mac
1112

1213
BASIC_SITEMAP = """
1314
<?xml version="1.0" encoding="UTF-8"?>
@@ -50,6 +51,7 @@ def encode_base64(data: bytes) -> str:
5051
return base64.b64encode(data).decode('utf-8')
5152

5253

54+
@run_alone_on_mac
5355
async def test_sitemap_traversal(server_url: URL, http_client: HttpClient) -> None:
5456
sitemap_url = (server_url / 'sitemap.xml').with_query(base64=encode_base64(BASIC_SITEMAP.encode()))
5557
sitemap_loader = SitemapRequestLoader([str(sitemap_url)], http_client=http_client)
@@ -66,6 +68,7 @@ async def test_sitemap_traversal(server_url: URL, http_client: HttpClient) -> No
6668
assert await sitemap_loader.get_handled_count() == 5
6769

6870

71+
@run_alone_on_mac
6972
async def test_is_empty_does_not_depend_on_fetch_next_request(server_url: URL, http_client: HttpClient) -> None:
7073
sitemap_url = (server_url / 'sitemap.xml').with_query(base64=encode_base64(BASIC_SITEMAP.encode()))
7174
sitemap_loader = SitemapRequestLoader([str(sitemap_url)], http_client=http_client)

tests/unit/utils.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import sys
2+
3+
import pytest
4+
5+
run_alone_on_mac = pytest.mark.run_alone if sys.platform == 'darwin' else lambda x: x

0 commit comments

Comments
 (0)