Improve handling of call deflection switches in AVM Fritz!Tools (#127592)

improve handling of call_deflection switches
This commit is contained in:
Michael 2024-10-05 19:16:34 +02:00 committed by GitHub
parent c28edb1117
commit c043142b86
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 181 additions and 37 deletions

View file

@ -46,9 +46,7 @@ async def _async_deflection_entities_list(
_LOGGER.debug("Setting up %s switches", SWITCH_TYPE_DEFLECTION) _LOGGER.debug("Setting up %s switches", SWITCH_TYPE_DEFLECTION)
if ( if not (call_deflections := avm_wrapper.data["call_deflections"]):
call_deflections := avm_wrapper.data.get("call_deflections")
) is None or not isinstance(call_deflections, dict):
_LOGGER.debug("The FRITZ!Box has no %s options", SWITCH_TYPE_DEFLECTION) _LOGGER.debug("The FRITZ!Box has no %s options", SWITCH_TYPE_DEFLECTION)
return [] return []
@ -72,7 +70,7 @@ async def _async_port_entities_list(
# Query port forwardings and setup a switch for each forward for the current device # Query port forwardings and setup a switch for each forward for the current device
resp = await avm_wrapper.async_get_num_port_mapping(avm_wrapper.device_conn_type) resp = await avm_wrapper.async_get_num_port_mapping(avm_wrapper.device_conn_type)
if not resp: if not resp:
_LOGGER.debug("The FRITZ!Box has no %s options", SWITCH_TYPE_DEFLECTION) _LOGGER.debug("The FRITZ!Box has no %s options", SWITCH_TYPE_PORTFORWARD)
return [] return []
port_forwards_count: int = resp["NewPortMappingNumberOfEntries"] port_forwards_count: int = resp["NewPortMappingNumberOfEntries"]

View file

@ -904,6 +904,14 @@ MOCK_HOST_ATTRIBUTES_DATA = [
}, },
] ]
MOCK_CALL_DEFLECTION_DATA = {
"X_AVM-DE_OnTel1": {
"GetDeflections": {
"NewDeflectionList": "<List><Item><DeflectionId>0</DeflectionId><Enable>0</Enable><Type>fromAll</Type><Number></Number><DeflectionToNumber>+1234657890</DeflectionToNumber><Mode>eImmediately</Mode><Outgoing></Outgoing><PhonebookID></PhonebookID></Item></List>"
}
}
}
MOCK_USER_DATA = MOCK_CONFIG[DOMAIN][CONF_DEVICES][0] MOCK_USER_DATA = MOCK_CONFIG[DOMAIN][CONF_DEVICES][0]
MOCK_USER_INPUT_ADVANCED = MOCK_USER_DATA MOCK_USER_INPUT_ADVANCED = MOCK_USER_DATA
MOCK_USER_INPUT_SIMPLE = { MOCK_USER_INPUT_SIMPLE = {

View file

@ -1,5 +1,5 @@
# serializer version: 1 # serializer version: 1
# name: test_switch_setup[fc_data0-expected_wifi_names0][switch.mock_title_wi_fi_wifi_2_4ghz-entry] # name: test_switch_setup[fc_data0][switch.mock_title_wi_fi_wifi_2_4ghz-entry]
EntityRegistryEntrySnapshot({ EntityRegistryEntrySnapshot({
'aliases': set({ 'aliases': set({
}), }),
@ -32,7 +32,7 @@
'unit_of_measurement': None, 'unit_of_measurement': None,
}) })
# --- # ---
# name: test_switch_setup[fc_data0-expected_wifi_names0][switch.mock_title_wi_fi_wifi_2_4ghz-state] # name: test_switch_setup[fc_data0][switch.mock_title_wi_fi_wifi_2_4ghz-state]
StateSnapshot({ StateSnapshot({
'attributes': ReadOnlyDict({ 'attributes': ReadOnlyDict({
'friendly_name': 'Mock Title Wi-Fi WiFi (2.4Ghz)', 'friendly_name': 'Mock Title Wi-Fi WiFi (2.4Ghz)',
@ -46,7 +46,7 @@
'state': 'on', 'state': 'on',
}) })
# --- # ---
# name: test_switch_setup[fc_data0-expected_wifi_names0][switch.mock_title_wi_fi_wifi_5ghz-entry] # name: test_switch_setup[fc_data0][switch.mock_title_wi_fi_wifi_5ghz-entry]
EntityRegistryEntrySnapshot({ EntityRegistryEntrySnapshot({
'aliases': set({ 'aliases': set({
}), }),
@ -79,7 +79,7 @@
'unit_of_measurement': None, 'unit_of_measurement': None,
}) })
# --- # ---
# name: test_switch_setup[fc_data0-expected_wifi_names0][switch.mock_title_wi_fi_wifi_5ghz-state] # name: test_switch_setup[fc_data0][switch.mock_title_wi_fi_wifi_5ghz-state]
StateSnapshot({ StateSnapshot({
'attributes': ReadOnlyDict({ 'attributes': ReadOnlyDict({
'friendly_name': 'Mock Title Wi-Fi WiFi (5Ghz)', 'friendly_name': 'Mock Title Wi-Fi WiFi (5Ghz)',
@ -93,7 +93,7 @@
'state': 'on', 'state': 'on',
}) })
# --- # ---
# name: test_switch_setup[fc_data0-expected_wifi_names0][switch.printer_internet_access-entry] # name: test_switch_setup[fc_data0][switch.printer_internet_access-entry]
EntityRegistryEntrySnapshot({ EntityRegistryEntrySnapshot({
'aliases': set({ 'aliases': set({
}), }),
@ -126,7 +126,7 @@
'unit_of_measurement': None, 'unit_of_measurement': None,
}) })
# --- # ---
# name: test_switch_setup[fc_data0-expected_wifi_names0][switch.printer_internet_access-state] # name: test_switch_setup[fc_data0][switch.printer_internet_access-state]
StateSnapshot({ StateSnapshot({
'attributes': ReadOnlyDict({ 'attributes': ReadOnlyDict({
'friendly_name': 'printer Internet Access', 'friendly_name': 'printer Internet Access',
@ -140,7 +140,7 @@
'state': 'on', 'state': 'on',
}) })
# --- # ---
# name: test_switch_setup[fc_data1-expected_wifi_names1][switch.mock_title_wi_fi_wifi-entry] # name: test_switch_setup[fc_data1][switch.mock_title_wi_fi_wifi-entry]
EntityRegistryEntrySnapshot({ EntityRegistryEntrySnapshot({
'aliases': set({ 'aliases': set({
}), }),
@ -173,7 +173,7 @@
'unit_of_measurement': None, 'unit_of_measurement': None,
}) })
# --- # ---
# name: test_switch_setup[fc_data1-expected_wifi_names1][switch.mock_title_wi_fi_wifi-state] # name: test_switch_setup[fc_data1][switch.mock_title_wi_fi_wifi-state]
StateSnapshot({ StateSnapshot({
'attributes': ReadOnlyDict({ 'attributes': ReadOnlyDict({
'friendly_name': 'Mock Title Wi-Fi WiFi', 'friendly_name': 'Mock Title Wi-Fi WiFi',
@ -187,7 +187,7 @@
'state': 'on', 'state': 'on',
}) })
# --- # ---
# name: test_switch_setup[fc_data1-expected_wifi_names1][switch.mock_title_wi_fi_wifi2-entry] # name: test_switch_setup[fc_data1][switch.mock_title_wi_fi_wifi2-entry]
EntityRegistryEntrySnapshot({ EntityRegistryEntrySnapshot({
'aliases': set({ 'aliases': set({
}), }),
@ -220,7 +220,7 @@
'unit_of_measurement': None, 'unit_of_measurement': None,
}) })
# --- # ---
# name: test_switch_setup[fc_data1-expected_wifi_names1][switch.mock_title_wi_fi_wifi2-state] # name: test_switch_setup[fc_data1][switch.mock_title_wi_fi_wifi2-state]
StateSnapshot({ StateSnapshot({
'attributes': ReadOnlyDict({ 'attributes': ReadOnlyDict({
'friendly_name': 'Mock Title Wi-Fi WiFi2', 'friendly_name': 'Mock Title Wi-Fi WiFi2',
@ -234,7 +234,7 @@
'state': 'on', 'state': 'on',
}) })
# --- # ---
# name: test_switch_setup[fc_data1-expected_wifi_names1][switch.printer_internet_access-entry] # name: test_switch_setup[fc_data1][switch.printer_internet_access-entry]
EntityRegistryEntrySnapshot({ EntityRegistryEntrySnapshot({
'aliases': set({ 'aliases': set({
}), }),
@ -267,7 +267,7 @@
'unit_of_measurement': None, 'unit_of_measurement': None,
}) })
# --- # ---
# name: test_switch_setup[fc_data1-expected_wifi_names1][switch.printer_internet_access-state] # name: test_switch_setup[fc_data1][switch.printer_internet_access-state]
StateSnapshot({ StateSnapshot({
'attributes': ReadOnlyDict({ 'attributes': ReadOnlyDict({
'friendly_name': 'printer Internet Access', 'friendly_name': 'printer Internet Access',
@ -281,7 +281,7 @@
'state': 'on', 'state': 'on',
}) })
# --- # ---
# name: test_switch_setup[fc_data2-expected_wifi_names2][switch.mock_title_wi_fi_wifi_2_4ghz-entry] # name: test_switch_setup[fc_data2][switch.mock_title_wi_fi_wifi_2_4ghz-entry]
EntityRegistryEntrySnapshot({ EntityRegistryEntrySnapshot({
'aliases': set({ 'aliases': set({
}), }),
@ -314,7 +314,7 @@
'unit_of_measurement': None, 'unit_of_measurement': None,
}) })
# --- # ---
# name: test_switch_setup[fc_data2-expected_wifi_names2][switch.mock_title_wi_fi_wifi_2_4ghz-state] # name: test_switch_setup[fc_data2][switch.mock_title_wi_fi_wifi_2_4ghz-state]
StateSnapshot({ StateSnapshot({
'attributes': ReadOnlyDict({ 'attributes': ReadOnlyDict({
'friendly_name': 'Mock Title Wi-Fi WiFi (2.4Ghz)', 'friendly_name': 'Mock Title Wi-Fi WiFi (2.4Ghz)',
@ -328,7 +328,7 @@
'state': 'on', 'state': 'on',
}) })
# --- # ---
# name: test_switch_setup[fc_data2-expected_wifi_names2][switch.mock_title_wi_fi_wifi_5ghz-entry] # name: test_switch_setup[fc_data2][switch.mock_title_wi_fi_wifi_5ghz-entry]
EntityRegistryEntrySnapshot({ EntityRegistryEntrySnapshot({
'aliases': set({ 'aliases': set({
}), }),
@ -361,7 +361,7 @@
'unit_of_measurement': None, 'unit_of_measurement': None,
}) })
# --- # ---
# name: test_switch_setup[fc_data2-expected_wifi_names2][switch.mock_title_wi_fi_wifi_5ghz-state] # name: test_switch_setup[fc_data2][switch.mock_title_wi_fi_wifi_5ghz-state]
StateSnapshot({ StateSnapshot({
'attributes': ReadOnlyDict({ 'attributes': ReadOnlyDict({
'friendly_name': 'Mock Title Wi-Fi WiFi+ (5Ghz)', 'friendly_name': 'Mock Title Wi-Fi WiFi+ (5Ghz)',
@ -375,7 +375,7 @@
'state': 'on', 'state': 'on',
}) })
# --- # ---
# name: test_switch_setup[fc_data2-expected_wifi_names2][switch.printer_internet_access-entry] # name: test_switch_setup[fc_data2][switch.printer_internet_access-entry]
EntityRegistryEntrySnapshot({ EntityRegistryEntrySnapshot({
'aliases': set({ 'aliases': set({
}), }),
@ -408,7 +408,154 @@
'unit_of_measurement': None, 'unit_of_measurement': None,
}) })
# --- # ---
# name: test_switch_setup[fc_data2-expected_wifi_names2][switch.printer_internet_access-state] # name: test_switch_setup[fc_data2][switch.printer_internet_access-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'friendly_name': 'printer Internet Access',
'icon': 'mdi:router-wireless-settings',
}),
'context': <ANY>,
'entity_id': 'switch.printer_internet_access',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'on',
})
# ---
# name: test_switch_setup[fc_data3][switch.mock_title_call_deflection_0-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': None,
'config_entry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'switch',
'entity_category': <EntityCategory.CONFIG: 'config'>,
'entity_id': 'switch.mock_title_call_deflection_0',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
'original_device_class': None,
'original_icon': 'mdi:phone-forward',
'original_name': 'Call deflection 0',
'platform': 'fritz',
'previous_unique_id': None,
'supported_features': 0,
'translation_key': None,
'unique_id': '1C:ED:6F:12:34:11-call_deflection_0',
'unit_of_measurement': None,
})
# ---
# name: test_switch_setup[fc_data3][switch.mock_title_call_deflection_0-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'deflection_to_number': '+1234657890',
'friendly_name': 'Mock Title Call deflection 0',
'icon': 'mdi:phone-forward',
'mode': 'Immediately',
'number': None,
'outgoing': None,
'phonebook_id': None,
'type': 'fromAll',
}),
'context': <ANY>,
'entity_id': 'switch.mock_title_call_deflection_0',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'off',
})
# ---
# name: test_switch_setup[fc_data3][switch.mock_title_wi_fi_mywifi-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': None,
'config_entry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'switch',
'entity_category': <EntityCategory.CONFIG: 'config'>,
'entity_id': 'switch.mock_title_wi_fi_mywifi',
'has_entity_name': False,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
'original_device_class': None,
'original_icon': 'mdi:wifi',
'original_name': 'Mock Title Wi-Fi MyWifi',
'platform': 'fritz',
'previous_unique_id': None,
'supported_features': 0,
'translation_key': None,
'unique_id': '1C:ED:6F:12:34:11-wi_fi_mywifi',
'unit_of_measurement': None,
})
# ---
# name: test_switch_setup[fc_data3][switch.mock_title_wi_fi_mywifi-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'friendly_name': 'Mock Title Wi-Fi MyWifi',
'icon': 'mdi:wifi',
}),
'context': <ANY>,
'entity_id': 'switch.mock_title_wi_fi_mywifi',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'on',
})
# ---
# name: test_switch_setup[fc_data3][switch.printer_internet_access-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': None,
'config_entry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'switch',
'entity_category': <EntityCategory.CONFIG: 'config'>,
'entity_id': 'switch.printer_internet_access',
'has_entity_name': False,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
'original_device_class': None,
'original_icon': 'mdi:router-wireless-settings',
'original_name': 'printer Internet Access',
'platform': 'fritz',
'previous_unique_id': None,
'supported_features': 0,
'translation_key': None,
'unique_id': 'AA:BB:CC:00:11:22_internet_access',
'unit_of_measurement': None,
})
# ---
# name: test_switch_setup[fc_data3][switch.printer_internet_access-state]
StateSnapshot({ StateSnapshot({
'attributes': ReadOnlyDict({ 'attributes': ReadOnlyDict({
'friendly_name': 'printer Internet Access', 'friendly_name': 'printer Internet Access',

View file

@ -12,7 +12,7 @@ from homeassistant.const import Platform
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers import entity_registry as er from homeassistant.helpers import entity_registry as er
from .const import MOCK_FB_SERVICES, MOCK_USER_DATA from .const import MOCK_CALL_DEFLECTION_DATA, MOCK_FB_SERVICES, MOCK_USER_DATA
from tests.common import MockConfigEntry, snapshot_platform from tests.common import MockConfigEntry, snapshot_platform
@ -169,24 +169,18 @@ MOCK_WLANCONFIGS_DIFF2_SSID: dict[str, dict] = {
@pytest.mark.parametrize( @pytest.mark.parametrize(
("fc_data", "expected_wifi_names"), ("fc_data"),
[ [
( ({**MOCK_FB_SERVICES, **MOCK_WLANCONFIGS_SAME_SSID}),
{**MOCK_FB_SERVICES, **MOCK_WLANCONFIGS_SAME_SSID}, ({**MOCK_FB_SERVICES, **MOCK_WLANCONFIGS_DIFF_SSID}),
["WiFi (2.4Ghz)", "WiFi (5Ghz)"], ({**MOCK_FB_SERVICES, **MOCK_WLANCONFIGS_DIFF2_SSID}),
), ({**MOCK_FB_SERVICES, **MOCK_CALL_DEFLECTION_DATA}),
({**MOCK_FB_SERVICES, **MOCK_WLANCONFIGS_DIFF_SSID}, ["WiFi", "WiFi2"]),
(
{**MOCK_FB_SERVICES, **MOCK_WLANCONFIGS_DIFF2_SSID},
["WiFi (2.4Ghz)", "WiFi+ (5Ghz)"],
),
], ],
) )
@pytest.mark.usefixtures("entity_registry_enabled_by_default") @pytest.mark.usefixtures("entity_registry_enabled_by_default")
async def test_switch_setup( async def test_switch_setup(
hass: HomeAssistant, hass: HomeAssistant,
entity_registry: er.EntityRegistry, entity_registry: er.EntityRegistry,
expected_wifi_names: list[str],
fc_class_mock, fc_class_mock,
fh_class_mock, fh_class_mock,
snapshot: SnapshotAssertion, snapshot: SnapshotAssertion,
@ -199,7 +193,4 @@ async def test_switch_setup(
assert await hass.config_entries.async_setup(entry.entry_id) assert await hass.config_entries.async_setup(entry.entry_id)
await hass.async_block_till_done(wait_background_tasks=True) await hass.async_block_till_done(wait_background_tasks=True)
states = hass.states.async_all()
assert len(states) == 3
await snapshot_platform(hass, entity_registry, snapshot, entry.entry_id) await snapshot_platform(hass, entity_registry, snapshot, entry.entry_id)