Spaces:
Configuration error
Configuration error
File size: 6,392 Bytes
3dc2617 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 | import unittest
from unittest.mock import patch, MagicMock
import json
import os
import sys
# Agregar el directorio src al path para poder importar los m贸dulos
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
from src.noaa_api import NOAAApi
class TestNOAAApi(unittest.TestCase):
"""Pruebas unitarias para la clase NOAAApi"""
def setUp(self):
"""Configuraci贸n inicial para las pruebas"""
self.noaa_api = NOAAApi()
# Datos de ejemplo para simular respuestas de la API
self.sample_solar_wind_data = [
{"time_tag": "2023-01-01T00:00:00Z", "bx": 1.2, "by": -0.5, "bz": 0.8, "bt": 1.5, "density": 5.2, "speed": 450.3},
{"time_tag": "2023-01-01T01:00:00Z", "bx": 1.3, "by": -0.6, "bz": 0.7, "bt": 1.6, "density": 5.3, "speed": 451.2}
]
self.sample_geomag_indices = [
{"time_tag": "2023-01-01T00:00:00Z", "kp_index": 3, "dst_index": -15, "ap_index": 12},
{"time_tag": "2023-01-01T03:00:00Z", "kp_index": 4, "dst_index": -20, "ap_index": 15}
]
self.sample_solar_flare_data = [
{"time_tag": "2023-01-01T00:00:00Z", "class": "C1.2", "intensity": 1.2e-6, "integrated_flux": 1.5e-4},
{"time_tag": "2023-01-01T12:00:00Z", "class": "M2.3", "intensity": 2.3e-5, "integrated_flux": 3.2e-3}
]
self.sample_proton_flux_data = [
{"time_tag": "2023-01-01T00:00:00Z", "p1": 10.2, "p5": 5.1, "p10": 2.3, "p30": 0.5, "p50": 0.2, "p100": 0.1},
{"time_tag": "2023-01-01T01:00:00Z", "p1": 11.3, "p5": 5.5, "p10": 2.5, "p30": 0.6, "p50": 0.3, "p100": 0.1}
]
self.sample_aurora_forecast = [
{"time_tag": "2023-01-01T00:00:00Z", "latitude": 60.0, "longitude": -100.0, "probability": 0.75},
{"time_tag": "2023-01-01T00:00:00Z", "latitude": 65.0, "longitude": -105.0, "probability": 0.85}
]
self.sample_space_weather_alerts = [
{"issue_time": "2023-01-01T00:00:00Z", "message_code": "ALTXMF", "message": "X-class Solar Flare", "severity": "WARNING"},
{"issue_time": "2023-01-01T12:00:00Z", "message_code": "WATA20", "message": "Geomagnetic Storm Watch", "severity": "WATCH"}
]
@patch('requests.Session.get')
def test_get_solar_wind_data(self, mock_get):
"""Prueba para obtener datos del viento solar"""
# Configurar el mock para simular la respuesta de la API
mock_response = MagicMock()
mock_response.json.return_value = self.sample_solar_wind_data
mock_response.raise_for_status.return_value = None
mock_get.return_value = mock_response
# Llamar al m茅todo y verificar el resultado
result = self.noaa_api.get_solar_wind_data()
self.assertEqual(result, {"data": self.sample_solar_wind_data})
mock_get.assert_called_once_with(f"{self.noaa_api.BASE_URL}/solar-wind/mag-1-day.json")
@patch('requests.Session.get')
def test_get_geomagnetic_indices(self, mock_get):
"""Prueba para obtener 铆ndices geomagn茅ticos"""
mock_response = MagicMock()
mock_response.json.return_value = self.sample_geomag_indices
mock_response.raise_for_status.return_value = None
mock_get.return_value = mock_response
result = self.noaa_api.get_geomagnetic_indices()
self.assertEqual(result, {"data": self.sample_geomag_indices})
mock_get.assert_called_once_with(f"{self.noaa_api.BASE_URL}/geospace/geomag-indices-1-day.json")
@patch('requests.Session.get')
def test_get_solar_flare_data(self, mock_get):
"""Prueba para obtener datos de llamaradas solares"""
mock_response = MagicMock()
mock_response.json.return_value = self.sample_solar_flare_data
mock_response.raise_for_status.return_value = None
mock_get.return_value = mock_response
result = self.noaa_api.get_solar_flare_data(days=1)
self.assertEqual(result, {"data": self.sample_solar_flare_data})
mock_get.assert_called_once_with(f"{self.noaa_api.BASE_URL}/goes/primary-xrays-1-day.json")
@patch('requests.Session.get')
def test_get_proton_flux_data(self, mock_get):
"""Prueba para obtener datos de flujo de protones"""
mock_response = MagicMock()
mock_response.json.return_value = self.sample_proton_flux_data
mock_response.raise_for_status.return_value = None
mock_get.return_value = mock_response
result = self.noaa_api.get_proton_flux_data()
self.assertEqual(result, {"data": self.sample_proton_flux_data})
mock_get.assert_called_once_with(f"{self.noaa_api.BASE_URL}/goes/proton-fluences-1-day.json")
@patch('requests.Session.get')
def test_get_aurora_forecast(self, mock_get):
"""Prueba para obtener pron贸stico de auroras"""
mock_response = MagicMock()
mock_response.json.return_value = self.sample_aurora_forecast
mock_response.raise_for_status.return_value = None
mock_get.return_value = mock_response
result = self.noaa_api.get_aurora_forecast()
self.assertEqual(result, {"data": self.sample_aurora_forecast})
mock_get.assert_called_once_with(f"{self.noaa_api.BASE_URL}/ovation/aurora-forecast-map.json")
@patch('requests.Session.get')
def test_get_space_weather_alerts(self, mock_get):
"""Prueba para obtener alertas de clima espacial"""
mock_response = MagicMock()
mock_response.json.return_value = self.sample_space_weather_alerts
mock_response.raise_for_status.return_value = None
mock_get.return_value = mock_response
result = self.noaa_api.get_space_weather_alerts()
self.assertEqual(result, {"data": self.sample_space_weather_alerts})
mock_get.assert_called_once_with(f"{self.noaa_api.BASE_URL}/alerts.json")
@patch('requests.Session.get')
def test_error_handling(self, mock_get):
"""Prueba para verificar el manejo de errores"""
mock_get.side_effect = requests.RequestException("Error de conexi贸n")
result = self.noaa_api.get_solar_wind_data()
self.assertEqual(result, {"error": "Error de conexi贸n"})
if __name__ == '__main__':
unittest.main() |