Ctrl K
ComunidadGuías…

backend/tests/test_database.py

Rama master · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
"""Tests for database.py -- SQLite persistence."""

import os

import pytest

from config import reload_settings
from db import close_db, get_db, init_db
from db.jobs import create_job, get_job, get_stats_summary, record_stat, update_job


@pytest.fixture
def temp_db(tmp_path):
    """Create a temporary database for testing.

    Under ``tmp_path`` so a locked file is reclaimed by pytest on a later
    session instead of leaking into ``%TEMP%`` forever — see the note on the
    shared ``temp_db`` fixture in conftest.py.
    """
    db_path = str(tmp_path / "test.db")

    # Override db_path in settings
    os.environ["SUBLARR_DB_PATH"] = db_path
    os.environ["SUBLARR_API_KEY"] = ""
    os.environ["SUBLARR_LOG_LEVEL"] = "ERROR"
    reload_settings()

    # Push a Flask app context so SQLAlchemy repositories can access db.session
    from app import create_app

    app = create_app(testing=True)
    ctx = app.app_context()
    ctx.push()
    init_db()

    yield db_path

    # Teardown — close the DB so pytest's tmp_path removal can succeed.
    ctx.pop()
    close_db()
    for key in ("SUBLARR_DB_PATH", "SUBLARR_API_KEY", "SUBLARR_LOG_LEVEL"):
        os.environ.pop(key, None)
    reload_settings()


def test_create_job(temp_db):
    """Test job creation."""
    job = create_job("/test/path.mkv", force=False, arr_context={"series_id": 123})
    assert job["id"] is not None
    assert job["file_path"] == "/test/path.mkv"
    assert job["status"] == "queued"
    assert job["arr_context"]["series_id"] == 123


def test_get_job(temp_db):
    """Test job retrieval."""
    job = create_job("/test/path.mkv")
    job_id = job["id"]

    retrieved = get_job(job_id)
    assert retrieved is not None
    assert retrieved["id"] == job_id
    assert retrieved["file_path"] == "/test/path.mkv"


def test_update_job(temp_db):
    """Test job status update."""
    job = create_job("/test/path.mkv")
    job_id = job["id"]

    result = {
        "success": True,
        "output_path": "/test/path.de.ass",
        "stats": {"format": "ass", "translated": 100},
    }
    update_job(job_id, "completed", result=result)

    updated = get_job(job_id)
    assert updated["status"] == "completed"
    assert updated["output_path"] == "/test/path.de.ass"
    assert updated["stats"]["format"] == "ass"


def test_record_stat(temp_db):
    """Test statistics recording."""
    record_stat(success=True, skipped=False, fmt="ass", source="embedded_ass")
    record_stat(success=True, skipped=False, fmt="srt", source="external_srt")
    record_stat(success=False)

    stats = get_stats_summary()
    assert stats["total_translated"] >= 2
    assert stats["total_failed"] >= 1
    assert "ass" in stats["by_format"]
    assert "srt" in stats["by_format"]


def test_get_stats_summary(temp_db):
    """Test stats summary aggregation."""
    for _ in range(5):
        record_stat(success=True, skipped=False, fmt="ass")
    for _ in range(2):
        record_stat(success=False)

    stats = get_stats_summary()
    assert stats["total_translated"] >= 5
    assert stats["total_failed"] >= 2
    assert stats["by_format"]["ass"] >= 5