diff --git a/apps/api/src/services/awooop_ansible_check_mode_service.py b/apps/api/src/services/awooop_ansible_check_mode_service.py index 6abba3277..6742c9eca 100644 --- a/apps/api/src/services/awooop_ansible_check_mode_service.py +++ b/apps/api/src/services/awooop_ansible_check_mode_service.py @@ -5249,6 +5249,7 @@ async def run_pending_check_modes_once( project_id=project_id, **receipt_backfill_summary, ) + if receipt_backfill_summary["repair_receipt_backfill_error"]: return { "claimed": 0, "reclaimed": 0, diff --git a/apps/api/tests/test_ansible_verified_closure.py b/apps/api/tests/test_ansible_verified_closure.py index 9148dd317..f4b94727a 100644 --- a/apps/api/tests/test_ansible_verified_closure.py +++ b/apps/api/tests/test_ansible_verified_closure.py @@ -237,10 +237,21 @@ def test_backfill_preserves_approval_and_replaces_terminal_skipped_candidate() - @pytest.mark.asyncio -async def test_broker_reconciles_receipts_before_claiming_fresh_work( +async def test_broker_reconciles_receipts_then_continues_claiming_fresh_work( monkeypatch: pytest.MonkeyPatch, ) -> None: - retry_replayer = AsyncMock() + retry_replayer = AsyncMock( + return_value={ + "scanned": 0, + "replayed": 0, + "check_mode_passed": 0, + "check_mode_failed": 0, + "runtime_stage_receipt_written": 0, + "blockers": [], + "error": None, + } + ) + fresh_claimer = AsyncMock(return_value=[]) monkeypatch.setattr( service, "_expire_stale_ansible_execution_capabilities", @@ -279,13 +290,31 @@ async def test_broker_reconciles_receipts_before_claiming_fresh_work( "run_failed_apply_check_mode_replay_once", retry_replayer, ) + monkeypatch.setattr(service, "_runtime_blockers", lambda: []) + monkeypatch.setattr( + service, + "recent_ansible_transport_blockers", + AsyncMock(return_value=[]), + ) + monkeypatch.setattr( + service, + "claim_stale_pending_check_modes", + AsyncMock(return_value=[]), + ) + monkeypatch.setattr( + service, + "claim_catalog_drift_failed_check_modes", + AsyncMock(return_value=[]), + ) + monkeypatch.setattr(service, "claim_pending_check_modes", fresh_claimer) result = await service.run_pending_check_modes_once(limit=1) assert result["claimed"] == 0 assert result["repair_receipt_backfill_priority_tick"] is True assert result["repair_receipt_closure_written"] == 1 - retry_replayer.assert_not_awaited() + retry_replayer.assert_awaited_once() + fresh_claimer.assert_awaited_once() @pytest.mark.asyncio