test: cover run_all fetch-failure escalation
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
import logging
|
import logging
|
||||||
|
from types import SimpleNamespace
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
@@ -21,6 +22,7 @@ def test_create_operation_handler_calls_confirmation_and_run(monkeypatch):
|
|||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
calls["run"] += 1
|
calls["run"] += 1
|
||||||
|
return SimpleNamespace(processed=1, failed=0, skipped=0)
|
||||||
|
|
||||||
monkeypatch.setattr(commands, "require_confirmation", fake_confirm)
|
monkeypatch.setattr(commands, "require_confirmation", fake_confirm)
|
||||||
monkeypatch.setattr(commands, "Operation", FakeOperation)
|
monkeypatch.setattr(commands, "Operation", FakeOperation)
|
||||||
@@ -77,6 +79,7 @@ def test_run_all_runs_in_order(monkeypatch):
|
|||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
ran.append(self.operation_name)
|
ran.append(self.operation_name)
|
||||||
|
return SimpleNamespace(processed=1, failed=0, skipped=0)
|
||||||
|
|
||||||
class FakeOperationContext:
|
class FakeOperationContext:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
@@ -115,6 +118,7 @@ def test_run_all_continues_on_error(monkeypatch):
|
|||||||
ran.append(self.operation_name)
|
ran.append(self.operation_name)
|
||||||
if self.operation_name == "Deleting posts":
|
if self.operation_name == "Deleting posts":
|
||||||
raise RuntimeError("fail")
|
raise RuntimeError("fail")
|
||||||
|
return SimpleNamespace(processed=1, failed=0, skipped=0)
|
||||||
|
|
||||||
class FakeOperationContext:
|
class FakeOperationContext:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
@@ -130,3 +134,48 @@ def test_run_all_continues_on_error(monkeypatch):
|
|||||||
|
|
||||||
assert "Deleting posts" in ran
|
assert "Deleting posts" in ran
|
||||||
assert len(ran) >= 2
|
assert len(ran) >= 2
|
||||||
|
|
||||||
|
|
||||||
|
def test_run_all_raises_on_fetch_failure(monkeypatch):
|
||||||
|
class FakeOperation:
|
||||||
|
def __init__(self, operation_name, **kwargs):
|
||||||
|
self.operation_name = operation_name
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
if self.operation_name == "Deleting posts":
|
||||||
|
raise operations.OperationFetchError(
|
||||||
|
"Deleting posts",
|
||||||
|
1,
|
||||||
|
RuntimeError("api unavailable"),
|
||||||
|
operations.OperationResult(),
|
||||||
|
)
|
||||||
|
return SimpleNamespace(processed=1, failed=0, skipped=0)
|
||||||
|
|
||||||
|
class FakeOperationContext:
|
||||||
|
def __init__(self):
|
||||||
|
self.client = object()
|
||||||
|
self.config_data = {"batch_size": 1, "delay": 0}
|
||||||
|
|
||||||
|
monkeypatch.setattr(commands, "require_confirmation",
|
||||||
|
lambda *args, **kwargs: None)
|
||||||
|
monkeypatch.setattr(commands, "Operation", FakeOperation)
|
||||||
|
monkeypatch.setattr(operations, "OperationContext", FakeOperationContext)
|
||||||
|
monkeypatch.setattr(
|
||||||
|
commands,
|
||||||
|
"COMMAND_METADATA",
|
||||||
|
{
|
||||||
|
"posts": {
|
||||||
|
"operation_name": "Deleting posts",
|
||||||
|
"strategy_type": "feed",
|
||||||
|
"collection": None,
|
||||||
|
"filter_fn": None,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
)
|
||||||
|
monkeypatch.setattr(
|
||||||
|
commands.registry, "get_all_commands", lambda: {"posts": "only posts"}
|
||||||
|
)
|
||||||
|
monkeypatch.setattr(commands, "COMMAND_EXECUTION_ORDER", ["posts"])
|
||||||
|
|
||||||
|
with pytest.raises(RuntimeError, match="failed while fetching items"):
|
||||||
|
commands.run_all(skip_confirmation=True)
|
||||||
|
|||||||
Reference in New Issue
Block a user