fix(ci): run full pytest suite, repair 13 rotted tests
CI was running only test_plugin_contract.py and test_version_consistency.py (2 of 84 test files), masking 13 rotted tests across 4 clusters. The suite is fully offline-safe (1402 tests in ~7s without network), so the narrow scope wasn't gating integration flakiness; it was just stale. validate.yml now runs `uv run pytest` against the full suite. Engine fix: store.findings_from_report is rerank-first. ranked_candidates is the primary persistence path; hackernews/polymarket are unconditionally supplemented from items_by_source because they rank poorly but matter for watchlists. When ranked_candidates was empty (rerank failed or skipped), reddit, x, and every other source were silently dropped. The supplement loop now falls back to all sources only when ranked_candidates is empty; the normal path is unchanged. Test repairs: - test_store.py (6) + test_watchlist_commands.py (2): cascade from the engine fix - test_get_new_findings_filters_by_date (latent): local-time vs SQLite UTC flake — switched to datetime.now(timezone.utc) - TestPollDeviceAuth (3): mock_time.time side_effect lists too short after impl added a last_reminder call — padded timeout test, pinned others to return_value=0 (loops terminate via urlopen, not the clock) - test_bare_run_emits_web_promo: engine reads ~/.config/last30days/.env, so a contributor's saved EXA/PARALLEL key made grounding "available" and suppressed the web promo. Also missing X made the "x" promo preempt "web". Set LAST30DAYS_CONFIG_DIR="", subprocess cwd=tmpdir, XAI_API_KEY stub.
This commit is contained in:
@@ -200,8 +200,10 @@ class TestPollDeviceAuth:
|
||||
@patch("lib.setup_wizard.urlopen")
|
||||
def test_timeout_returns_none(self, mock_urlopen, mock_time):
|
||||
"""Returns None when timeout is exceeded."""
|
||||
# Simulate time passing beyond deadline
|
||||
mock_time.time = MagicMock(side_effect=[0, 301])
|
||||
# poll_device_auth calls time.time() for deadline init, last_reminder init,
|
||||
# then once per while-loop iteration. Three values are enough for one check
|
||||
# that exceeds the deadline.
|
||||
mock_time.time = MagicMock(side_effect=[0, 0, 301])
|
||||
mock_time.sleep = MagicMock()
|
||||
|
||||
result = setup_wizard.poll_device_auth("dc-123", interval=5, timeout=300)
|
||||
@@ -211,7 +213,9 @@ class TestPollDeviceAuth:
|
||||
@patch("lib.setup_wizard.urlopen")
|
||||
def test_expired_token_returns_none(self, mock_urlopen, mock_time):
|
||||
"""Returns None on expired_token error."""
|
||||
mock_time.time = MagicMock(side_effect=[0, 0])
|
||||
# Loop terminates via urlopen response, not the clock — pin time to 0
|
||||
# so the deadline check stays a non-event regardless of call count.
|
||||
mock_time.time = MagicMock(return_value=0)
|
||||
mock_time.sleep = MagicMock()
|
||||
|
||||
expired_resp = MagicMock()
|
||||
@@ -230,7 +234,7 @@ class TestPollDeviceAuth:
|
||||
"""HTTP 400 during polling continues (authorization pending)."""
|
||||
from urllib.error import HTTPError
|
||||
|
||||
mock_time.time = MagicMock(side_effect=[0, 0, 0])
|
||||
mock_time.time = MagicMock(return_value=0)
|
||||
mock_time.sleep = MagicMock()
|
||||
|
||||
success_resp = MagicMock()
|
||||
|
||||
Reference in New Issue
Block a user