From d88cd72d133e199822af8990fe1ce629a94e2118 Mon Sep 17 00:00:00 2001 From: epenet <6771947+epenet@users.noreply.github.com> Date: Mon, 5 May 2025 11:58:24 +0200 Subject: [PATCH] Move more SamsungTV test constants to fixture files (#144249) * Add SSDP fixtures to SamsungTV * Adjust * Improve * Improve --- tests/components/samsungtv/const.py | 45 ++++------ .../fixtures/ssdp_device_main_tv_agent.json | 11 +++ .../ssdp_service_remote_control_receiver.json | 11 +++ .../ssdp_service_rendering_control.json | 11 +++ .../components/samsungtv/test_config_flow.py | 90 ++++++------------- 5 files changed, 77 insertions(+), 91 deletions(-) create mode 100644 tests/components/samsungtv/fixtures/ssdp_device_main_tv_agent.json create mode 100644 tests/components/samsungtv/fixtures/ssdp_service_remote_control_receiver.json create mode 100644 tests/components/samsungtv/fixtures/ssdp_service_rendering_control.json diff --git a/tests/components/samsungtv/const.py b/tests/components/samsungtv/const.py index 5d09087dadd..e4977a536b0 100644 --- a/tests/components/samsungtv/const.py +++ b/tests/components/samsungtv/const.py @@ -2,6 +2,7 @@ from homeassistant.components.samsungtv.const import ( CONF_SESSION_ID, + DOMAIN, METHOD_LEGACY, METHOD_WEBSOCKET, ) @@ -15,13 +16,9 @@ from homeassistant.const import ( CONF_PORT, CONF_TOKEN, ) -from homeassistant.helpers.service_info.ssdp import ( - ATTR_UPNP_FRIENDLY_NAME, - ATTR_UPNP_MANUFACTURER, - ATTR_UPNP_MODEL_NAME, - ATTR_UPNP_UDN, - SsdpServiceInfo, -) +from homeassistant.helpers.service_info.ssdp import SsdpServiceInfo + +from tests.common import load_json_object_fixture MOCK_CONFIG = { CONF_HOST: "fake_host", @@ -59,28 +56,6 @@ MOCK_ENTRY_WS_WITH_MAC = { CONF_TOKEN: "123456789", } -MOCK_SSDP_DATA_RENDERING_CONTROL_ST = SsdpServiceInfo( - ssdp_usn="mock_usn", - ssdp_st="urn:schemas-upnp-org:service:RenderingControl:1", - ssdp_location="https://fake_host:12345/test", - upnp={ - ATTR_UPNP_FRIENDLY_NAME: "[TV] fake_name", - ATTR_UPNP_MANUFACTURER: "Samsung fake_manufacturer", - ATTR_UPNP_MODEL_NAME: "fake_model", - ATTR_UPNP_UDN: "uuid:0d1cef00-00dc-1000-9c80-4844f7b172de", - }, -) -MOCK_SSDP_DATA_MAIN_TV_AGENT_ST = SsdpServiceInfo( - ssdp_usn="mock_usn", - ssdp_st="urn:samsung.com:service:MainTVAgent2:1", - ssdp_location="https://fake_host:12345/tv_agent", - upnp={ - ATTR_UPNP_FRIENDLY_NAME: "[TV] fake_name", - ATTR_UPNP_MANUFACTURER: "Samsung fake_manufacturer", - ATTR_UPNP_MODEL_NAME: "fake_model", - ATTR_UPNP_UDN: "uuid:0d1cef00-00dc-1000-9c80-4844f7b172de", - }, -) SAMPLE_DEVICE_INFO_WIFI = { "id": "uuid:be9554b9-c9fb-41f4-8920-22da015376a4", @@ -92,3 +67,15 @@ SAMPLE_DEVICE_INFO_WIFI = { "networkType": "wireless", }, } + +MOCK_SSDP_DATA = SsdpServiceInfo( + **load_json_object_fixture("ssdp_service_remote_control_receiver.json", DOMAIN) +) + +MOCK_SSDP_DATA_RENDERING_CONTROL_ST = SsdpServiceInfo( + **load_json_object_fixture("ssdp_service_rendering_control.json", DOMAIN) +) + +MOCK_SSDP_DATA_MAIN_TV_AGENT_ST = SsdpServiceInfo( + **load_json_object_fixture("ssdp_device_main_tv_agent.json", DOMAIN) +) diff --git a/tests/components/samsungtv/fixtures/ssdp_device_main_tv_agent.json b/tests/components/samsungtv/fixtures/ssdp_device_main_tv_agent.json new file mode 100644 index 00000000000..2970f14bf5f --- /dev/null +++ b/tests/components/samsungtv/fixtures/ssdp_device_main_tv_agent.json @@ -0,0 +1,11 @@ +{ + "ssdp_usn": "uuid:0d1cef00-00dc-1000-9c80-4844f7b172de::urn:samsung.com:service:MainTVAgent2:1", + "ssdp_st": "urn:samsung.com:service:MainTVAgent2:1", + "upnp": { + "friendlyName": "[TV] fake_name", + "manufacturer": "Samsung fake_manufacturer", + "modelName": "fake_model", + "UDN": "uuid:0d1cef00-00dc-1000-9c80-4844f7b172de" + }, + "ssdp_location": "https://fake_host:12345/tv_agent" +} diff --git a/tests/components/samsungtv/fixtures/ssdp_service_remote_control_receiver.json b/tests/components/samsungtv/fixtures/ssdp_service_remote_control_receiver.json new file mode 100644 index 00000000000..b2f5f27a8b4 --- /dev/null +++ b/tests/components/samsungtv/fixtures/ssdp_service_remote_control_receiver.json @@ -0,0 +1,11 @@ +{ + "ssdp_usn": "uuid:0d1cef00-00dc-1000-9c80-4844f7b172de::urn:samsung.com:device:RemoteControlReceiver:1", + "ssdp_st": "urn:samsung.com:device:RemoteControlReceiver:1", + "upnp": { + "friendlyName": "[TV] fake_name", + "manufacturer": "Samsung fake_manufacturer", + "modelName": "fake_model", + "UDN": "uuid:0d1cef00-00dc-1000-9c80-4844f7b172de" + }, + "ssdp_location": "http://fake_host:7676/smp_7_" +} diff --git a/tests/components/samsungtv/fixtures/ssdp_service_rendering_control.json b/tests/components/samsungtv/fixtures/ssdp_service_rendering_control.json new file mode 100644 index 00000000000..4074a39703e --- /dev/null +++ b/tests/components/samsungtv/fixtures/ssdp_service_rendering_control.json @@ -0,0 +1,11 @@ +{ + "ssdp_usn": "uuid:0d1cef00-00dc-1000-9c80-4844f7b172de::urn:schemas-upnp-org:service:RenderingControl:1", + "ssdp_st": "urn:schemas-upnp-org:service:RenderingControl:1", + "upnp": { + "friendlyName": "[TV] fake_name", + "manufacturer": "Samsung fake_manufacturer", + "modelName": "fake_model", + "UDN": "uuid:0d1cef00-00dc-1000-9c80-4844f7b172de" + }, + "ssdp_location": "https://fake_host:12345/test" +} diff --git a/tests/components/samsungtv/test_config_flow.py b/tests/components/samsungtv/test_config_flow.py index 12c222033e0..b15c007c109 100644 --- a/tests/components/samsungtv/test_config_flow.py +++ b/tests/components/samsungtv/test_config_flow.py @@ -51,8 +51,6 @@ from homeassistant.helpers.service_info.dhcp import DhcpServiceInfo from homeassistant.helpers.service_info.ssdp import ( ATTR_UPNP_FRIENDLY_NAME, ATTR_UPNP_MANUFACTURER, - ATTR_UPNP_MODEL_NAME, - ATTR_UPNP_UDN, SsdpServiceInfo, ) from homeassistant.helpers.service_info.zeroconf import ZeroconfServiceInfo @@ -61,6 +59,7 @@ from homeassistant.setup import async_setup_component from .const import ( MOCK_ENTRYDATA_ENCRYPTED_WS, MOCK_ENTRYDATA_WS, + MOCK_SSDP_DATA, MOCK_SSDP_DATA_MAIN_TV_AGENT_ST, MOCK_SSDP_DATA_RENDERING_CONTROL_ST, ) @@ -84,49 +83,7 @@ MOCK_IMPORT_WSDATA = { CONF_PORT: 8002, } MOCK_USER_DATA = {CONF_HOST: "fake_host", CONF_NAME: "fake_name"} -MOCK_SSDP_DATA = SsdpServiceInfo( - ssdp_usn="mock_usn", - ssdp_st="mock_st", - ssdp_location="https://fake_host:12345/test", - upnp={ - ATTR_UPNP_FRIENDLY_NAME: "[TV] fake_name", - ATTR_UPNP_MANUFACTURER: "Samsung fake_manufacturer", - ATTR_UPNP_MODEL_NAME: "fake_model", - ATTR_UPNP_UDN: "uuid:0d1cef00-00dc-1000-9c80-4844f7b172de", - }, -) -MOCK_SSDP_DATA_NO_MANUFACTURER = SsdpServiceInfo( - ssdp_usn="mock_usn", - ssdp_st="mock_st", - ssdp_location="https://fake_host:12345/test", - upnp={ - ATTR_UPNP_FRIENDLY_NAME: "[TV] fake_name", - ATTR_UPNP_UDN: "uuid:0d1cef00-00dc-1000-9c80-4844f7b172de", - }, -) -MOCK_SSDP_DATA_NOPREFIX = SsdpServiceInfo( - ssdp_usn="mock_usn", - ssdp_st="mock_st", - ssdp_location="http://fake2_host:12345/test", - upnp={ - ATTR_UPNP_FRIENDLY_NAME: "fake2_name", - ATTR_UPNP_MANUFACTURER: "Samsung fake2_manufacturer", - ATTR_UPNP_MODEL_NAME: "fake2_model", - ATTR_UPNP_UDN: "uuid:0d1cef00-00dc-1000-9c80-4844f7b172df", - }, -) -MOCK_SSDP_DATA_WRONGMODEL = SsdpServiceInfo( - ssdp_usn="mock_usn", - ssdp_st="mock_st", - ssdp_location="http://fake2_host:12345/test", - upnp={ - ATTR_UPNP_FRIENDLY_NAME: "fake2_name", - ATTR_UPNP_MANUFACTURER: "fake2_manufacturer", - ATTR_UPNP_MODEL_NAME: "HW-Qfake", - ATTR_UPNP_UDN: "uuid:0d1cef00-00dc-1000-9c80-4844f7b172df", - }, -) MOCK_DHCP_DATA = DhcpServiceInfo( ip="fake_host", macaddress="aabbccddeeff", hostname="fake_hostname" ) @@ -540,13 +497,16 @@ async def test_ssdp(hass: HomeAssistant) -> None: @pytest.mark.usefixtures("remote", "rest_api_failing") async def test_ssdp_no_manufacturer(hass: HomeAssistant) -> None: """Test starting a flow from discovery when the manufacturer data is missing.""" + ssdp_data = deepcopy(MOCK_SSDP_DATA) + ssdp_data.upnp.pop(ATTR_UPNP_MANUFACTURER) + result = await hass.config_entries.flow.async_init( DOMAIN, context={"source": config_entries.SOURCE_SSDP}, - data=MOCK_SSDP_DATA_NO_MANUFACTURER, + data=ssdp_data, ) assert result["type"] is FlowResultType.ABORT - assert result["reason"] == "not_supported" + assert result["reason"] == RESULT_NOT_SUPPORTED @pytest.mark.parametrize( @@ -566,12 +526,17 @@ async def test_ssdp_legacy_not_remote_control_receiver_udn( @pytest.mark.usefixtures("remote", "rest_api_failing") async def test_ssdp_noprefix(hass: HomeAssistant) -> None: - """Test starting a flow from discovery without prefixes.""" + """Test starting a flow from discovery when friendly name doesn't start with [TV].""" + ssdp_data = deepcopy(MOCK_SSDP_DATA) + ssdp_data.upnp[ATTR_UPNP_FRIENDLY_NAME] = ssdp_data.upnp[ATTR_UPNP_FRIENDLY_NAME][ + 4: + ] + # confirm to add the entry result = await hass.config_entries.flow.async_init( DOMAIN, context={"source": config_entries.SOURCE_SSDP}, - data=MOCK_SSDP_DATA_NOPREFIX, + data=ssdp_data, ) assert result["type"] is FlowResultType.FORM assert result["step_id"] == "confirm" @@ -580,12 +545,12 @@ async def test_ssdp_noprefix(hass: HomeAssistant) -> None: result["flow_id"], user_input="whatever" ) assert result["type"] is FlowResultType.CREATE_ENTRY - assert result["title"] == "fake2_model" - assert result["data"][CONF_HOST] == "fake2_host" - assert result["data"][CONF_NAME] == "fake2_model" - assert result["data"][CONF_MANUFACTURER] == "Samsung fake2_manufacturer" - assert result["data"][CONF_MODEL] == "fake2_model" - assert result["result"].unique_id == "0d1cef00-00dc-1000-9c80-4844f7b172df" + assert result["title"] == "fake_model" + assert result["data"][CONF_HOST] == "fake_host" + assert result["data"][CONF_NAME] == "fake_model" + assert result["data"][CONF_MANUFACTURER] == "Samsung fake_manufacturer" + assert result["data"][CONF_MODEL] == "fake_model" + assert result["result"].unique_id == "0d1cef00-00dc-1000-9c80-4844f7b172de" @pytest.mark.usefixtures("remotews", "rest_api_failing") @@ -797,14 +762,15 @@ async def test_ssdp_websocket_cannot_connect(hass: HomeAssistant) -> None: @pytest.mark.usefixtures("remote") -async def test_ssdp_model_not_supported(hass: HomeAssistant) -> None: +async def test_ssdp_wrong_manufacturer(hass: HomeAssistant) -> None: """Test starting a flow from discovery.""" - + ssdp_data = deepcopy(MOCK_SSDP_DATA) + ssdp_data.upnp[ATTR_UPNP_MANUFACTURER] = ssdp_data.upnp[ATTR_UPNP_MANUFACTURER][7:] # confirm to add the entry result = await hass.config_entries.flow.async_init( DOMAIN, context={"source": config_entries.SOURCE_SSDP}, - data=MOCK_SSDP_DATA_WRONGMODEL, + data=ssdp_data, ) assert result["type"] is FlowResultType.ABORT assert result["reason"] == RESULT_NOT_SUPPORTED @@ -1100,7 +1066,7 @@ async def test_zeroconf_ignores_soundbar(hass: HomeAssistant, rest_api: Mock) -> ) await hass.async_block_till_done() assert result["type"] is FlowResultType.ABORT - assert result["reason"] == "not_supported" + assert result["reason"] == RESULT_NOT_SUPPORTED @pytest.mark.usefixtures("remote", "remotews", "remoteencws", "rest_api_failing") @@ -1113,7 +1079,7 @@ async def test_zeroconf_no_device_info(hass: HomeAssistant) -> None: ) await hass.async_block_till_done() assert result["type"] is FlowResultType.ABORT - assert result["reason"] == "not_supported" + assert result["reason"] == RESULT_NOT_SUPPORTED @pytest.mark.usefixtures("remotews", "rest_api", "remoteencws_failing") @@ -1493,7 +1459,7 @@ async def test_update_zeroconf_discovery_preserved_unique_id( ) await hass.async_block_till_done() assert result["type"] is FlowResultType.ABORT - assert result["reason"] == "not_supported" + assert result["reason"] == RESULT_NOT_SUPPORTED assert entry.data[CONF_MAC] == "aa:bb:zz:ee:rr:oo" assert entry.unique_id == "original" @@ -1752,7 +1718,7 @@ async def test_update_legacy_missing_mac_from_dhcp_no_unique_id( assert len(mock_setup_entry.mock_calls) == 1 assert result["type"] is FlowResultType.ABORT - assert result["reason"] == "not_supported" + assert result["reason"] == RESULT_NOT_SUPPORTED assert entry.data[CONF_MAC] == "aa:bb:cc:dd:ee:ff" assert entry.unique_id is None @@ -1905,7 +1871,7 @@ async def test_form_reauth_websocket_not_supported(hass: HomeAssistant) -> None: await hass.async_block_till_done() assert result2["type"] is FlowResultType.ABORT - assert result2["reason"] == "not_supported" + assert result2["reason"] == RESULT_NOT_SUPPORTED @pytest.mark.usefixtures("remoteencws", "rest_api")