121 lines
3.6 KiB
Python
Executable File
121 lines
3.6 KiB
Python
Executable File
"""
|
|
API Tests for Video-Service
|
|
"""
|
|
|
|
import pytest
|
|
from fastapi.testclient import TestClient
|
|
|
|
from app.main import app
|
|
|
|
|
|
@pytest.fixture
|
|
def client():
|
|
"""Test client fixture."""
|
|
return TestClient(app)
|
|
|
|
|
|
@pytest.fixture
|
|
def api_key():
|
|
"""API key for testing."""
|
|
return "change-me-in-production"
|
|
|
|
|
|
class TestHealthEndpoints:
|
|
"""Tests for health check endpoints."""
|
|
|
|
def test_root_health(self, client):
|
|
"""Test root health endpoint."""
|
|
response = client.get("/health")
|
|
assert response.status_code == 200
|
|
assert response.json()["status"] == "ok"
|
|
|
|
def test_api_health(self, client):
|
|
"""Test API health endpoint."""
|
|
response = client.get("/api/v1/health")
|
|
assert response.status_code == 200
|
|
data = response.json()
|
|
assert "status" in data
|
|
assert "version" in data
|
|
assert "ffmpeg_available" in data
|
|
|
|
|
|
class TestAuthentication:
|
|
"""Tests for authentication."""
|
|
|
|
def test_missing_api_key(self, client):
|
|
"""Test request without API key."""
|
|
response = client.get("/api/v1/videos")
|
|
assert response.status_code == 401
|
|
assert "Missing API key" in response.json()["detail"]
|
|
|
|
def test_invalid_api_key(self, client):
|
|
"""Test request with invalid API key."""
|
|
response = client.get(
|
|
"/api/v1/videos",
|
|
headers={"X-API-Key": "invalid-key"},
|
|
)
|
|
assert response.status_code == 401
|
|
assert "Invalid API key" in response.json()["detail"]
|
|
|
|
def test_valid_api_key(self, client, api_key):
|
|
"""Test request with valid API key."""
|
|
response = client.get(
|
|
"/api/v1/videos",
|
|
headers={"X-API-Key": api_key},
|
|
)
|
|
assert response.status_code == 200
|
|
|
|
|
|
class TestVideoEndpoints:
|
|
"""Tests for video endpoints."""
|
|
|
|
def test_list_videos_empty(self, client, api_key):
|
|
"""Test listing videos when empty."""
|
|
response = client.get(
|
|
"/api/v1/videos",
|
|
headers={"X-API-Key": api_key},
|
|
)
|
|
assert response.status_code == 200
|
|
data = response.json()
|
|
assert "videos" in data
|
|
assert "total" in data
|
|
|
|
def test_get_nonexistent_video(self, client, api_key):
|
|
"""Test getting non-existent video."""
|
|
response = client.get(
|
|
"/api/v1/videos/nonexistent/status",
|
|
headers={"X-API-Key": api_key},
|
|
)
|
|
assert response.status_code == 404
|
|
|
|
def test_delete_nonexistent_video(self, client, api_key):
|
|
"""Test deleting non-existent video."""
|
|
response = client.delete(
|
|
"/api/v1/videos/nonexistent",
|
|
headers={"X-API-Key": api_key},
|
|
)
|
|
assert response.status_code == 404
|
|
|
|
|
|
class TestStreamEndpoints:
|
|
"""Tests for streaming endpoints."""
|
|
|
|
def test_stream_without_token(self, client):
|
|
"""Test streaming without token."""
|
|
response = client.get("/api/v1/stream/test/master.m3u8")
|
|
assert response.status_code == 422 # Missing required parameter
|
|
|
|
def test_stream_with_invalid_token(self, client):
|
|
"""Test streaming with invalid token."""
|
|
response = client.get("/api/v1/stream/test/master.m3u8?token=invalid")
|
|
assert response.status_code == 401
|
|
|
|
|
|
class TestThumbnailEndpoint:
|
|
"""Tests for thumbnail endpoint."""
|
|
|
|
def test_thumbnail_not_found(self, client):
|
|
"""Test thumbnail for non-existent video."""
|
|
response = client.get("/api/v1/videos/nonexistent/thumbnail")
|
|
assert response.status_code == 404
|