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()