Files
digital-drosophila/tools/test_repository_audit.py

37 lines
1.7 KiB
Python

"""Tests use fresh temporary directories, never scientific project data."""
import gzip
import json
from pathlib import Path
import subprocess
import sys
import tempfile
import unittest
TOOL = Path(__file__).with_name("repository_audit.py")
class AuditTests(unittest.TestCase):
def test_snapshot_detects_change_and_addition(self):
with tempfile.TemporaryDirectory(prefix="drosophila-audit-test-") as tmp:
root = Path(tmp)
(root / "datasets").mkdir()
(root / "datasets/a.bin").write_bytes(b"raw\0data")
(root / "datasets/.venv").mkdir()
(root / "datasets/.venv/excluded").write_bytes(b"environment")
snap = root / "snapshot"
cmd = [sys.executable, "-B", str(TOOL), "--root", str(root)]
subprocess.run(cmd+["snapshot", "--output", str(snap)], check=True, capture_output=True)
with gzip.open(snap / "files.jsonl.gz", "rt") as f:
self.assertEqual(len([json.loads(x) for x in f]), 1)
self.assertEqual(subprocess.run(cmd+["verify", "--snapshot", str(snap)], capture_output=True).returncode, 0)
self.assertNotEqual(subprocess.run(cmd+["snapshot", "--output", str(snap)], capture_output=True).returncode, 0)
(root / "datasets/a.bin").write_bytes(b"changed!")
(root / "datasets/new.bin").write_bytes(b"new")
check = subprocess.run(cmd+["verify", "--snapshot", str(snap)], capture_output=True)
result = json.loads(check.stdout)
self.assertEqual(check.returncode, 1)
self.assertEqual(result["added"], ["datasets/new.bin"])
self.assertEqual(result["mismatches"][0]["path"], "datasets/a.bin")
if __name__ == "__main__":
unittest.main()