batdetect2/tests/test_cli/test_detect.py
2026-03-18 20:35:08 +00:00

120 lines
3.0 KiB
Python

"""Behavior tests for legacy detect command."""
from pathlib import Path
import pandas as pd
from click.testing import CliRunner
from batdetect2.cli import cli
def test_cli_detect_help() -> None:
"""User story: get usage help for legacy detect command."""
result = CliRunner().invoke(cli, ["detect", "--help"])
assert result.exit_code == 0
assert "Detect bat calls in files in AUDIO_DIR" in result.output
def test_cli_detect_command_on_test_audio(tmp_path: Path) -> None:
"""User story: run legacy detect on example audio directory."""
results_dir = tmp_path / "results"
result = CliRunner().invoke(
cli,
[
"detect",
"example_data/audio",
str(results_dir),
"0.3",
],
)
assert result.exit_code == 0
assert results_dir.exists()
assert len(list(results_dir.glob("*.csv"))) == 3
assert len(list(results_dir.glob("*.json"))) == 3
def test_cli_detect_command_with_non_trivial_time_expansion(
tmp_path: Path,
) -> None:
"""User story: set time expansion in legacy detect command."""
results_dir = tmp_path / "results"
result = CliRunner().invoke(
cli,
[
"detect",
"example_data/audio",
str(results_dir),
"0.3",
"--time_expansion_factor",
"10",
],
)
assert result.exit_code == 0
assert "Time Expansion Factor: 10" in result.stdout
def test_cli_detect_command_with_spec_feature_flag(tmp_path: Path) -> None:
"""User story: request extra spectral features in output CSV."""
results_dir = tmp_path / "results"
result = CliRunner().invoke(
cli,
[
"detect",
"example_data/audio",
str(results_dir),
"0.3",
"--spec_features",
],
)
assert result.exit_code == 0
assert results_dir.exists()
csv_files = [path.name for path in results_dir.glob("*.csv")]
expected_files = [
"20170701_213954-MYOMYS-LR_0_0.5.wav_spec_features.csv",
"20180530_213516-EPTSER-LR_0_0.5.wav_spec_features.csv",
"20180627_215323-RHIFER-LR_0_0.5.wav_spec_features.csv",
]
for expected_file in expected_files:
assert expected_file in csv_files
df = pd.read_csv(results_dir / expected_file)
assert not (df.duration == -1).any()
def test_cli_detect_fails_gracefully_on_empty_file(tmp_path: Path) -> None:
"""User story: bad/empty input file reports error but command survives."""
results_dir = tmp_path / "results"
target = tmp_path / "audio"
target.mkdir()
empty_file = target / "empty.wav"
empty_file.touch()
result = CliRunner().invoke(
cli,
args=[
"detect",
str(target),
str(results_dir),
"0.3",
"--spec_features",
],
)
assert result.exit_code == 0
assert f"Error processing file {empty_file}" in result.output