Kokoro-FastAPI/ui/tests/test_files.py
2025-01-01 21:50:00 -07:00

195 lines
5.9 KiB
Python

import os
import pytest
from unittest.mock import patch
from ui.lib import files
from ui.lib.config import AUDIO_FORMATS
@pytest.fixture
def mock_dirs(tmp_path):
"""Create temporary input and output directories"""
inputs_dir = tmp_path / "inputs"
outputs_dir = tmp_path / "outputs"
inputs_dir.mkdir()
outputs_dir.mkdir()
with patch("ui.lib.files.INPUTS_DIR", str(inputs_dir)), patch(
"ui.lib.files.OUTPUTS_DIR", str(outputs_dir)
):
yield inputs_dir, outputs_dir
def test_list_input_files_empty(mock_dirs):
"""Test listing input files from empty directory"""
assert files.list_input_files() == []
def test_list_input_files(mock_dirs):
"""Test listing input files with various files"""
inputs_dir, _ = mock_dirs
# Create test files
(inputs_dir / "test1.txt").write_text("content1")
(inputs_dir / "test2.txt").write_text("content2")
(inputs_dir / "nottext.pdf").write_text("should not be listed")
result = files.list_input_files()
assert len(result) == 2
assert "test1.txt" in result
assert "test2.txt" in result
assert "nottext.pdf" not in result
def test_list_output_files_empty(mock_dirs):
"""Test listing output files from empty directory"""
assert files.list_output_files() == []
def test_list_output_files(mock_dirs):
"""Test listing output files with various formats"""
_, outputs_dir = mock_dirs
# Create test files for each format
for fmt in AUDIO_FORMATS:
(outputs_dir / f"test.{fmt}").write_text("dummy content")
(outputs_dir / "test.txt").write_text("should not be listed")
result = files.list_output_files()
assert len(result) == len(AUDIO_FORMATS)
for fmt in AUDIO_FORMATS:
assert any(f".{fmt}" in file for file in result)
def test_read_text_file_empty_filename(mock_dirs):
"""Test reading with empty filename"""
assert files.read_text_file("") == ""
def test_read_text_file_nonexistent(mock_dirs):
"""Test reading nonexistent file"""
assert files.read_text_file("nonexistent.txt") == ""
def test_read_text_file_success(mock_dirs):
"""Test successful file reading"""
inputs_dir, _ = mock_dirs
content = "Test content\nMultiple lines"
(inputs_dir / "test.txt").write_text(content)
assert files.read_text_file("test.txt") == content
def test_save_text_empty(mock_dirs):
"""Test saving empty text"""
assert files.save_text("") is None
assert files.save_text(" ") is None
def test_save_text_auto_filename(mock_dirs):
"""Test saving text with auto-generated filename"""
inputs_dir, _ = mock_dirs
# First save
filename1 = files.save_text("content1")
assert filename1 == "input_1.txt"
assert (inputs_dir / filename1).read_text() == "content1"
# Second save
filename2 = files.save_text("content2")
assert filename2 == "input_2.txt"
assert (inputs_dir / filename2).read_text() == "content2"
def test_save_text_custom_filename(mock_dirs):
"""Test saving text with custom filename"""
inputs_dir, _ = mock_dirs
filename = files.save_text("content", "custom.txt")
assert filename == "custom.txt"
assert (inputs_dir / filename).read_text() == "content"
def test_save_text_duplicate_filename(mock_dirs):
"""Test saving text with duplicate filename"""
inputs_dir, _ = mock_dirs
# First save
filename1 = files.save_text("content1", "test.txt")
assert filename1 == "test.txt"
# Save with same filename
filename2 = files.save_text("content2", "test.txt")
assert filename2 == "test_1.txt"
assert (inputs_dir / "test.txt").read_text() == "content1"
assert (inputs_dir / "test_1.txt").read_text() == "content2"
def test_delete_all_input_files(mock_dirs):
"""Test deleting all input files"""
inputs_dir, _ = mock_dirs
# Create test files
(inputs_dir / "test1.txt").write_text("content1")
(inputs_dir / "test2.txt").write_text("content2")
(inputs_dir / "keep.pdf").write_text("should not be deleted")
assert files.delete_all_input_files() is True
remaining_files = list(inputs_dir.iterdir())
assert len(remaining_files) == 1
assert remaining_files[0].name == "keep.pdf"
def test_delete_all_output_files(mock_dirs):
"""Test deleting all output files"""
_, outputs_dir = mock_dirs
# Create test files
for fmt in AUDIO_FORMATS:
(outputs_dir / f"test.{fmt}").write_text("dummy content")
(outputs_dir / "keep.txt").write_text("should not be deleted")
assert files.delete_all_output_files() is True
remaining_files = list(outputs_dir.iterdir())
assert len(remaining_files) == 1
assert remaining_files[0].name == "keep.txt"
def test_process_uploaded_file_empty_path(mock_dirs):
"""Test processing empty file path"""
assert files.process_uploaded_file("") is False
def test_process_uploaded_file_invalid_extension(mock_dirs, tmp_path):
"""Test processing file with invalid extension"""
test_file = tmp_path / "test.pdf"
test_file.write_text("content")
assert files.process_uploaded_file(str(test_file)) is False
def test_process_uploaded_file_success(mock_dirs, tmp_path):
"""Test successful file upload processing"""
inputs_dir, _ = mock_dirs
# Create source file
source_file = tmp_path / "test.txt"
source_file.write_text("test content")
assert files.process_uploaded_file(str(source_file)) is True
assert (inputs_dir / "test.txt").read_text() == "test content"
def test_process_uploaded_file_duplicate(mock_dirs, tmp_path):
"""Test processing file with duplicate name"""
inputs_dir, _ = mock_dirs
# Create existing file
(inputs_dir / "test.txt").write_text("existing content")
# Create source file
source_file = tmp_path / "test.txt"
source_file.write_text("new content")
assert files.process_uploaded_file(str(source_file)) is True
assert (inputs_dir / "test.txt").read_text() == "existing content"
assert (inputs_dir / "test_1.txt").read_text() == "new content"