Merge remote-tracking branch 'origin/main' into codex/p0-obs-002-20260715

This commit is contained in:
ogt
2026-07-15 03:59:18 +08:00
4 changed files with 99 additions and 14 deletions

View File

@@ -1,8 +1,11 @@
import asyncio
from types import SimpleNamespace
from unittest.mock import AsyncMock
import pytest
from src.core.context import get_current_project_context
from src.jobs import incident_lifecycle_reconciler as reconciler
from src.jobs.incident_lifecycle_reconciler import (
LifecycleCandidate,
reconcile_stuck_incidents,
@@ -50,3 +53,30 @@ async def test_reconcile_stuck_incidents_resolves_strong_evidence(monkeypatch):
"resolution_type": "timeout",
"emit_postmortem": False,
}
@pytest.mark.asyncio
async def test_reconciler_loop_binds_and_clears_project_context(monkeypatch):
observed_contexts: list[dict[str, str | None]] = []
async def fake_reconcile() -> tuple[int, int]:
observed_contexts.append(get_current_project_context())
return 0, 0
async def cancel_after_first_pass(_seconds: int) -> None:
raise asyncio.CancelledError
monkeypatch.setattr(reconciler, "reconcile_stuck_incidents", fake_reconcile)
monkeypatch.setattr(reconciler.asyncio, "sleep", cancel_after_first_pass)
with pytest.raises(asyncio.CancelledError):
await reconciler.run_incident_lifecycle_reconciler_loop()
assert observed_contexts == [
{
"project_id": "awoooi",
"source": "incident_lifecycle_reconciler",
"request_id": None,
}
]
assert get_current_project_context()["project_id"] is None