@@ -703,6 +703,67 @@ async def test_discovery_match_by_local_name(
703703 assert mock_config_flow .mock_calls [0 ][1 ][0 ] == "switchbot"
704704
705705
706+ @pytest .mark .usefixtures ("enable_bluetooth" )
707+ async def test_discovery_match_by_service_uuid_when_name_changes_from_mac (
708+ hass : HomeAssistant , mock_bleak_scanner_start : MagicMock
709+ ) -> None :
710+ """Test bluetooth discovery still matches when name changes from MAC address to real name."""
711+ mock_bt = [
712+ {
713+ "domain" : "improv_ble" ,
714+ "service_uuid" : "00467768-6228-2272-4663-277478268000" ,
715+ }
716+ ]
717+ with (
718+ patch (
719+ "homeassistant.components.bluetooth.async_get_bluetooth" ,
720+ return_value = mock_bt ,
721+ ),
722+ patch .object (hass .config_entries .flow , "async_init" ) as mock_config_flow ,
723+ ):
724+ await async_setup_with_default_adapter (hass )
725+ hass .bus .async_fire (EVENT_HOMEASSISTANT_STARTED )
726+ await hass .async_block_till_done ()
727+
728+ assert len (mock_bleak_scanner_start .mock_calls ) == 1
729+
730+ # First advertisement: name is MAC address, with service UUID
731+ # This should trigger discovery
732+ device_mac_name = generate_ble_device ("64:E8:33:7E:0D:9E" , "64:E8:33:7E:0D:9E" )
733+ adv_mac_name = generate_advertisement_data (
734+ local_name = "64:E8:33:7E:0D:9E" ,
735+ service_uuids = ["00467768-6228-2272-4663-277478268000" ],
736+ service_data = {
737+ "00004677-0000-1000-8000-00805f9b34fb" : b"\x02 \x00 \x00 \x00 \x00 \x00 "
738+ },
739+ )
740+
741+ inject_advertisement (hass , device_mac_name , adv_mac_name )
742+ await hass .async_block_till_done ()
743+
744+ assert len (mock_config_flow .mock_calls ) == 1
745+ assert mock_config_flow .mock_calls [0 ][1 ][0 ] == "improv_ble"
746+ mock_config_flow .reset_mock ()
747+
748+ # Second advertisement: name changes to real name, same service UUID
749+ # This should trigger discovery again because the name changed
750+ device_real_name = generate_ble_device ("64:E8:33:7E:0D:9E" , "improvtest" )
751+ adv_real_name = generate_advertisement_data (
752+ local_name = "improvtest" ,
753+ service_uuids = ["00467768-6228-2272-4663-277478268000" ],
754+ service_data = {
755+ "00004677-0000-1000-8000-00805f9b34fb" : b"\x02 \x00 \x00 \x00 \x00 \x00 "
756+ },
757+ )
758+
759+ inject_advertisement (hass , device_real_name , adv_real_name )
760+ await hass .async_block_till_done ()
761+
762+ # Should still match improv_ble even though name changed
763+ assert len (mock_config_flow .mock_calls ) == 1
764+ assert mock_config_flow .mock_calls [0 ][1 ][0 ] == "improv_ble"
765+
766+
706767@pytest .mark .usefixtures ("macos_adapter" )
707768async def test_discovery_match_by_manufacturer_id_and_manufacturer_data_start (
708769 hass : HomeAssistant , mock_bleak_scanner_start : MagicMock
0 commit comments