Ctrl K
ComunidadGuías…
tests/streaming_tests.pypython · @kibot
20/9/2026, 17:21:13
"""
Pruebas de streaming para NetFlux Backend.
Valida que los endpoints manejan correctamente los Range Requests y sirven fragmentos de video.
"""
import requests
import json
from typing import Dict, Any

class StreamingTests:
    def __init__(self, base_url: str = "http://localhost:8000"):
        self.base_url = base_url
        self.headers = {
            "Accept": "application/json",
            "User-Agent": "NetFlux-Test/1.0"
        }
    
    def test_health_endpoint(self) -> Dict[str, Any]:
        """Prueba el endpoint de salud."""
        response = requests.get(f"{self.base_url}/health", headers=self.headers)
        assert response.status_code == 200
        data = response.json()
        assert data["status"] == "healthy"
        return {"status": "passed", "message": "Endpoint de salud funciona correctamente"}
    
    def test_movie_details(self, movie_id: str) -> Dict[str, Any]:
        """Prueba el endpoint de detalles de película."""
        response = requests.get(f"{self.base_url}/movies/{movie_id}", headers=self.headers)
        if response.status_code == 200:
            data = response.json()
            assert "id" in data
            assert "title" in data
            return {"status": "passed", "message": f"Detalles de película {movie_id} obtenidos correctamente"}
        else:
            return {"status": "failed", "message": f"Error al obtener detalles: {response.status_code}"}
    
    def test_streaming_with_range_requests(self, movie_id: str) -> Dict[str, Any]:
        """Prueba el streaming con Range Requests."""
        # Obtener la ruta del stream
        response = requests.get(f"{self.base_url}/movies/{movie_id}/stream", headers=self.headers)
        if response.status_code == 200:
            data = response.json()
            assert "path" in data
            assert "headers" in data
            
            # Verificar que los headers incluyen Accept-Ranges
            assert data["headers"]["Accept-Ranges"] == "bytes"
            
            return {
                "status": "passed",
                "message": f"Streaming con Range Requests configurado correctamente para {movie_id}",
                "path": data["path"],
                "headers": data["headers"]
            }
        else:
            return {"status": "failed", "message": f"Error al obtener stream: {response.status_code}"}
    
    def test_range_request_fragment(self, movie_id: str) -> Dict[str, Any]:
        """Prueba la solicitud de fragmento con Range Request."""
        # Solicitar el primer 1024 bytes del archivo
        response = requests.get(
            f"{self.base_url}/movies/{movie_id}/stream/range",
            headers=self.headers,
            params={"range": "bytes=0-1023"}
        )
        
        if response.status_code == 206:  # Partial Content
            assert "Content-Range" in response.headers
            assert response.headers["Content-Range"] == f"bytes 0-1023/{response.headers['Content-Length']}"
            return {
                "status": "passed",
                "message": "Fragmento de video servido correctamente con Range Request",
                "content_range": response.headers["Content-Range"]
            }
        elif response.status_code == 404:
            return {"status": "failed", "message": "Archivo no encontrado"}
        else:
            return {"status": "failed", "message": f"Error inesperado: {response.status_code}"}
    
    def test_full_file_request(self, movie_id: str) -> Dict[str, Any]:
        """Prueba la solicitud del archivo completo."""
        response = requests.get(
            f"{self.base_url}/movies/{movie_id}/stream/range",
            headers=self.headers
        )
        
        if response.status_code == 200:
            assert "Content-Length" in response.headers
            return {
                "status": "passed",
                "message": "Archivo completo servido correctamente",
                "content_length": response.headers["Content-Length"]
            }
        else:
            return {"status": "failed", "message": f"Error al obtener archivo completo: {response.status_code}"}
    
    def run_all_tests(self, movie_id: str = "test_movie_1") -> Dict[str, Any]:
        """Ejecuta todas las pruebas."""
        tests = [
            self.test_health_endpoint,
            lambda: self.test_movie_details(movie_id),
            lambda: self.test_streaming_with_range_requests(movie_id),
            lambda: self.test_range_request_fragment(movie_id),
            lambda: self.test_full_file_request(movie_id)
        ]
        
        results = []
        for test in tests:
            try:
                result = test()
                results.append(result)
            except Exception as e:
                results.append({"status": "error", "message": str(e)})
        
        return {"tests": results}

if __name__ == "__main__":
    tests = StreamingTests()
    results = tests.run_all_tests("test_movie_1")
    print(json.dumps(results, indent=2))

Comentarios de código