Ctrl K
ComunidadGuías…

backend/tests/integration/test_provider_integration.py

Rama master · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
"""Integration tests for provider system."""

from unittest.mock import MagicMock, patch

import pytest

from tests.fixtures.provider_responses import (
    OPENSEARCH_EMPTY_RESPONSE,
    OPENSEARCH_RESPONSE,
    PROVIDER_ERROR_RESPONSE,
)


class TestProviderSearch:
    """Tests for provider search functionality."""

    @pytest.mark.skip(
        reason="endpoint not yet implemented: /api/v1/providers/search POST with form data is unverified"
    )
    @patch("providers.opensubtitles.OpenSubtitlesProvider.search")
    def test_provider_search_success(self, mock_search, client):
        """Test successful provider search via the /api/v1/providers/search endpoint."""
        from providers.base import SubtitleResult

        # Mock successful search result
        mock_result = SubtitleResult(
            provider_name="opensubtitles",
            subtitle_id="12345",
            language="en",
            format="ass",
            score=250,
            download_url="https://example.com/sub.ass",
        )
        mock_search.return_value = [mock_result]

        response = client.post(
            "/api/v1/providers/search",
            data={
                "query": "Attack on Titan",
                "language": "en",
            },
        )
        # Endpoint must exist and return success or validation error — not 501
        assert response.status_code in [200, 400, 422]

    @patch("providers.opensubtitles.OpenSubtitlesProvider.search")
    def test_provider_search_empty(self, mock_search, client):
        """Test provider search with no results returns a valid API response."""
        mock_search.return_value = []
        response = client.post(
            "/api/v1/providers/search",
            json={"query": "test", "language": "en"},
        )
        # Endpoint must exist and handle the request without crashing
        assert response.status_code in [200, 400]

    @patch("providers.opensubtitles.OpenSubtitlesProvider.search")
    def test_provider_search_error(self, mock_search, client):
        """Test provider search error is handled gracefully by the API."""
        mock_search.side_effect = Exception("Provider error")
        response = client.post(
            "/api/v1/providers/search",
            json={"query": "test", "language": "en"},
        )
        # Should handle gracefully, not crash with 500
        assert response.status_code in [200, 400, 503]


class TestProviderDownload:
    """Tests for provider download functionality."""

    @patch("providers.opensubtitles.OpenSubtitlesProvider.download")
    def test_provider_download_success(self, mock_download, client):
        """Test successful subtitle download."""
        mock_download.return_value = b"Subtitle content"

        # Test download (mock)
        result = mock_download("12345")
        assert result == b"Subtitle content"

    @patch("providers.opensubtitles.OpenSubtitlesProvider.download")
    def test_provider_download_error(self, mock_download, client):
        """Test subtitle download with error."""
        mock_download.side_effect = Exception("Download failed")

        with pytest.raises(Exception):
            mock_download("12345")


class TestProviderManager:
    """Tests for provider manager functionality."""

    def test_provider_manager_initialization(self, client):
        """Test that provider manager can be initialized."""
        from providers import get_provider_manager

        manager = get_provider_manager()
        assert manager is not None

    def test_provider_status(self, client):
        """Test provider status endpoint."""
        import json

        response = client.get("/api/v1/providers")
        assert response.status_code == 200
        data = json.loads(response.data)
        assert "providers" in data