Merge pull request #416 from tmchow/worktree-inherited-discovering-pebble
fix(ci): run full pytest suite, repair 13 rotted tests
This commit is contained in:
@@ -6,6 +6,7 @@ from __future__ import annotations
|
||||
import os
|
||||
import subprocess
|
||||
import sys
|
||||
import tempfile
|
||||
import unittest
|
||||
from pathlib import Path
|
||||
|
||||
@@ -27,13 +28,31 @@ class FooterNudgeSuppressionTests(unittest.TestCase):
|
||||
"--emit=md",
|
||||
*argv,
|
||||
]
|
||||
env = {**os.environ, "LAST30DAYS_SKIP_PREFLIGHT": "1"}
|
||||
env = {
|
||||
**os.environ,
|
||||
"LAST30DAYS_SKIP_PREFLIGHT": "1",
|
||||
# Skip ~/.config/last30days/.env so a contributor's saved
|
||||
# BRAVE/EXA/SERPER/PARALLEL key doesn't make grounding "available"
|
||||
# and suppress the promo we're checking for.
|
||||
"LAST30DAYS_CONFIG_DIR": "",
|
||||
# Pin X as available so _missing_sources_for_promo selects "web"
|
||||
# (otherwise the "x" promo wins and the BRAVE_API_KEY string never
|
||||
# appears).
|
||||
"XAI_API_KEY": "test-stub",
|
||||
}
|
||||
# Strip any grounded-web keys the host might have so the promo path
|
||||
# triggers deterministically in mock + no-backend.
|
||||
# triggers deterministically in mock + no-backend. Also strip X cookie
|
||||
# credentials so XAI_API_KEY is the unambiguous X backend.
|
||||
for key in ("BRAVE_API_KEY", "EXA_API_KEY", "SERPER_API_KEY",
|
||||
"PARALLEL_API_KEY", "OPENROUTER_API_KEY"):
|
||||
"PARALLEL_API_KEY", "OPENROUTER_API_KEY",
|
||||
"AUTH_TOKEN", "CT0", "LAST30DAYS_X_BACKEND"):
|
||||
env.pop(key, None)
|
||||
return subprocess.run(cmd, capture_output=True, text=True, env=env)
|
||||
# Run from a tmpdir so _find_project_env() can't walk up into any
|
||||
# .claude/last30days.env above the repo on the contributor's machine.
|
||||
with tempfile.TemporaryDirectory() as tmp:
|
||||
return subprocess.run(
|
||||
cmd, capture_output=True, text=True, env=env, cwd=tmp,
|
||||
)
|
||||
|
||||
def test_bare_run_emits_web_promo(self):
|
||||
result = self._run(topic="OpenAI")
|
||||
|
||||
@@ -213,8 +213,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)
|
||||
@@ -224,7 +226,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()
|
||||
@@ -243,7 +247,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()
|
||||
|
||||
+8
-8
@@ -3,7 +3,7 @@
|
||||
import json
|
||||
import sqlite3
|
||||
import tempfile
|
||||
from datetime import datetime, timedelta
|
||||
from datetime import datetime, timedelta, timezone
|
||||
from pathlib import Path
|
||||
|
||||
import pytest
|
||||
@@ -503,16 +503,16 @@ def test_get_new_findings_filters_by_date(temp_db, sample_report):
|
||||
findings = store.findings_from_report(sample_report)
|
||||
store.store_findings(run_id, topic["id"], findings)
|
||||
|
||||
# Get findings since tomorrow (should be empty)
|
||||
tomorrow = (datetime.now() + timedelta(days=1)).strftime("%Y-%m-%d")
|
||||
# Use UTC because store writes first_seen via SQLite's datetime('now') (UTC).
|
||||
# Local-time math here would flake near midnight UTC.
|
||||
tomorrow = (datetime.now(timezone.utc) + timedelta(days=1)).strftime("%Y-%m-%d")
|
||||
new_findings = store.get_new_findings(topic["id"], since=tomorrow)
|
||||
|
||||
|
||||
assert len(new_findings) == 0
|
||||
|
||||
# Get findings since yesterday (should have all)
|
||||
yesterday = (datetime.now() - timedelta(days=1)).strftime("%Y-%m-%d")
|
||||
|
||||
yesterday = (datetime.now(timezone.utc) - timedelta(days=1)).strftime("%Y-%m-%d")
|
||||
new_findings = store.get_new_findings(topic["id"], since=yesterday)
|
||||
|
||||
|
||||
assert len(new_findings) == 4
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user