72 lines
2.7 KiB
Python
72 lines
2.7 KiB
Python
"""Tests for runtime backup creation."""
|
|
|
|
import json
|
|
import sqlite3
|
|
from datetime import UTC, datetime
|
|
|
|
import atocore.config as config
|
|
from atocore.models.database import init_db
|
|
from atocore.ops.backup import create_runtime_backup
|
|
|
|
|
|
def test_create_runtime_backup_copies_db_and_registry(tmp_path, monkeypatch):
|
|
monkeypatch.setenv("ATOCORE_DATA_DIR", str(tmp_path / "data"))
|
|
monkeypatch.setenv("ATOCORE_BACKUP_DIR", str(tmp_path / "backups"))
|
|
monkeypatch.setenv(
|
|
"ATOCORE_PROJECT_REGISTRY_PATH", str(tmp_path / "config" / "project-registry.json")
|
|
)
|
|
|
|
registry_path = tmp_path / "config" / "project-registry.json"
|
|
registry_path.parent.mkdir(parents=True)
|
|
registry_path.write_text('{"projects":[{"id":"p01-example","aliases":[],"ingest_roots":[{"source":"vault","subpath":"incoming/projects/p01-example"}]}]}\n', encoding="utf-8")
|
|
|
|
original_settings = config.settings
|
|
try:
|
|
config.settings = config.Settings()
|
|
init_db()
|
|
with sqlite3.connect(str(config.settings.db_path)) as conn:
|
|
conn.execute("INSERT INTO projects (id, name) VALUES (?, ?)", ("p01", "P01 Example"))
|
|
conn.commit()
|
|
|
|
result = create_runtime_backup(datetime(2026, 4, 6, 18, 0, 0, tzinfo=UTC))
|
|
finally:
|
|
config.settings = original_settings
|
|
|
|
db_snapshot = tmp_path / "backups" / "snapshots" / "20260406T180000Z" / "db" / "atocore.db"
|
|
registry_snapshot = (
|
|
tmp_path / "backups" / "snapshots" / "20260406T180000Z" / "config" / "project-registry.json"
|
|
)
|
|
metadata_path = (
|
|
tmp_path / "backups" / "snapshots" / "20260406T180000Z" / "backup-metadata.json"
|
|
)
|
|
|
|
assert result["db_snapshot_path"] == str(db_snapshot)
|
|
assert db_snapshot.exists()
|
|
assert registry_snapshot.exists()
|
|
assert metadata_path.exists()
|
|
|
|
with sqlite3.connect(str(db_snapshot)) as conn:
|
|
row = conn.execute("SELECT name FROM projects WHERE id = ?", ("p01",)).fetchone()
|
|
assert row[0] == "P01 Example"
|
|
|
|
metadata = json.loads(metadata_path.read_text(encoding="utf-8"))
|
|
assert metadata["registry_snapshot_path"] == str(registry_snapshot)
|
|
|
|
|
|
def test_create_runtime_backup_handles_missing_registry(tmp_path, monkeypatch):
|
|
monkeypatch.setenv("ATOCORE_DATA_DIR", str(tmp_path / "data"))
|
|
monkeypatch.setenv("ATOCORE_BACKUP_DIR", str(tmp_path / "backups"))
|
|
monkeypatch.setenv(
|
|
"ATOCORE_PROJECT_REGISTRY_PATH", str(tmp_path / "config" / "project-registry.json")
|
|
)
|
|
|
|
original_settings = config.settings
|
|
try:
|
|
config.settings = config.Settings()
|
|
init_db()
|
|
result = create_runtime_backup(datetime(2026, 4, 6, 19, 0, 0, tzinfo=UTC))
|
|
finally:
|
|
config.settings = original_settings
|
|
|
|
assert result["registry_snapshot_path"] == ""
|