69 lines
2.3 KiB
Python
69 lines
2.3 KiB
Python
# tests/test_smhi.py
|
|
|
|
import pytest
|
|
import requests
|
|
from datetime import datetime
|
|
from environment.smhi import SMHI
|
|
from tools.geometry import Coordinate
|
|
|
|
|
|
@pytest.fixture
|
|
def smhi_client():
|
|
session = requests.Session()
|
|
location = Coordinate(56.2006, 12.5553)
|
|
return SMHI(location, session)
|
|
|
|
|
|
def test_smhi_fire_warning_success(requests_mock, smhi_client):
|
|
# Mock a successful API response
|
|
mock_response = {
|
|
"timeSeries": [{"parameters": [{"name": "fwiindex", "values": [4]}]}]
|
|
}
|
|
# Intercept the exact URL your code generates
|
|
url = smhi_client.fire_warning_api.format(lon=12.5553, lat=56.2006)
|
|
requests_mock.get(url, json=mock_response, status_code=200)
|
|
|
|
# Run the function
|
|
result = smhi_client._get_fire_warning()
|
|
|
|
# Assert it succeeded and parsed the data correctly
|
|
assert result is True
|
|
assert smhi_client._data["fire_index"]["data"] == 4
|
|
assert isinstance(smhi_client._data["fire_index"]["valid_time"], datetime)
|
|
|
|
|
|
def test_smhi_fire_warning_http_error(requests_mock, smhi_client, caplog):
|
|
# Mock SMHI's servers crashing (500 Internal Server Error)
|
|
url = smhi_client.fire_warning_api.format(lon=12.5553, lat=56.2006)
|
|
requests_mock.get(url, status_code=500)
|
|
|
|
result = smhi_client._get_fire_warning()
|
|
|
|
# Assert the function returned False instead of crashing the app
|
|
assert result is False
|
|
# Assert that our logger caught the HTTP error
|
|
assert "Network error getting SMHI Fire index" in caplog.text
|
|
|
|
|
|
def test_smhi_fire_warning_timeout(requests_mock, smhi_client, caplog):
|
|
# Mock a network timeout
|
|
url = smhi_client.fire_warning_api.format(lon=12.5553, lat=56.2006)
|
|
requests_mock.get(url, exc=requests.exceptions.ConnectTimeout)
|
|
|
|
result = smhi_client._get_fire_warning()
|
|
|
|
assert result is False
|
|
assert "Network error getting SMHI Fire index" in caplog.text
|
|
|
|
|
|
def test_smhi_bad_json_parsing(requests_mock, smhi_client, caplog):
|
|
# Mock SMHI returning incomplete/bad JSON that is missing the "parameters" key
|
|
mock_response = {"timeSeries": [{"wrong_key": "data"}]}
|
|
url = smhi_client.fire_warning_api.format(lon=12.5553, lat=56.2006)
|
|
requests_mock.get(url, json=mock_response, status_code=200)
|
|
|
|
result = smhi_client._get_fire_warning()
|
|
|
|
assert result is False
|
|
assert "Parsing error for SMHI Fire index" in caplog.text
|