0rbix / tests /test_noaa_api.py
nicolasleiva's picture
Initial commit: Add complete Orbix project
3dc2617
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()