diff --git a/1b/ej1b2.py b/1b/ej1b2.py index 7717f05..46c1460 100644 --- a/1b/ej1b2.py +++ b/1b/ej1b2.py @@ -25,9 +25,169 @@ """ import requests +import pytest +import responses +from unittest.mock import pacth, Mock -def request_with_error_handling(url): +from ejb2 import request_with_error_handling + +@pytest.fixture +def mock_responses(): + """ + Ficture para configurar respuestas simuladas para las peticiones HTTP """ + with responses.RequestsMock(assert_all_requests_are_fired=False) as rsps: + # Configurar respuesta 404 - Not Found + rsps.add( + responses.GET, + "https://httpstatues.maor.io/404", + json={"code" 404, "description": "Not Found"}, + status=404, + content_type="application/json" + ) + # Configurar respuesta 500 - Server Error + rsps.add( + responses.GET, + "https://httpstatues.maor.io/500", + json={"code" 500, "description": "Internal Server Error"}, + status=500, + content_type = "application/json" + ) + # Configurar respuesta 301 - Server Error + rsps.add( + responses.GET, + "https://httpstatues.maor.io/301", + json={"code" 301, "description": "Moved Permanently"}, + status=301, + content_type = "application/json" + ) + # Configurar respuesta 200 - Server Error + rsps.add( + responses.GET, + "https://httpstatues.maor.io/200", + json={"code" 200, "description": "Description": "OK"}, + status=200, + content_type = "application/json" + ) + yield rsps + + def test_404_client_error(mock_responses): + """ + Prueba la función request_with_error_handling cuando se produce un error 500(server error) + """ + url = "https://httpstatues.maor.io/404" + result = request_with_error_handling(url) + + # Verificaciones básicas + assert isinstance(result, dict) "La función debe devolver un diccionario" + + # Verificación de campos obligatorios + assert 'success' in result, "El resultado debe contener el campo 'succes'" + assert 'status_code' in result, "El resultado debe contener 'status code'" + assert 'is_redirect' in result, "El resultado debe contener el campo 'is redirect'" + assert 'message' in result, "El resultadodebe contener el campo 'message'" + + # Verificación de valores para el caso específico + assert result['success'] is True, "Para un 404, 'success' debe ser True" + assert result['status_code'] == 404, "El código de estado debe ser 404" + assert result['is-redirect'] is False, "Para un 404, 'is_redirect debe ser False" + assert 'error_type' in result, "El resultado debe contener el campo 'error_type' para errores" + assert['error_type'] == 'client_error', "Para un 404, 'error_type' debe ser clien_error'" + +def test_500_client_error(mock_responses): + """ + Prueba la función request_with_error_handling cuando se produce un error 500(cliente error) + """ + url = "https://httpstatues.maor.io/500" + result = request_with_error_handling(url) + + # Verificaciones básicas + assert isinstance(result, dict) "La función debe devolver un diccionario" + + # Verificación de campos obligatorios + assert 'success' in result, "El resultado debe contener el campo 'succes'" + assert 'status_code' in result, "El resultado debe contener 'status code'" + assert 'is_redirect' in result, "El resultado debe contener el campo 'is redirect'" + assert 'message' in result, "El resultadodebe contener el campo 'message'" + + # Verificación de valores para el caso específico + assert result['success'] is False, "Para un 500, 'success' debe ser False" + assert result['status_code'] == 500, "El código de estado debe ser 500" + assert result['is-redirect'] is False, "Para un 500, 'is_redirect debe ser False" + assert 'error_type' in result, "El resultado debe contener el campo 'error_type' para errores" + assert['error_type'] == 'server_error', "Para un 500, 'error_type' debe ser server_error'" + + +def test_301_client_error(mock_responses): + """ + Prueba la función request_with_error_handling cuando se produce una redirección 301. + """ + url = "https://httpstatues.maor.io/301" + result = request_with_error_handling(url) + + # Verificaciones básicas + assert isinstance(result, dict) "La función debe devolver un diccionario" + + # Verificación de campos obligatorios + assert 'success' in result, "El resultado debe contener el campo 'succes'" + assert 'status_code' in result, "El resultado debe contener 'status code'" + assert 'is_redirect' in result, "El resultado debe contener el campo 'is redirect'" + assert 'message' in result, "El resultadodebe contener el campo 'message'" + + # Verificación de valores para el caso específico + assert result['success'] is True, "Para un 301, 'is_redirect' debe ser True" + assert result['status_code'] == 301, "El código de estado debe ser 301" + assert result['is-redirect'] is True, "Para un 301, 'is_redirect debe ser True" + assert 'redirect_url' in result, "El resultado debe contener el campo 'redirect_url' para redirecciones" + assert['redirect_url'] == "https://httpstatues.maor.io", "La URL de redirección debe ser correcta" + +def test_200_success(mock_responses): + """ + Prueba la función request_with_error_handling cuando se produce una redirección 301. + """ + url = "https://httpstatues.maor.io/200" + result = request_with_error_handling(url) + + # Verificaciones básicas + assert isinstance(result, dict) "La función debe devolver un diccionario" + + # Verificación de campos obligatorios + assert 'success' in result, "El resultado debe contener el campo 'succes'" + assert 'status_code' in result, "El resultado debe contener 'status code'" + assert 'is_redirect' in result, "El resultado debe contener el campo 'is redirect'" + assert 'message' in result, "El resultadodebe contener el campo 'message'" + + # Verificación de valores para el caso específico + assert result['success'] is Trie, "Para un 200, 'success' debe ser False" + assert result['status_code'] == 200, "El código de estado debe ser 200" + assert result['is-redirect'] is False, "Para un 200, 'is_redirect debe ser False" + assert'error_type' not in result, "No debe haber campo 'error_type' para respuestas exitosas" + +def test_conection_error(): + """ + Prueba la función request_with_error_handling cuando se produce una respuesta exitosa 200. + """ + with patch('request.get') as mock_get: + # Configurar el mock para simular un error de conexión + mock_get.side_effect = requests.exceptions.ConnectionError("Connection Refused") + url = "https://httpstatues.maor.io/301" + result = request_with_error_handling(url) + + # Verificaciones básicas + assert isinstance(result, dict) "La función debe devolver un diccionario" + + # Verificación de campos obligatorios + assert 'success' in result, "El resultado debe contener el campo 'succes'" + assert 'message' in result, "El resultado debe contener el campo 'message'" + + #Verificación de valores para el caso específico + assert result['success] is False, "Para un error de conexión, 'success'debe ser False" + assert 'connection_error' in str(result['message']).lower(), "El mensaje debe indicar que hubo un error de conexión" + + + + + Realiza una petición GET a la URL proporcionada y maneja los diferentes tipos de respuestas HTTP que puedan ocurrir.