diff --git a/homeassistant/components/nina/manifest.json b/homeassistant/components/nina/manifest.json index 3f40668fdd5..7c45d193bbc 100644 --- a/homeassistant/components/nina/manifest.json +++ b/homeassistant/components/nina/manifest.json @@ -4,7 +4,7 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/nina", "requirements": [ - "pynina==0.1.5" + "pynina==0.1.7" ], "dependencies": [], "codeowners": [ diff --git a/requirements_all.txt b/requirements_all.txt index c6fa19cea2d..100e1c7bcc9 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1706,7 +1706,7 @@ pynetgear==0.9.1 pynetio==0.1.9.1 # homeassistant.components.nina -pynina==0.1.5 +pynina==0.1.7 # homeassistant.components.nuki pynuki==1.5.2 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index b4225458e8c..876d70eb1a6 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -1087,7 +1087,7 @@ pymysensors==0.22.1 pynetgear==0.9.1 # homeassistant.components.nina -pynina==0.1.5 +pynina==0.1.7 # homeassistant.components.nuki pynuki==1.5.2 diff --git a/tests/components/nina/__init__.py b/tests/components/nina/__init__.py index 92697378293..d6c9fffdfa7 100644 --- a/tests/components/nina/__init__.py +++ b/tests/components/nina/__init__.py @@ -1 +1,25 @@ """Tests for the Nina integration.""" +import json +from typing import Any + +from tests.common import load_fixture + + +def mocked_request_function(url: str) -> dict[str, Any]: + """Mock of the request function.""" + dummy_response: dict[str, Any] = json.loads( + load_fixture("sample_warnings.json", "nina") + ) + + dummy_response_details: dict[str, Any] = json.loads( + load_fixture("sample_warning_details.json", "nina") + ) + + if url == "https://warnung.bund.de/api31/dashboard/083350000000.json": + return dummy_response + + warning_id = url.replace("https://warnung.bund.de/api31/warnings/", "").replace( + ".json", "" + ) + + return dummy_response_details[warning_id] diff --git a/tests/components/nina/fixtures/sample_warning_details.json b/tests/components/nina/fixtures/sample_warning_details.json new file mode 100644 index 00000000000..61c28dc9992 --- /dev/null +++ b/tests/components/nina/fixtures/sample_warning_details.json @@ -0,0 +1,167 @@ +{ + "mow.DE-BW-S-SE018-20211102-18-001": { + "identifier": "mow.DE-BW-S-SE018-20211102-18-001", + "sender": "DE-NW-BN-SE030", + "sent": "2021-11-02T20:07:16+01:00", + "status": "Actual", + "msgType": "Update", + "scope": "Public", + "code": [ + "DVN:1", + "medien_ueberregional", + "nina", + "Materna:noPush", + "Materna:noMirror" + ], + "references": "DE-NW-BN-SE030-20200506-30-001 DE-NW-BN-SE030-20200422-30-000 DE-NW-BN-SE030-20200420-30-001 DE-NW-BN-SE030-20200416-30-001 DE-NW-BN-SE030-20200403-30-000 DE-NW-BN-W003,mow.DE-NW-BN-SE030-20200506-30-001 mow.DE-NW-BN-SE030-20200422-30-000 mow.DE-NW-BN-SE030-20200420-30-001 mow.DE-NW-BN-SE030-20200416-30-001 mow.DE-NW-BN-SE030-20200403-30-000 mow.DE-NW-BN-W003-20200403-000,2020-04-03T00:00:00+00:00", + "info": [ + { + "language": "DE", + "category": [ + "Health" + ], + "event": "Gefahreninformation", + "urgency": "Immediate", + "severity": "Minor", + "certainty": "Observed", + "eventCode": [ + { + "valueName": "profile:DE-BBK-EVENTCODE", + "value": "BBK-EVC-040" + } + ], + "headline": "Corona-Verordnung des Landes: Warnstufe durch Landesgesundheitsamt ausgerufen", + "description": "Die Zahl der mit dem Corona-Virus infizierten Menschen steigt gegenwärtig stark an. Es wächst daher die Gefahr einer weiteren Verbreitung der Infektion und - je nach Einzelfall - auch von schweren Erkrankungen.", + "instruction": "Waschen Sie sich regelmäßig und gründlich die Hände.
- Beachten Sie die AHA + A + L - Regeln:
Abstand halten - 1,5 m Mindestabstand beachten, Körperkontakt vermeiden!
Hygiene - regelmäßiges Händewaschen, Husten- und Nieshygiene beachten!
Alltagsmaske (Mund-Nase-Bedeckung) tragen!
App - installieren und nutzen Sie die Corona-Warn-App!
Lüften: Sorgen Sie für eine regelmäßige und gründliche Lüftung von Räumen - auch und gerade in der kommenden kalten Jahreszeit!
- Bitte folgen Sie den behördlichen Anordnungen.
- Husten und niesen Sie in ein Taschentuch oder in die Armbeuge.
- Bleiben Sie bei Erkältungssymptomen nach Möglichkeit zu Hause. Kontaktieren Sie Ihre Hausarztpraxis per Telefon oder wenden sich an die Telefonnummer 116117 des Ärztlichen Bereitschaftsdienstes und besprechen Sie das weitere Vorgehen. Gehen Sie nicht unaufgefordert in eine Arztpraxis oder ins Krankenhaus.
- Seien Sie kritisch: Informieren Sie sich nur aus gesicherten Quellen.", + "contact": "Weitere Informationen und Empfehlungen finden Sie im Corona-Informations-Bereich der Warn-App NINA. Beachten Sie auch die Internetseiten der örtlichen Gesundheitsbehörde (Stadt- bzw. Kreisverwaltung) Ihres Aufenthaltsortes", + "parameter": [ + { + "valueName": "instructionText", + "value": "- Beachten Sie die AHA + A + L - Regeln:\nAbstand halten - 1,5 m Mindestabstand beachten, Körperkontakt vermeiden! \nHygiene - regelmäßiges Händewaschen, Husten- und Nieshygiene beachten! \nAlltagsmaske (Mund-Nase-Bedeckung) tragen! \nApp - installieren und nutzen Sie die Corona-Warn-App! \nLüften: Sorgen Sie für eine regelmäßige und gründliche Lüftung von Räumen - auch und gerade in der kommenden kalten Jahreszeit! \n- Bitte folgen Sie den behördlichen Anordnungen. \n- Husten und niesen Sie in ein Taschentuch oder in die Armbeuge. \n- Bleiben Sie bei Erkältungssymptomen nach Möglichkeit zu Hause. Kontaktieren Sie Ihre Hausarztpraxis per Telefon oder wenden sich an die Telefonnummer 116117 des Ärztlichen Bereitschaftsdienstes und besprechen Sie das weitere Vorgehen. Gehen Sie nicht unaufgefordert in eine Arztpraxis oder ins Krankenhaus. \n- Seien Sie kritisch: Informieren Sie sich nur aus gesicherten Quellen." + }, + { + "valueName": "warnVerwaltungsbereiche", + "value": "130000000000,140000000000,160000000000,110000000000,020000000000,070000000000,030000000000,050000000000,080000000000,120000000000,010000000000,150000000000,040000000000,060000000000,090000000000,100000000000" + }, + { + "valueName": "instructionCode", + "value": "BBK-ISC-132" + }, + { + "valueName": "sender_langname", + "value": "BBK, Nationale Warnzentrale Bonn" + }, + { + "valueName": "sender_signature", + "value": "Bundesamt für Bevölkerungsschutz und Katastrophenhilfe\nNationale Warnzentrale Bonn\nhttps://warnung.bund.de" + }, + { + "valueName": "PHGEM", + "value": "1+11057,100001" + }, + { + "valueName": "ZGEM", + "value": "1+11057,100001" + } + ], + "area": [ + { + "areaDesc": "Bundesland: Freie Hansestadt Bremen, Land Berlin, Land Hessen, Land Nordrhein-Westfalen, Land Brandenburg, Freistaat Bayern, Land Mecklenburg-Vorpommern, Land Rheinland-Pfalz, Freistaat Sachsen, Land Schleswig-Holstein, Freie und Hansestadt Hamburg, Freistaat Thüringen, Land Niedersachsen, Land Saarland, Land Sachsen-Anhalt, Land Baden-Württemberg", + "geocode": [ + { + "valueName": "AreaId", + "value": "0" + } + ] + } + ] + } + ] + }, + "mow.DE-NW-BN-SE030-20201014-30-000" : { + "identifier": "mow.DE-NW-BN-SE030-20201014-30-000", + "sender": "opendata@dwd.de", + "sent": "2021-10-11T05:20:00+01:00", + "status": "Actual", + "msgType": "Alert", + "source": "PVW", + "scope": "Public", + "code": [ + "DVN:2", + "id:2.49.0.0.276.0.DWD.PVW.1645004040000.5a168da8-ac20-4b6d-86be-d616526a7914" + ], + "info": [ + { + "language": "de-DE", + "category": [ + "Met" + ], + "event": "STURMBÖEN", + "responseType": [ + "Prepare" + ], + "urgency": "Immediate", + "severity": "Moderate", + "certainty": "Likely", + "eventCode": [ + { + "valueName": "PROFILE_VERSION", + "value": "2.1.11" + }, + { + "valueName": "LICENSE", + "value": "© GeoBasis-DE / BKG 2019 (Daten modifiziert)" + }, + { + "valueName": "II", + "value": "52" + }, + { + "valueName": "GROUP", + "value": "WIND" + }, + { + "valueName": "AREA_COLOR", + "value": "251 140 0" + } + ], + "effective": "2021-11-01T03:20:00+01:00", + "onset": "2021-11-01T05:20:00+01:00", + "expires": "3021-11-22T05:19:00+01:00", + "senderName": "Deutscher Wetterdienst", + "headline": "Ausfall Notruf 112", + "description": "Es treten Sturmböen mit Geschwindigkeiten zwischen 70 km/h (20m/s, 38kn, Bft 8) und 85 km/h (24m/s, 47kn, Bft 9) aus westlicher Richtung auf. In Schauernähe sowie in exponierten Lagen muss mit schweren Sturmböen bis 90 km/h (25m/s, 48kn, Bft 10) gerechnet werden.", + "instruction": "ACHTUNG! Hinweis auf mögliche Gefahren: Es können zum Beispiel einzelne Äste herabstürzen. Achten Sie besonders auf herabfallende Gegenstände.", + "web": "https://www.wettergefahren.de", + "contact": "Deutscher Wetterdienst", + "parameter": [ + { + "valueName": "gusts", + "value": "70-85 [km/h]" + }, + { + "valueName": "exposed gusts", + "value": "<90 [km/h]" + }, + { + "valueName": "wind direction", + "value": "west" + }, + { + "valueName": "PHGEM", + "value": "3243+168,3413+1,3424+52,3478+1,3495+2,3499,3639+2527,6168+1,6175+22,6199+36,6238,6241+7,6256,9956+184,10142,10154,10164+7,10173,10176+6,10186+1,10195+2,10199,10201+6,10214+4,10220,10249+117,10368,10373+2,10425+9,10436+1,10440+8,10450+1,10453+7,10462+1,10467+5,10474+2,10484+5,10773+68,10843+2,10847+9,10858,10867+8,10878+1,10882+68,10952+7,10961+2,11046,11056+1" + }, + { + "valueName": "ZGEM", + "value": "3243+168,3413+1,3424+52,3478+1,3495+2,3499,3639+2527,6168+1,6175+22,6199+36,6238,6241+7,6256,9956+184,10142,10154,10164+7,10173,10176+6,10186+1,10195+2,10199,10201+6,10214+4,10220,10249+117,10368,10373+2,10425+9,10436+1,10440+8,10450+1,10453+7,10462+1,10467+5,10474+2,10484+5,10773+68,10843+2,10847+9,10858,10867+8,10878+1,10882+68,10952+7,10961+2,11046,11056+1" + } + ], + "area": [ + { + "areaDesc": "Gemeinde Oberreichenbach, Gemeinde Neuweiler, Stadt Nagold, Stadt Neubulach, Gemeinde Schömberg, Gemeinde Simmersfeld, Gemeinde Simmozheim, Gemeinde Rohrdorf, Gemeinde Ostelsheim, Gemeinde Ebhausen, Gemeinde Egenhausen, Gemeinde Dobel, Stadt Bad Liebenzell, Stadt Solingen, Stadt Haiterbach, Stadt Bad Herrenalb, Gemeinde Höfen an der Enz, Gemeinde Gechingen, Gemeinde Enzklösterle, Gemeinde Gutach (Schwarzwaldbahn) und 3392 weitere." + } + ] + } + ] + } +} \ No newline at end of file diff --git a/tests/components/nina/fixtures/sample_warnings.json b/tests/components/nina/fixtures/sample_warnings.json index d53fecffa63..b49e436ef8b 100644 --- a/tests/components/nina/fixtures/sample_warnings.json +++ b/tests/components/nina/fixtures/sample_warnings.json @@ -37,7 +37,7 @@ } }, "i18nTitle": {"de": "Ausfall Notruf 112"}, - "start": "2021-11-01T05:20:00+01:00", + "onset": "2021-11-01T05:20:00+01:00", "sent": "2021-10-11T05:20:00+01:00", "expires": "3021-11-22T05:19:00+01:00" } diff --git a/tests/components/nina/test_binary_sensor.py b/tests/components/nina/test_binary_sensor.py index ebdd7ed4105..d0a65e190f0 100644 --- a/tests/components/nina/test_binary_sensor.py +++ b/tests/components/nina/test_binary_sensor.py @@ -1,5 +1,4 @@ """Test the Nina binary sensor.""" -import json from typing import Any from unittest.mock import patch @@ -17,7 +16,9 @@ from homeassistant.const import STATE_OFF, STATE_ON from homeassistant.core import HomeAssistant from homeassistant.helpers import entity_registry as er -from tests.common import MockConfigEntry, load_fixture +from . import mocked_request_function + +from tests.common import MockConfigEntry ENTRY_DATA: dict[str, Any] = { "slots": 5, @@ -35,13 +36,9 @@ ENTRY_DATA_NO_CORONA: dict[str, Any] = { async def test_sensors(hass: HomeAssistant) -> None: """Test the creation and values of the NINA sensors.""" - dummy_response: dict[str, Any] = json.loads( - load_fixture("sample_warnings.json", "nina") - ) - with patch( "pynina.baseApi.BaseAPI._makeRequest", - return_value=dummy_response, + wraps=mocked_request_function, ): conf_entry: MockConfigEntry = MockConfigEntry( @@ -125,13 +122,9 @@ async def test_sensors(hass: HomeAssistant) -> None: async def test_sensors_without_corona_filter(hass: HomeAssistant) -> None: """Test the creation and values of the NINA sensors without the corona filter.""" - dummy_response: dict[str, Any] = json.loads( - load_fixture("nina/sample_warnings.json") - ) - with patch( "pynina.baseApi.BaseAPI._makeRequest", - return_value=dummy_response, + wraps=mocked_request_function, ): conf_entry: MockConfigEntry = MockConfigEntry( diff --git a/tests/components/nina/test_init.py b/tests/components/nina/test_init.py index 455d7465a87..66e8edb2806 100644 --- a/tests/components/nina/test_init.py +++ b/tests/components/nina/test_init.py @@ -1,5 +1,4 @@ """Test the Nina init file.""" -import json from typing import Any from unittest.mock import patch @@ -10,7 +9,9 @@ from homeassistant.config_entries import ConfigEntryState from homeassistant.core import HomeAssistant from homeassistant.setup import async_setup_component -from tests.common import MockConfigEntry, load_fixture +from . import mocked_request_function + +from tests.common import MockConfigEntry ENTRY_DATA: dict[str, Any] = { "slots": 5, @@ -22,13 +23,9 @@ ENTRY_DATA: dict[str, Any] = { async def init_integration(hass) -> MockConfigEntry: """Set up the NINA integration in Home Assistant.""" - dummy_response: dict[str, Any] = json.loads( - load_fixture("sample_warnings.json", "nina") - ) - with patch( "pynina.baseApi.BaseAPI._makeRequest", - return_value=dummy_response, + wraps=mocked_request_function, ): entry: MockConfigEntry = MockConfigEntry(