- deploy_app: checkout the pinned tag + deploy NON-chaos when a version is pinned (chaos only for version=None / PR-head). Was always -C, which ignored the pin and deployed LATEST -> upgrade no-op. - do_upgrade: assert the deployment actually MOVED (coop-cloud version label and/or image changed) via lifecycle.deployed_identity -> a vacuous no-op upgrade can no longer pass (DG2). - G2: migrate custom-html overlays to the assertion-only contract (override + extend-by-composition + data-continuity; split backup/restore). tests/unit/test_discovery.py proves precedence (5/5). Probe (Adversary's F1d-2 test): hedgedoc deploy-prev=1.10.7 -> upgrade=1.10.8, CHANGED=True. hedgedoc full generic lifecycle green (install/upgrade/backup/restore, deploy-count=1). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
22 lines
1021 B
Python
22 lines
1021 B
Python
"""custom-html — RESTORE overlay (Phase 1d, DG4): data-integrity, extends the generic restore.
|
|
|
|
Runs after the backup overlay (test_backup.py) on the SAME shared deployment, which left state
|
|
mutated to "mutated" after backing up "original". This restores the snapshot via the shared op
|
|
helper (`generic.do_restore`, which also asserts the app is healthy + serving afterwards), then
|
|
asserts the served data returned to the pre-mutation "original" — the app-specific data integrity the
|
|
generic restore cannot check. Assertion-only (no deploy/teardown)."""
|
|
|
|
import os
|
|
import sys
|
|
|
|
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "..", "runner"))
|
|
from harness import generic, lifecycle # noqa: E402
|
|
|
|
|
|
def test_restore_returns_state(live_app, meta):
|
|
domain = live_app
|
|
generic.do_restore(domain, meta) # restore + assert healthy/serving
|
|
assert (
|
|
lifecycle.http_fetch(domain, "/ci-marker.txt")[1].strip() == "original"
|
|
), "restore did not return the pre-mutation (backed-up) state"
|