Complete training workflow and acceptance hardening
This commit is contained in:
parent
4c4b91064f
commit
7237265833
243 changed files with 17014 additions and 1500 deletions
|
|
@ -1,4 +1,5 @@
|
|||
from datetime import datetime, timedelta, timezone
|
||||
from types import SimpleNamespace
|
||||
|
||||
from scripts import backup_loop
|
||||
|
||||
|
|
@ -18,3 +19,42 @@ def test_overdue_backup_is_due_immediately(monkeypatch):
|
|||
now = datetime.now(timezone.utc)
|
||||
monkeypatch.setattr(backup_loop, "listing", lambda: [{"at": now - timedelta(days=2)}])
|
||||
assert backup_loop.seconds_until_due(now, 86_400) == 0
|
||||
|
||||
|
||||
def test_scheduler_waits_only_remainder_after_slow_backup(monkeypatch):
|
||||
settings = SimpleNamespace(
|
||||
backup_interval_seconds=86_400,
|
||||
backup_retry_seconds=300,
|
||||
backup_keep=14,
|
||||
)
|
||||
copies = []
|
||||
waits = []
|
||||
|
||||
def listing():
|
||||
return copies
|
||||
|
||||
def create():
|
||||
# Model pg_dump taking 20 minutes before finishing the scheduler cycle.
|
||||
copies.append({
|
||||
"name": "recent.sql",
|
||||
"at": datetime.now(timezone.utc) - timedelta(minutes=20),
|
||||
})
|
||||
return {"name": "recent.sql", "size_bytes": 123}
|
||||
|
||||
def sleep(seconds):
|
||||
waits.append(seconds)
|
||||
raise RuntimeError("stop after observing next scheduled wait")
|
||||
|
||||
monkeypatch.setattr(backup_loop, "get_settings", lambda: settings)
|
||||
monkeypatch.setattr(backup_loop, "listing", listing)
|
||||
monkeypatch.setattr(backup_loop, "create", create)
|
||||
monkeypatch.setattr(backup_loop, "prune", lambda keep: 0)
|
||||
monkeypatch.setattr(backup_loop.time, "sleep", sleep)
|
||||
|
||||
try:
|
||||
backup_loop.run_forever()
|
||||
except RuntimeError as exc:
|
||||
assert str(exc) == "stop after observing next scheduled wait"
|
||||
|
||||
assert len(waits) == 1
|
||||
assert 85_190 <= waits[0] <= 85_200
|
||||
|
|
|
|||
Loading…
Reference in a new issue