Initial Real-ESRGAN API project setup

This commit is contained in:
Developer
2026-02-16 19:56:25 +01:00
commit 0e59652575
34 changed files with 3668 additions and 0 deletions

191
tests/__init__.py Normal file
View File

@@ -0,0 +1,191 @@
"""
Test suite for Real-ESRGAN API.
Run with: pytest tests/
"""
import asyncio
import json
import tempfile
from pathlib import Path
from unittest.mock import AsyncMock, Mock, patch
import pytest
from fastapi.testclient import TestClient
from PIL import Image
from app.main import app
from app.services import file_manager, worker
# Test client
client = TestClient(app)
@pytest.fixture
def temp_dir():
"""Create temporary directory for tests."""
with tempfile.TemporaryDirectory() as tmpdir:
yield Path(tmpdir)
@pytest.fixture
def test_image(temp_dir):
"""Create a test image."""
img = Image.new('RGB', (256, 256), color=(73, 109, 137))
path = temp_dir / 'test.jpg'
img.save(path)
return path
class TestHealth:
def test_health_check(self):
"""Test health check endpoint."""
response = client.get('/api/v1/health')
assert response.status_code == 200
data = response.json()
assert data['status'] == 'ok'
assert data['version'] == '1.0.0'
assert 'uptime_seconds' in data
def test_liveness(self):
"""Test liveness probe."""
response = client.get('/api/v1/health/live')
assert response.status_code == 200
assert response.json()['alive'] is True
class TestModels:
def test_list_models(self):
"""Test listing models."""
response = client.get('/api/v1/models')
assert response.status_code == 200
data = response.json()
assert 'available_models' in data
assert 'total_models' in data
assert 'local_models' in data
assert isinstance(data['available_models'], list)
def test_models_info(self):
"""Test models directory info."""
response = client.get('/api/v1/models-info')
assert response.status_code == 200
data = response.json()
assert 'models_directory' in data
assert 'total_size_mb' in data
assert 'model_count' in data
class TestSystem:
def test_system_info(self):
"""Test system information."""
response = client.get('/api/v1/system')
assert response.status_code == 200
data = response.json()
assert data['status'] == 'ok'
assert 'cpu_usage_percent' in data
assert 'memory_usage_percent' in data
assert 'disk_usage_percent' in data
assert 'execution_providers' in data
def test_stats(self):
"""Test statistics endpoint."""
response = client.get('/api/v1/stats')
assert response.status_code == 200
data = response.json()
assert 'total_requests' in data
assert 'successful_requests' in data
assert 'failed_requests' in data
class TestFileManager:
def test_ensure_directories(self):
"""Test directory creation."""
with tempfile.TemporaryDirectory() as tmpdir:
# Mock settings
with patch('app.services.file_manager.settings.upload_dir', f'{tmpdir}/uploads'):
with patch('app.services.file_manager.settings.output_dir', f'{tmpdir}/outputs'):
file_manager.ensure_directories()
assert Path(f'{tmpdir}/uploads').exists()
assert Path(f'{tmpdir}/outputs').exists()
def test_generate_output_path(self):
"""Test output path generation."""
input_path = '/tmp/test.jpg'
output_path = file_manager.generate_output_path(input_path)
assert output_path.endswith('.jpg')
assert 'upscaled' in output_path
def test_cleanup_directory(self, temp_dir):
"""Test directory cleanup."""
test_dir = temp_dir / 'test_cleanup'
test_dir.mkdir()
(test_dir / 'file.txt').write_text('test')
assert test_dir.exists()
file_manager.cleanup_directory(str(test_dir))
assert not test_dir.exists()
class TestWorker:
def test_job_creation(self):
"""Test job creation."""
job = worker.Job(
job_id='test-id',
status='queued',
input_path='/tmp/input.jpg',
output_path='/tmp/output.jpg',
model='RealESRGAN_x4plus',
)
assert job.job_id == 'test-id'
assert job.status == 'queued'
assert 'created_at' in job.to_dict()
def test_job_metadata_save(self, temp_dir):
"""Test job metadata persistence."""
with patch('app.services.worker.settings.jobs_dir', str(temp_dir)):
job = worker.Job(
job_id='test-id',
status='queued',
input_path='/tmp/input.jpg',
output_path='/tmp/output.jpg',
model='RealESRGAN_x4plus',
)
job.save_metadata()
metadata_file = temp_dir / 'test-id' / 'metadata.json'
assert metadata_file.exists()
data = json.loads(metadata_file.read_text())
assert data['job_id'] == 'test-id'
assert data['status'] == 'queued'
class TestJobEndpoints:
def test_list_jobs(self):
"""Test listing jobs endpoint."""
response = client.get('/api/v1/jobs')
assert response.status_code == 200
data = response.json()
assert 'total' in data
assert 'jobs' in data
assert 'returned' in data
def test_job_not_found(self):
"""Test requesting non-existent job."""
response = client.get('/api/v1/jobs/nonexistent-id')
assert response.status_code == 404
class TestRootEndpoint:
def test_root(self):
"""Test root endpoint."""
response = client.get('/')
assert response.status_code == 200
data = response.json()
assert 'name' in data
assert 'version' in data
assert 'endpoints' in data
if __name__ == '__main__':
pytest.main([__file__, '-v'])

View File

@@ -0,0 +1,44 @@
"""Unit tests for file manager."""
import tempfile
from pathlib import Path
from unittest.mock import patch
import pytest
from app.services import file_manager
@pytest.fixture
def temp_data_dir():
"""Create temporary data directory."""
with tempfile.TemporaryDirectory() as tmpdir:
yield Path(tmpdir)
class TestFileManager:
def test_create_request_dir(self, temp_data_dir):
"""Test request directory creation."""
with patch('app.services.file_manager.settings.upload_dir', str(temp_data_dir)):
req_dir = file_manager.create_request_dir()
assert Path(req_dir).exists()
assert Path(req_dir).parent == temp_data_dir
def test_directory_size(self, temp_data_dir):
"""Test directory size calculation."""
test_file = temp_data_dir / 'test.txt'
test_file.write_text('x' * 1024) # 1KB
size_mb = file_manager.get_directory_size_mb(str(temp_data_dir))
assert size_mb > 0
def test_cleanup_old_jobs(self, temp_data_dir):
"""Test old jobs cleanup."""
with patch('app.services.file_manager.settings.jobs_dir', str(temp_data_dir)):
# Create old directory
old_job = temp_data_dir / 'old-job'
old_job.mkdir()
(old_job / 'file.txt').write_text('test')
# Should be cleaned up with hours=0
cleaned = file_manager.cleanup_old_jobs(hours=0)
assert cleaned >= 1