state-hub/tests/test_repository_rename_docs.py
tegwick f7402bd711
All checks were successful
CI Smoke / host-smoke (push) Successful in 0s
CI Smoke / container-smoke (push) Successful in 1s
docs: complete repository rename operator handoff
Assistant: codex
Assistant-Model: gpt-5.6-sol
Assistant-Session: 01a049a4-ee9f-78e1-9d66-2cb0f9bea3e3
2026-08-29 15:46:43 +02:00

88 lines
3.2 KiB
Python

from __future__ import annotations
import json
from pathlib import Path
from jsonschema import Draft202012Validator, FormatChecker
ROOT = Path(__file__).resolve().parents[1]
RUNBOOK = ROOT / "docs" / "repository-rename-operations.md"
HANDOFF_SCHEMA = (
ROOT / "docs" / "schemas" / "repository-rename-handoff-v1.schema.json"
)
HANDOFF_EXAMPLE = (
ROOT / "docs" / "examples" / "repository-rename-handoff-v1.json"
)
DASHBOARD_DOC = ROOT / "dashboard" / "src" / "docs" / "repository-renames.md"
def test_repository_rename_handoff_example_validates_and_contains_no_secret_value():
schema = json.loads(HANDOFF_SCHEMA.read_text(encoding="utf-8"))
example = json.loads(HANDOFF_EXAMPLE.read_text(encoding="utf-8"))
Draft202012Validator.check_schema(schema)
Draft202012Validator(schema, format_checker=FormatChecker()).validate(example)
assert example["handoff_id"] == example["owning_work_record"]["task_id"]
assert example["source_repository"] == example["owning_work_record"]["repository"]
assert example["affected"]["paths"] or example["affected"]["graph_ids"]
assert example["verification"]
assert example["sensitive_data_prohibited"] is True
serialized = json.dumps(example).lower()
for forbidden in (
"bearer ",
"basic ",
"password=",
"token=",
"authorization=",
"begin private key",
"://user:",
):
assert forbidden not in serialized
def test_operator_runbook_names_phases_commands_owners_and_last_cleanup():
text = RUNBOOK.read_text(encoding="utf-8")
for owner in ("State Hub", "Forgejo", "HelixForge/operator", "Target repository"):
assert f"| {owner} |" in text
for phase in (
"preflighted",
"forge-renamed",
"statehub-rebound",
"source-synced",
"consumers-verified",
"completed",
"rollback-preflight",
"rolled-back",
):
assert f"`{phase}`" in text
for command in (
"statehub repo rename preflight",
"statehub repo rename start",
"statehub repo rename apply",
"statehub repo rename status",
"statehub repo rename verify",
"statehub repo rename rollback",
):
assert command in text
assert "### Repository-only rename checklist" in text
assert "### Product/runtime rename checklist" in text
assert "## Dashboard interpretation" in text
assert "## Recovery playbook" in text
assert "## Rollback limits" in text
assert "## Repository-boundary handoff format" in text
assert "## Cleanup is deliberately last" in text
assert "The old local checkout is the final removable asset" in text
assert "The protected old slug alias is not cleanup material" in text
assert "never parked only" in text
assert "<private-mode-0600-preflight.json>" in text
def test_dashboard_reference_explains_alias_and_status_boundaries():
text = DASHBOARD_DOC.read_text(encoding="utf-8")
assert "/repos/<old-slug>" in text
assert "same repository UUID" in text
assert "statehub repo rename status <operation-id> --json" in text
assert "relationship checksums" in text
assert "dashboard is a read surface" in text.lower()
assert "old checkout is removed last" in text