新增后台数据库备份与回滚
This commit is contained in:
53
backend/tests/test_db_backup.py
Normal file
53
backend/tests/test_db_backup.py
Normal file
@@ -0,0 +1,53 @@
|
||||
import json
|
||||
from datetime import datetime, timezone
|
||||
|
||||
import pytest
|
||||
|
||||
from app.services import db_backup
|
||||
|
||||
|
||||
def test_list_database_backups_reads_metadata(tmp_path, monkeypatch):
|
||||
backup = tmp_path / "certificate_system_20260623_120000.sqlite3"
|
||||
backup.write_bytes(b"sqlite-data")
|
||||
metadata = {
|
||||
"filename": backup.name,
|
||||
"database_type": "sqlite",
|
||||
"created_at": datetime(2026, 6, 23, 12, 0, tzinfo=timezone.utc).isoformat(),
|
||||
"reason": "manual",
|
||||
}
|
||||
backup.with_name(f"{backup.name}.json").write_text(json.dumps(metadata), encoding="utf-8")
|
||||
monkeypatch.setattr(db_backup, "_backup_dir", lambda: tmp_path)
|
||||
|
||||
items = db_backup.list_database_backups()
|
||||
|
||||
assert items[0]["filename"] == backup.name
|
||||
assert items[0]["database_type"] == "sqlite"
|
||||
assert items[0]["reason"] == "manual"
|
||||
assert items[0]["size_label"] == "11 B"
|
||||
|
||||
|
||||
def test_resolve_backup_path_rejects_path_traversal(tmp_path, monkeypatch):
|
||||
monkeypatch.setattr(db_backup, "_backup_dir", lambda: tmp_path)
|
||||
|
||||
with pytest.raises(db_backup.BackupError):
|
||||
db_backup._resolve_backup_path("../certificate_system_20260623_120000.sqlite3")
|
||||
|
||||
|
||||
def test_backup_target_does_not_overwrite_existing_file(tmp_path, monkeypatch):
|
||||
created_at = datetime(2026, 6, 23, 12, 0, tzinfo=timezone.utc)
|
||||
existing = tmp_path / "certificate_system_20260623_120000.sqlite3"
|
||||
existing.write_bytes(b"old")
|
||||
monkeypatch.setattr(db_backup, "_backup_dir", lambda: tmp_path)
|
||||
|
||||
target = db_backup._backup_target("sqlite", "manual", created_at)
|
||||
|
||||
assert target.name == "certificate_system_20260623_120000_2.sqlite3"
|
||||
|
||||
|
||||
def test_restore_requires_exact_confirmation(tmp_path, monkeypatch):
|
||||
backup = tmp_path / "certificate_system_20260623_120000.sqlite3"
|
||||
backup.write_bytes(b"sqlite-data")
|
||||
monkeypatch.setattr(db_backup, "_backup_dir", lambda: tmp_path)
|
||||
|
||||
with pytest.raises(db_backup.BackupError, match="确认文本不正确"):
|
||||
db_backup.restore_database_backup(backup.name, "RESTORE wrong-file")
|
||||
Reference in New Issue
Block a user