Zum Inhalt

tests/test_probe.py

"""Tests for webgui.probe."""

import json

import pytest


def test_probe_returns_valid_for_existing_audio(fixtures_dir):
    from webgui.probe import audio_probe

    result = audio_probe(fixtures_dir / "sample.m4a", output_root=fixtures_dir / "_output")
    assert result["valid"] is True
    assert result["stem"] == "sample"
    assert result["format"] in ("m4a", "mp4", "mov,mp4,m4a,3gp,3g2,mj2")
    assert result["duration_s"] == pytest.approx(1.0, abs=0.2)
    assert result["channels"] == 2
    assert result["sample_rate"] == 48000
    assert result["resume_state"] is None
    assert result["disk_free_bytes"] > 0


def test_probe_returns_invalid_for_missing_file(tmp_path):
    from webgui.probe import audio_probe

    result = audio_probe(tmp_path / "missing.m4a", output_root=tmp_path)
    assert result["valid"] is False
    assert result["error"] == "file_not_found"


def test_probe_returns_invalid_for_unsupported_format(tmp_path):
    from webgui.probe import audio_probe

    bad = tmp_path / "doc.flac"
    bad.write_bytes(b"fake")
    result = audio_probe(bad, output_root=tmp_path)
    assert result["valid"] is False
    assert result["error"] == "format_unsupported"


def test_probe_picks_up_resume_state(fixtures_dir, tmp_path):
    """When output/<stem>/run-state.json exists, probe returns it."""
    from webgui.probe import audio_probe

    stem = "sample"
    output_dir = tmp_path / stem
    output_dir.mkdir()
    state = {
        "schema_version": 1,
        "stem": stem,
        "audio": str(fixtures_dir / "sample.m4a"),
        "phases": {
            "transcribe": {"status": "done"},
            "meta": {"status": "done"},
            "render": {"status": "aborted"},
            "upload": {"status": "pending"},
        },
    }
    (output_dir / "run-state.json").write_text(json.dumps(state))
    result = audio_probe(fixtures_dir / "sample.m4a", output_root=tmp_path)
    assert result["valid"] is True
    assert result["resume_state"]["phases"]["render"]["status"] == "aborted"


def test_eta_estimate_scales_with_duration():
    from webgui.probe import eta_estimate

    e_short = eta_estimate(duration_s=60, model="large-v3-turbo", viz="dialogue")
    e_long = eta_estimate(duration_s=600, model="large-v3-turbo", viz="dialogue")
    assert e_long["total"] > e_short["total"]
    assert e_long["transcribe"] / e_short["transcribe"] == pytest.approx(10.0, abs=0.1)