106 lines
3.6 KiB
Python
106 lines
3.6 KiB
Python
from __future__ import annotations
|
|
|
|
import json
|
|
import subprocess
|
|
from pathlib import Path
|
|
|
|
REPO_ROOT = Path(__file__).resolve().parents[1]
|
|
|
|
|
|
def test_redact_restore_canary_capsule_removes_private_paths(tmp_path: Path) -> None:
|
|
proof = tmp_path / "sqlite-postgres-restore-canary.json"
|
|
output = tmp_path / "restore-capsule.json"
|
|
proof.write_text(
|
|
json.dumps(
|
|
{
|
|
"artifact": "sqlite_postgres_restore_canary",
|
|
"generated_at_utc": "2026-07-07T12:00:00+00:00",
|
|
"status": "pass",
|
|
"source_sqlite_backup": "/private/path/teleo.db.gz",
|
|
"source_sqlite_backup_sha256": "abc123",
|
|
"source_integrity_check": "ok",
|
|
"postgres_image": "postgres:16-alpine",
|
|
"postgres_schema": "teleo_restore",
|
|
"source_table_count": 2,
|
|
"target_table_count": 2,
|
|
"source_total_rows": 4,
|
|
"target_total_rows": 4,
|
|
"mismatched_tables": [],
|
|
"conversion_notes": {"mode": "shadow_restore"},
|
|
"conversion_stats": {"blob_values_hex_encoded": 0},
|
|
"private_artifacts": {
|
|
"source_summary_json": "/private/path/source-summary.json",
|
|
"postgres_import_sql": "/private/path/import.sql",
|
|
"target_counts_csv": "/private/path/counts.csv",
|
|
},
|
|
}
|
|
)
|
|
)
|
|
|
|
completed = subprocess.run(
|
|
[
|
|
"python3",
|
|
"ops/redact_sqlite_postgres_restore_canary.py",
|
|
"--proof",
|
|
str(proof),
|
|
"--output",
|
|
str(output),
|
|
],
|
|
cwd=REPO_ROOT,
|
|
text=True,
|
|
capture_output=True,
|
|
check=False,
|
|
)
|
|
|
|
assert completed.returncode == 0, completed.stderr
|
|
capsule = json.loads(output.read_text())
|
|
rendered = output.read_text()
|
|
assert capsule["artifact"] == "sqlite_postgres_restore_canary_capsule"
|
|
assert capsule["status"] == "pass"
|
|
assert capsule["source_table_count"] == 2
|
|
assert capsule["target_total_rows"] == 4
|
|
assert capsule["mismatched_table_count"] == 0
|
|
assert capsule["source_sqlite_backup_sha256"] == "abc123"
|
|
assert "source_sqlite_backup" not in capsule
|
|
assert "private_artifacts" not in capsule
|
|
assert "/private/path" not in rendered
|
|
|
|
|
|
def test_redact_restore_canary_capsule_fails_for_mismatched_rows(tmp_path: Path) -> None:
|
|
proof = tmp_path / "sqlite-postgres-restore-canary.json"
|
|
output = tmp_path / "restore-capsule.json"
|
|
proof.write_text(
|
|
json.dumps(
|
|
{
|
|
"artifact": "sqlite_postgres_restore_canary",
|
|
"generated_at_utc": "2026-07-07T12:00:00+00:00",
|
|
"status": "pass",
|
|
"source_integrity_check": "ok",
|
|
"source_table_count": 1,
|
|
"target_table_count": 1,
|
|
"source_total_rows": 4,
|
|
"target_total_rows": 3,
|
|
"mismatched_tables": [{"table": "claims", "source_rows": 4, "target_rows": 3}],
|
|
}
|
|
)
|
|
)
|
|
|
|
completed = subprocess.run(
|
|
[
|
|
"python3",
|
|
"ops/redact_sqlite_postgres_restore_canary.py",
|
|
"--proof",
|
|
str(proof),
|
|
"--output",
|
|
str(output),
|
|
],
|
|
cwd=REPO_ROOT,
|
|
text=True,
|
|
capture_output=True,
|
|
check=False,
|
|
)
|
|
|
|
assert completed.returncode == 1
|
|
capsule = json.loads(output.read_text())
|
|
assert capsule["status"] == "fail"
|
|
assert "total_rows source=4 target=3" in capsule["problems"]
|