from unittest import mock from oslo_config import cfg from aprsd import conf # noqa: F401 from aprsd.plugins import weather as weather_plugin from .. import fake, test_plugin CONF = cfg.CONF class TestUSWeatherPlugin(test_plugin.TestPlugin): def test_not_enabled_missing_aprs_fi_key(self): # When the aprs.fi api key isn't set, then # the LocationPlugin will be disabled. CONF.aprs_fi.apiKey = None CONF.callsign = fake.FAKE_TO_CALLSIGN wx = weather_plugin.USWeatherPlugin() expected = "USWeatherPlugin isn't enabled" packet = fake.fake_packet(message="weather") actual = wx.filter(packet) self.assertEqual(expected, actual) @mock.patch("aprsd.plugin_utils.get_aprs_fi") def test_failed_aprs_fi_location(self, mock_check): # When the aprs.fi api key isn't set, then # the Plugin will be disabled. mock_check.side_effect = Exception CONF.aprs_fi.apiKey = "abc123" CONF.callsign = fake.FAKE_TO_CALLSIGN wx = weather_plugin.USWeatherPlugin() expected = "Failed to fetch aprs.fi location" packet = fake.fake_packet(message="weather") actual = wx.filter(packet) self.assertEqual(expected, actual) @mock.patch("aprsd.plugin_utils.get_aprs_fi") def test_failed_aprs_fi_location_no_entries(self, mock_check): # When the aprs.fi api key isn't set, then # the Plugin will be disabled. mock_check.return_value = {"entries": []} CONF.aprs_fi.apiKey = "abc123" CONF.callsign = fake.FAKE_TO_CALLSIGN wx = weather_plugin.USWeatherPlugin() wx.enabled = True expected = "Failed to fetch aprs.fi location" packet = fake.fake_packet(message="weather") actual = wx.filter(packet) self.assertEqual(expected, actual) @mock.patch("aprsd.plugin_utils.get_aprs_fi") @mock.patch("aprsd.plugin_utils.get_weather_gov_for_gps") def test_unknown_gps(self, mock_weather, mock_check_aprs): # When the aprs.fi api key isn't set, then # the LocationPlugin will be disabled. mock_check_aprs.return_value = { "entries": [ { "lat": 10, "lng": 11, "lasttime": 10, }, ], } mock_weather.side_effect = Exception CONF.aprs_fi.apiKey = "abc123" CONF.callsign = fake.FAKE_TO_CALLSIGN wx = weather_plugin.USWeatherPlugin() wx.enabled = True expected = "Unable to get weather" packet = fake.fake_packet(message="weather") actual = wx.filter(packet) self.assertEqual(expected, actual) @mock.patch("aprsd.plugin_utils.get_aprs_fi") @mock.patch("aprsd.plugin_utils.get_weather_gov_for_gps") def test_working(self, mock_weather, mock_check_aprs): # When the aprs.fi api key isn't set, then # the LocationPlugin will be disabled. mock_check_aprs.return_value = { "entries": [ { "lat": 10, "lng": 11, "lasttime": 10, }, ], } mock_weather.return_value = { "currentobservation": {"Temp": "400"}, "data": { "temperature": ["10", "11"], "weather": ["test", "another"], }, "time": {"startPeriodName": ["ignored", "sometime"]}, } CONF.aprs_fi.apiKey = "abc123" CONF.callsign = fake.FAKE_TO_CALLSIGN wx = weather_plugin.USWeatherPlugin() wx.enabled = True expected = "400F(10F/11F) test. sometime, another." packet = fake.fake_packet(message="weather") actual = wx.filter(packet) self.assertEqual(expected, actual) class TestUSMetarPlugin(test_plugin.TestPlugin): def test_not_enabled_missing_aprs_fi_key(self): # When the aprs.fi api key isn't set, then # the LocationPlugin will be disabled. CONF.aprs_fi.apiKey = None wx = weather_plugin.USMetarPlugin() expected = "USMetarPlugin isn't enabled" packet = fake.fake_packet(message="metar") actual = wx.filter(packet) self.assertEqual(expected, actual) @mock.patch("aprsd.plugin_utils.get_aprs_fi") def test_failed_aprs_fi_location(self, mock_check): # When the aprs.fi api key isn't set, then # the Plugin will be disabled. mock_check.side_effect = Exception CONF.aprs_fi.apiKey = "abc123" CONF.callsign = fake.FAKE_TO_CALLSIGN wx = weather_plugin.USMetarPlugin() wx.enabled = True expected = "Failed to fetch aprs.fi location" packet = fake.fake_packet(message="metar") actual = wx.filter(packet) self.assertEqual(expected, actual) @mock.patch("aprsd.plugin_utils.get_aprs_fi") def test_failed_aprs_fi_location_no_entries(self, mock_check): # When the aprs.fi api key isn't set, then # the Plugin will be disabled. mock_check.return_value = {"entries": []} CONF.aprs_fi.apiKey = "abc123" CONF.callsign = fake.FAKE_TO_CALLSIGN wx = weather_plugin.USMetarPlugin() wx.enabled = True expected = "Failed to fetch aprs.fi location" packet = fake.fake_packet(message="metar") actual = wx.filter(packet) self.assertEqual(expected, actual) @mock.patch("aprsd.plugin_utils.get_weather_gov_metar") def test_gov_metar_fetch_fails(self, mock_metar): mock_metar.side_effect = Exception CONF.aprs_fi.apiKey = "abc123" CONF.callsign = fake.FAKE_TO_CALLSIGN wx = weather_plugin.USMetarPlugin() wx.enabled = True expected = "Unable to find station METAR" packet = fake.fake_packet(message="metar KPAO") actual = wx.filter(packet) self.assertEqual(expected, actual) @mock.patch("aprsd.plugin_utils.get_weather_gov_metar") def test_airport_works(self, mock_metar): class Response: text = '{"properties": {"rawMessage": "BOGUSMETAR"}}' mock_metar.return_value = Response() CONF.aprs_fi.apiKey = "abc123" CONF.callsign = fake.FAKE_TO_CALLSIGN wx = weather_plugin.USMetarPlugin() wx.enabled = True expected = "BOGUSMETAR" packet = fake.fake_packet(message="metar KPAO") actual = wx.filter(packet) self.assertEqual(expected, actual) @mock.patch("aprsd.plugin_utils.get_weather_gov_metar") @mock.patch("aprsd.plugin_utils.get_aprs_fi") @mock.patch("aprsd.plugin_utils.get_weather_gov_for_gps") def test_metar_works(self, mock_wx_for_gps, mock_check_aprs, mock_metar): mock_wx_for_gps.return_value = { "location": {"metar": "BOGUSMETAR"}, } class Response: text = '{"properties": {"rawMessage": "BOGUSMETAR"}}' mock_check_aprs.return_value = { "entries": [ { "lat": 10, "lng": 11, "lasttime": 10, }, ], } mock_metar.return_value = Response() CONF.aprs_fi.apiKey = "abc123" CONF.callsign = fake.FAKE_TO_CALLSIGN wx = weather_plugin.USMetarPlugin() wx.enabled = True expected = "BOGUSMETAR" packet = fake.fake_packet(message="metar") actual = wx.filter(packet) self.assertEqual(expected, actual)