from pathlib import Path def test_restore_postgres_plan_is_non_destructive(): script = Path("scripts/restore_postgres_plan.sh").read_text(encoding="utf-8") executable_prefix = script.split("cat <.tar.gz" in runbook assert "prebuilt Web dist" in runbook def test_deployment_docs_forbid_production_runtime_builds(): docs = Path("docs/DEPLOYMENT.md").read_text(encoding="utf-8") assert "runtime-images-.tar" in docs assert "API/Worker" in docs assert "不是构建机" in docs assert "infra/docker/deploy-production.sh" in docs def test_runtime_image_release_scripts_keep_builds_off_production(): build_script = Path("scripts/build_release_images.sh").read_text(encoding="utf-8") deploy_script = Path("scripts/deploy_release_images_production.sh").read_text(encoding="utf-8") assert "docker build --pull=false -f infra/docker/api.Dockerfile" in build_script assert "docker build --pull=false -f infra/docker/worker.Dockerfile" in build_script assert "docker save" in build_script assert "Refusing to build runtime images on a host that is running production services." in build_script assert "ALLOW_SHARED_PRODUCTION_BUILD_HOST=true" in build_script assert "docker load -i" in deploy_script assert 'API_IMAGE="xiaoxia-saas-api:$VERSION"' in deploy_script assert 'WORKER_IMAGE="xiaoxia-saas-worker:$VERSION"' in deploy_script assert "ALLOW_PRODUCTION_BUILDS=false" in deploy_script assert 'docker compose --env-file "$ENV_FILE" build --pull=false web' in deploy_script assert 'docker compose --env-file "$ENV_FILE" build --pull=false api' not in deploy_script assert 'docker compose --env-file "$ENV_FILE" build --pull=false worker' not in deploy_script def test_production_release_checklist_matches_automatic_release_contract(): checklist = Path("docs/PRODUCTION-RELEASE-CHECKLIST.md").read_text(encoding="utf-8") assert "runtime-builder" in checklist assert "release-.tar.gz" in checklist assert "apps/web/dist/index.html" in checklist assert "HOST_PREFIX=" in checklist assert "curl -fsS http://127.0.0.1:8001/health" in checklist assert "xiaoxia-postgres-production" in checklist assert "v0.1.6" in checklist assert "v0.1.9" in checklist assert "生产机补 build" in checklist def test_release_automation_retrospective_records_failed_probe_tags(): retrospective = Path("docs/RELEASE-AUTOMATION-RETROSPECTIVE-2026-06-22.md").read_text(encoding="utf-8") assert "v0.1.9" in retrospective assert "first verified end-to-end automatic production release" in retrospective assert "v0.1.6" in retrospective assert "v0.1.7" in retrospective assert "v0.1.8" in retrospective assert "Do not use `v0.1.6`, `v0.1.7`, or `v0.1.8` as rollback targets" in retrospective assert "HOST_PREFIX=" in retrospective assert "--exclude=./dist" in retrospective assert "public_upload_flow=ok" in retrospective def test_backup_postgres_writes_manifest_and_version(): script = Path("scripts/backup_postgres.sh").read_text(encoding="utf-8") assert "pg_dump" in script assert "alembic_version.txt" in script assert "manifest.txt" in script assert "test -s" not in script assert 'if [ ! -s "$DUMP_PATH" ]' in script