05/23 Phase 18,19
This commit is contained in:
@@ -0,0 +1,104 @@
|
||||
"""
|
||||
tests/test_backup.py
|
||||
---------------------
|
||||
Tests for db.database backup_db() and restore_db().
|
||||
"""
|
||||
|
||||
import os
|
||||
import pytest
|
||||
from db.database import backup_db, restore_db, DB_PATH, get_connection
|
||||
from db.models import insert_draw, get_draws_with_game, get_game_by_name
|
||||
|
||||
|
||||
# ── backup_db ─────────────────────────────────────────────────────────────────
|
||||
|
||||
def test_backup_creates_file(tmp_db, tmp_path):
|
||||
dest = backup_db(dest_dir=str(tmp_path))
|
||||
assert os.path.isfile(dest)
|
||||
|
||||
|
||||
def test_backup_filename_contains_timestamp(tmp_db, tmp_path):
|
||||
dest = backup_db(dest_dir=str(tmp_path))
|
||||
basename = os.path.basename(dest)
|
||||
assert basename.startswith("lottosight_backup_")
|
||||
assert basename.endswith(".db")
|
||||
|
||||
|
||||
def test_backup_returns_path_string(tmp_db, tmp_path):
|
||||
result = backup_db(dest_dir=str(tmp_path))
|
||||
assert isinstance(result, str)
|
||||
assert len(result) > 0
|
||||
|
||||
|
||||
def test_backup_file_is_valid_sqlite(tmp_db, tmp_path):
|
||||
dest = backup_db(dest_dir=str(tmp_path))
|
||||
import sqlite3
|
||||
conn = sqlite3.connect(dest)
|
||||
cursor = conn.cursor()
|
||||
cursor.execute("SELECT name FROM sqlite_master WHERE type='table'")
|
||||
tables = {r[0] for r in cursor.fetchall()}
|
||||
conn.close()
|
||||
assert "games" in tables
|
||||
assert "draws" in tables
|
||||
|
||||
|
||||
def test_backup_preserves_draw_data(tmp_db, tmp_path):
|
||||
game = get_game_by_name("Powerball")
|
||||
insert_draw(game["id"], "2024-06-01", [5, 14, 22, 36, 69], bonus=7)
|
||||
dest = backup_db(dest_dir=str(tmp_path))
|
||||
import sqlite3
|
||||
conn = sqlite3.connect(dest)
|
||||
conn.row_factory = sqlite3.Row
|
||||
cursor = conn.cursor()
|
||||
cursor.execute("SELECT numbers FROM draws WHERE draw_date='2024-06-01'")
|
||||
row = cursor.fetchone()
|
||||
conn.close()
|
||||
assert row is not None
|
||||
assert "5" in row["numbers"]
|
||||
|
||||
|
||||
def test_backup_creates_dest_dir_if_missing(tmp_db, tmp_path):
|
||||
nested = str(tmp_path / "a" / "b" / "c")
|
||||
dest = backup_db(dest_dir=nested)
|
||||
assert os.path.isfile(dest)
|
||||
|
||||
|
||||
def test_backup_default_dest_dir(tmp_db, monkeypatch, tmp_path):
|
||||
from core.paths import user_data_dir as _udd
|
||||
monkeypatch.setattr("db.database.user_data_dir", lambda: str(tmp_path))
|
||||
dest = backup_db() # no dest_dir — should use exports/ sub-dir
|
||||
assert os.path.isfile(dest)
|
||||
assert "exports" in dest
|
||||
|
||||
|
||||
# ── restore_db ────────────────────────────────────────────────────────────────
|
||||
|
||||
def test_restore_missing_file_raises(tmp_db):
|
||||
with pytest.raises(FileNotFoundError):
|
||||
restore_db("/nonexistent/backup.db")
|
||||
|
||||
|
||||
def test_restore_replaces_live_db(tmp_db, tmp_path):
|
||||
game = get_game_by_name("Powerball")
|
||||
insert_draw(game["id"], "2024-07-04", [3, 17, 28, 45, 62], bonus=12)
|
||||
backup_path = backup_db(dest_dir=str(tmp_path))
|
||||
|
||||
# Delete the draw from the live DB
|
||||
conn = get_connection()
|
||||
conn.execute("DELETE FROM draws WHERE draw_date='2024-07-04'")
|
||||
conn.commit()
|
||||
conn.close()
|
||||
|
||||
draws_before = get_draws_with_game(game_id=game["id"])
|
||||
assert not any(d["draw_date"] == "2024-07-04" for d in draws_before)
|
||||
|
||||
restore_db(backup_path)
|
||||
|
||||
draws_after = get_draws_with_game(game_id=game["id"])
|
||||
assert any(d["draw_date"] == "2024-07-04" for d in draws_after)
|
||||
|
||||
|
||||
def test_restore_returns_none(tmp_db, tmp_path):
|
||||
backup_path = backup_db(dest_dir=str(tmp_path))
|
||||
result = restore_db(backup_path)
|
||||
assert result is None
|
||||
Reference in New Issue
Block a user