Guard sold reconciliation by scope
This commit is contained in:
@@ -39,6 +39,9 @@ class TestWorkerRuntimeTaskHelpers(unittest.TestCase):
|
||||
def scard(self, key: str):
|
||||
return len(self.sets.get(key, set()))
|
||||
|
||||
def smembers(self, key: str):
|
||||
return self.sets.get(key, set())
|
||||
|
||||
def llen(self, key: str):
|
||||
return len(self.lists.get(key, []))
|
||||
|
||||
@@ -277,33 +280,44 @@ class TestWorkerRuntimeTaskHelpers(unittest.TestCase):
|
||||
self.assertFalse(recovered)
|
||||
self.assertIn(tasks.MOBILEDE_BOOTSTRAP_DISPATCHED_SEGMENTS_KEY, redis_client.sets)
|
||||
|
||||
def test_bootstrap_completion_forces_refresh_sold_finalize_when_progress_lags(self) -> None:
|
||||
def test_bootstrap_completion_does_not_finalize_incomplete_refresh_cycle(self) -> None:
|
||||
redis_client = self._FakeRedis()
|
||||
started_at = datetime(2026, 5, 6, 10, 0, tzinfo=timezone.utc)
|
||||
redis_client.store[tasks.MOBILEDE_REFRESH_CYCLE_ID_KEY] = "cycle-lag"
|
||||
redis_client.store[tasks.MOBILEDE_REFRESH_CYCLE_STARTED_AT_KEY] = started_at.isoformat()
|
||||
redis_client.store[tasks.MOBILEDE_REFRESH_CYCLE_TOTAL_KEY] = "377"
|
||||
redis_client.store[tasks.MOBILEDE_REFRESH_CYCLE_DONE_KEY] = "141"
|
||||
persistence = MagicMock()
|
||||
persistence.mark_sold_not_seen_since.return_value = 42
|
||||
finalized = tasks._mobilede_try_finalize_refresh_cycle_after_bootstrap_completion(
|
||||
redis_client,
|
||||
cycle_id="cycle-lag",
|
||||
total_segments_hint=377,
|
||||
)
|
||||
|
||||
with (
|
||||
patch.object(tasks, "_get_persistence", return_value=persistence),
|
||||
patch.object(tasks, "MOBILEDE_POST_REFRESH_SOLD_PROBE_ENABLED", False),
|
||||
):
|
||||
finalized = tasks._mobilede_try_finalize_refresh_cycle_after_bootstrap_completion(
|
||||
self.assertFalse(finalized)
|
||||
self.assertEqual(redis_client.store[tasks.MOBILEDE_REFRESH_CYCLE_DONE_KEY], "141")
|
||||
|
||||
def test_refresh_cycle_unsafe_reason_skips_sold_marking(self) -> None:
|
||||
redis_client = self._FakeRedis()
|
||||
started_at = datetime(2026, 5, 6, 10, 0, tzinfo=timezone.utc)
|
||||
redis_client.store[tasks.MOBILEDE_REFRESH_CYCLE_ID_KEY] = "cycle-unsafe"
|
||||
redis_client.store[tasks.MOBILEDE_REFRESH_CYCLE_STARTED_AT_KEY] = started_at.isoformat()
|
||||
redis_client.store[tasks.MOBILEDE_REFRESH_CYCLE_TOTAL_KEY] = "1"
|
||||
redis_client.store[tasks.MOBILEDE_REFRESH_CYCLE_DONE_KEY] = "1"
|
||||
persistence = MagicMock()
|
||||
|
||||
tasks._mobilede_mark_refresh_cycle_reconciliation_unsafe(
|
||||
redis_client,
|
||||
cycle_id="cycle-unsafe",
|
||||
reason="only_new",
|
||||
)
|
||||
with patch.object(tasks, "_get_persistence", return_value=persistence):
|
||||
sold_marked = tasks._mobilede_finalize_refresh_cycle_sold_marking(
|
||||
redis_client,
|
||||
cycle_id="cycle-lag",
|
||||
total_segments_hint=377,
|
||||
cycle_id="cycle-unsafe",
|
||||
)
|
||||
|
||||
self.assertTrue(finalized)
|
||||
self.assertEqual(redis_client.store[tasks.MOBILEDE_REFRESH_CYCLE_DONE_KEY], "377")
|
||||
persistence.mark_sold_not_seen_since.assert_called_once_with(
|
||||
started_at,
|
||||
prefix=("mobile.de:", "mobilede:"),
|
||||
safety_ratio=0.8,
|
||||
)
|
||||
self.assertEqual(sold_marked, 0)
|
||||
persistence.mark_sold_not_seen_since.assert_not_called()
|
||||
|
||||
def test_completed_bootstrap_segment_is_skipped_during_active_full_pass(self) -> None:
|
||||
redis_client = MagicMock()
|
||||
|
||||
Reference in New Issue
Block a user