claim(2w): WC5 promote-on-green-cold proven — green cold run advances canonical (1.10.0→1.11.0); --quick never promotes; only cold advances
should_promote_canonical (enrolled+green+cold+latest) + promote_canonical (re-seed canonical at green-verified latest, snapshot+registry, old known-good replaced only on green). +5 unit (70 pass). Live: custom-html canonical advanced 1.10.0+1.28.0 → 1.11.0+1.29.0 via a full green cold run; snapshot refreshed; idle; per-run app torn down. WC6 nightly sweep next. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
49
tests/unit/test_promote.py
Normal file
49
tests/unit/test_promote.py
Normal file
@ -0,0 +1,49 @@
|
||||
"""Unit tests for the WC5 promote-on-green-cold gate (run_recipe_ci.should_promote_canonical).
|
||||
|
||||
Pure predicate. The live promote (deploy canonical at latest → snapshot → registry) is proven on
|
||||
custom-html (W3). is_enrolled is monkeypatched so the test doesn't depend on which recipes are
|
||||
enrolled on disk.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", ".."))
|
||||
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "..", "runner"))
|
||||
import run_recipe_ci as rr # noqa: E402
|
||||
from harness import canonical # noqa: E402
|
||||
|
||||
|
||||
def _enrolled(monkeypatch, val):
|
||||
monkeypatch.setattr(canonical, "is_enrolled", lambda r: val)
|
||||
|
||||
|
||||
def test_promote_when_enrolled_green_cold_latest(monkeypatch):
|
||||
_enrolled(monkeypatch, True)
|
||||
# green (overall 0), cold (quick False), latest (ref None) → promote
|
||||
assert rr.should_promote_canonical("custom-html", None, 0, quick=False) is True
|
||||
assert rr.should_promote_canonical("custom-html", "", 0, quick=False) is True
|
||||
|
||||
|
||||
def test_no_promote_when_not_enrolled(monkeypatch):
|
||||
_enrolled(monkeypatch, False)
|
||||
assert rr.should_promote_canonical("hedgedoc", None, 0, quick=False) is False
|
||||
|
||||
|
||||
def test_no_promote_when_red(monkeypatch):
|
||||
_enrolled(monkeypatch, True)
|
||||
assert rr.should_promote_canonical("custom-html", None, 1, quick=False) is False
|
||||
|
||||
|
||||
def test_no_promote_when_quick(monkeypatch):
|
||||
# --quick never promotes (the canonical advances ONLY via cold)
|
||||
_enrolled(monkeypatch, True)
|
||||
assert rr.should_promote_canonical("custom-html", None, 0, quick=True) is False
|
||||
|
||||
|
||||
def test_no_promote_on_pr_head(monkeypatch):
|
||||
# a PR `!testme` carries REF=PR-head → must NOT advance the canonical to a PR's code
|
||||
_enrolled(monkeypatch, True)
|
||||
assert rr.should_promote_canonical("custom-html", "abc123def", 0, quick=False) is False
|
||||
Reference in New Issue
Block a user