From c8b827b46bba53667fc3f20d393aed1a88d36d46 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 15 Feb 2023 12:03:48 -0600 Subject: [PATCH] Fix aprs tests with python 3.11 (#88189) * Fix aprs tests with python 3.11 * hints --- tests/components/aprs/test_device_tracker.py | 317 ++++++++++--------- 1 file changed, 160 insertions(+), 157 deletions(-) diff --git a/tests/components/aprs/test_device_tracker.py b/tests/components/aprs/test_device_tracker.py index 6aae8c986e7..858a0f041de 100644 --- a/tests/components/aprs/test_device_tracker.py +++ b/tests/components/aprs/test_device_tracker.py @@ -1,7 +1,9 @@ """Test APRS device tracker.""" -from unittest.mock import Mock, patch +from collections.abc import Generator +from unittest.mock import MagicMock, Mock, patch import aprslib +from aprslib import IS import pytest import homeassistant.components.aprs.device_tracker as device_tracker @@ -16,6 +18,13 @@ TEST_HOST = "testhost" TEST_PASSWORD = "testpass" +@pytest.fixture(name="mock_ais") +def mock_ais() -> Generator[MagicMock, None, None]: + """Mock aprslib.""" + with patch("aprslib.IS") as mock_ais: + yield mock_ais + + def test_make_filter() -> None: """Test filter.""" callsigns = ["CALLSIGN1", "callsign2"] @@ -86,35 +95,34 @@ def test_gps_accuracy_invalid_float() -> None: pass -def test_aprs_listener() -> None: +def test_aprs_listener(mock_ais: MagicMock) -> None: """Test listener thread.""" - with patch("aprslib.IS") as mock_ais: - callsign = TEST_CALLSIGN - password = TEST_PASSWORD - host = TEST_HOST - server_filter = TEST_FILTER - port = DEFAULT_PORT - see = Mock() + callsign = TEST_CALLSIGN + password = TEST_PASSWORD + host = TEST_HOST + server_filter = TEST_FILTER + port = DEFAULT_PORT + see = Mock() - listener = device_tracker.AprsListenerThread( - callsign, password, host, server_filter, see - ) - listener.run() + listener = device_tracker.AprsListenerThread( + callsign, password, host, server_filter, see + ) + listener.run() - assert listener.callsign == callsign - assert listener.host == host - assert listener.server_filter == server_filter - assert listener.see == see - assert listener.start_event.is_set() - assert listener.start_success - assert listener.start_message == "Connected to testhost with callsign testcall." - mock_ais.assert_called_with(callsign, passwd=password, host=host, port=port) + assert listener.callsign == callsign + assert listener.host == host + assert listener.server_filter == server_filter + assert listener.see == see + assert listener.start_event.is_set() + assert listener.start_success + assert listener.start_message == "Connected to testhost with callsign testcall." + mock_ais.assert_called_with(callsign, passwd=password, host=host, port=port) def test_aprs_listener_start_fail() -> None: """Test listener thread start failure.""" - with patch( - "aprslib.IS.connect", side_effect=aprslib.ConnectionError("Unable to connect.") + with patch.object( + IS, "connect", side_effect=aprslib.ConnectionError("Unable to connect.") ): callsign = TEST_CALLSIGN password = TEST_PASSWORD @@ -136,166 +144,161 @@ def test_aprs_listener_start_fail() -> None: assert listener.start_message == "Unable to connect." -def test_aprs_listener_stop() -> None: +def test_aprs_listener_stop(mock_ais: MagicMock) -> None: """Test listener thread stop.""" - with patch("aprslib.IS"): - callsign = TEST_CALLSIGN - password = TEST_PASSWORD - host = TEST_HOST - server_filter = TEST_FILTER - see = Mock() + callsign = TEST_CALLSIGN + password = TEST_PASSWORD + host = TEST_HOST + server_filter = TEST_FILTER + see = Mock() - listener = device_tracker.AprsListenerThread( - callsign, password, host, server_filter, see - ) - listener.ais.close = Mock() - listener.run() - listener.stop() + listener = device_tracker.AprsListenerThread( + callsign, password, host, server_filter, see + ) + listener.ais.close = Mock() + listener.run() + listener.stop() - assert listener.callsign == callsign - assert listener.host == host - assert listener.server_filter == server_filter - assert listener.see == see - assert listener.start_event.is_set() - assert listener.start_message == "Connected to testhost with callsign testcall." - assert listener.start_success - listener.ais.close.assert_called_with() + assert listener.callsign == callsign + assert listener.host == host + assert listener.server_filter == server_filter + assert listener.see == see + assert listener.start_event.is_set() + assert listener.start_message == "Connected to testhost with callsign testcall." + assert listener.start_success + listener.ais.close.assert_called_with() -def test_aprs_listener_rx_msg() -> None: +def test_aprs_listener_rx_msg(mock_ais: MagicMock) -> None: """Test rx_msg.""" - with patch("aprslib.IS"): - callsign = TEST_CALLSIGN - password = TEST_PASSWORD - host = TEST_HOST - server_filter = TEST_FILTER - see = Mock() + callsign = TEST_CALLSIGN + password = TEST_PASSWORD + host = TEST_HOST + server_filter = TEST_FILTER + see = Mock() - sample_msg = { - device_tracker.ATTR_FORMAT: "uncompressed", - device_tracker.ATTR_FROM: "ZZ0FOOBAR-1", - device_tracker.ATTR_LATITUDE: 0.0, - device_tracker.ATTR_LONGITUDE: 0.0, - device_tracker.ATTR_ALTITUDE: 0, - } + sample_msg = { + device_tracker.ATTR_FORMAT: "uncompressed", + device_tracker.ATTR_FROM: "ZZ0FOOBAR-1", + device_tracker.ATTR_LATITUDE: 0.0, + device_tracker.ATTR_LONGITUDE: 0.0, + device_tracker.ATTR_ALTITUDE: 0, + } - listener = device_tracker.AprsListenerThread( - callsign, password, host, server_filter, see - ) - listener.run() - listener.rx_msg(sample_msg) + listener = device_tracker.AprsListenerThread( + callsign, password, host, server_filter, see + ) + listener.run() + listener.rx_msg(sample_msg) - assert listener.callsign == callsign - assert listener.host == host - assert listener.server_filter == server_filter - assert listener.see == see - assert listener.start_event.is_set() - assert listener.start_success - assert listener.start_message == "Connected to testhost with callsign testcall." - see.assert_called_with( - dev_id=device_tracker.slugify("ZZ0FOOBAR-1"), - gps=(0.0, 0.0), - attributes={"altitude": 0}, - ) + assert listener.callsign == callsign + assert listener.host == host + assert listener.server_filter == server_filter + assert listener.see == see + assert listener.start_event.is_set() + assert listener.start_success + assert listener.start_message == "Connected to testhost with callsign testcall." + see.assert_called_with( + dev_id=device_tracker.slugify("ZZ0FOOBAR-1"), + gps=(0.0, 0.0), + attributes={"altitude": 0}, + ) -def test_aprs_listener_rx_msg_ambiguity() -> None: +def test_aprs_listener_rx_msg_ambiguity(mock_ais: MagicMock) -> None: """Test rx_msg with posambiguity.""" - with patch("aprslib.IS"): - callsign = TEST_CALLSIGN - password = TEST_PASSWORD - host = TEST_HOST - server_filter = TEST_FILTER - see = Mock() + callsign = TEST_CALLSIGN + password = TEST_PASSWORD + host = TEST_HOST + server_filter = TEST_FILTER + see = Mock() - sample_msg = { - device_tracker.ATTR_FORMAT: "uncompressed", - device_tracker.ATTR_FROM: "ZZ0FOOBAR-1", - device_tracker.ATTR_LATITUDE: 0.0, - device_tracker.ATTR_LONGITUDE: 0.0, - device_tracker.ATTR_POS_AMBIGUITY: 1, - } + sample_msg = { + device_tracker.ATTR_FORMAT: "uncompressed", + device_tracker.ATTR_FROM: "ZZ0FOOBAR-1", + device_tracker.ATTR_LATITUDE: 0.0, + device_tracker.ATTR_LONGITUDE: 0.0, + device_tracker.ATTR_POS_AMBIGUITY: 1, + } - listener = device_tracker.AprsListenerThread( - callsign, password, host, server_filter, see - ) - listener.run() - listener.rx_msg(sample_msg) + listener = device_tracker.AprsListenerThread( + callsign, password, host, server_filter, see + ) + listener.run() + listener.rx_msg(sample_msg) - assert listener.callsign == callsign - assert listener.host == host - assert listener.server_filter == server_filter - assert listener.see == see - assert listener.start_event.is_set() - assert listener.start_success - assert listener.start_message == "Connected to testhost with callsign testcall." - see.assert_called_with( - dev_id=device_tracker.slugify("ZZ0FOOBAR-1"), - gps=(0.0, 0.0), - attributes={device_tracker.ATTR_GPS_ACCURACY: 186}, - ) + assert listener.callsign == callsign + assert listener.host == host + assert listener.server_filter == server_filter + assert listener.see == see + assert listener.start_event.is_set() + assert listener.start_success + assert listener.start_message == "Connected to testhost with callsign testcall." + see.assert_called_with( + dev_id=device_tracker.slugify("ZZ0FOOBAR-1"), + gps=(0.0, 0.0), + attributes={device_tracker.ATTR_GPS_ACCURACY: 186}, + ) -def test_aprs_listener_rx_msg_ambiguity_invalid() -> None: +def test_aprs_listener_rx_msg_ambiguity_invalid(mock_ais: MagicMock) -> None: """Test rx_msg with invalid posambiguity.""" - with patch("aprslib.IS"): - callsign = TEST_CALLSIGN - password = TEST_PASSWORD - host = TEST_HOST - server_filter = TEST_FILTER - see = Mock() + callsign = TEST_CALLSIGN + password = TEST_PASSWORD + host = TEST_HOST + server_filter = TEST_FILTER + see = Mock() - sample_msg = { - device_tracker.ATTR_FORMAT: "uncompressed", - device_tracker.ATTR_FROM: "ZZ0FOOBAR-1", - device_tracker.ATTR_LATITUDE: 0.0, - device_tracker.ATTR_LONGITUDE: 0.0, - device_tracker.ATTR_POS_AMBIGUITY: 5, - } + sample_msg = { + device_tracker.ATTR_FORMAT: "uncompressed", + device_tracker.ATTR_FROM: "ZZ0FOOBAR-1", + device_tracker.ATTR_LATITUDE: 0.0, + device_tracker.ATTR_LONGITUDE: 0.0, + device_tracker.ATTR_POS_AMBIGUITY: 5, + } - listener = device_tracker.AprsListenerThread( - callsign, password, host, server_filter, see - ) - listener.run() - listener.rx_msg(sample_msg) + listener = device_tracker.AprsListenerThread( + callsign, password, host, server_filter, see + ) + listener.run() + listener.rx_msg(sample_msg) - assert listener.callsign == callsign - assert listener.host == host - assert listener.server_filter == server_filter - assert listener.see == see - assert listener.start_event.is_set() - assert listener.start_success - assert listener.start_message == "Connected to testhost with callsign testcall." - see.assert_called_with( - dev_id=device_tracker.slugify("ZZ0FOOBAR-1"), gps=(0.0, 0.0), attributes={} - ) + assert listener.callsign == callsign + assert listener.host == host + assert listener.server_filter == server_filter + assert listener.see == see + assert listener.start_event.is_set() + assert listener.start_success + assert listener.start_message == "Connected to testhost with callsign testcall." + see.assert_called_with( + dev_id=device_tracker.slugify("ZZ0FOOBAR-1"), gps=(0.0, 0.0), attributes={} + ) -def test_aprs_listener_rx_msg_no_position() -> None: +def test_aprs_listener_rx_msg_no_position(mock_ais: MagicMock) -> None: """Test rx_msg with non-position report.""" - with patch("aprslib.IS"): - callsign = TEST_CALLSIGN - password = TEST_PASSWORD - host = TEST_HOST - server_filter = TEST_FILTER - see = Mock() + callsign = TEST_CALLSIGN + password = TEST_PASSWORD + host = TEST_HOST + server_filter = TEST_FILTER + see = Mock() - sample_msg = {device_tracker.ATTR_FORMAT: "invalid"} + sample_msg = {device_tracker.ATTR_FORMAT: "invalid"} - listener = device_tracker.AprsListenerThread( - callsign, password, host, server_filter, see - ) - listener.run() - listener.rx_msg(sample_msg) + listener = device_tracker.AprsListenerThread( + callsign, password, host, server_filter, see + ) + listener.run() + listener.rx_msg(sample_msg) - assert listener.callsign == callsign - assert listener.host == host - assert listener.server_filter == server_filter - assert listener.see == see - assert listener.start_event.is_set() - assert listener.start_success - assert listener.start_message == "Connected to testhost with callsign testcall." - see.assert_not_called() + assert listener.callsign == callsign + assert listener.host == host + assert listener.server_filter == server_filter + assert listener.see == see + assert listener.start_event.is_set() + assert listener.start_success + assert listener.start_message == "Connected to testhost with callsign testcall." + see.assert_not_called() async def test_setup_scanner(hass: HomeAssistant) -> None: @@ -324,7 +327,7 @@ async def test_setup_scanner(hass: HomeAssistant) -> None: async def test_setup_scanner_timeout(hass: HomeAssistant) -> None: """Test setup_scanner failure from timeout.""" - with patch("aprslib.IS.connect", side_effect=TimeoutError): + with patch.object(IS, "connect", side_effect=TimeoutError): config = { "username": TEST_CALLSIGN, "password": TEST_PASSWORD,