mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-31 07:03:55 +00:00 
			
		
		
		
	fix conflicts
This commit is contained in:
		| @@ -14,6 +14,8 @@ import sys | ||||
|  | ||||
| import pytest | ||||
|  | ||||
| from esphome.core import CORE | ||||
|  | ||||
| here = Path(__file__).parent | ||||
|  | ||||
| # Configure location of package root | ||||
| @@ -21,6 +23,13 @@ package_root = here.parent.parent | ||||
| sys.path.insert(0, package_root.as_posix()) | ||||
|  | ||||
|  | ||||
| @pytest.fixture(autouse=True) | ||||
| def reset_core(): | ||||
|     """Reset CORE after each test.""" | ||||
|     yield | ||||
|     CORE.reset() | ||||
|  | ||||
|  | ||||
| @pytest.fixture | ||||
| def fixture_path() -> Path: | ||||
|     """ | ||||
|   | ||||
							
								
								
									
										129
									
								
								tests/unit_tests/test_duplicate_entities.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										129
									
								
								tests/unit_tests/test_duplicate_entities.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,129 @@ | ||||
| """Test duplicate entity object ID handling.""" | ||||
|  | ||||
| import pytest | ||||
|  | ||||
| from esphome.core import CORE | ||||
| from esphome.helpers import sanitize, snake_case | ||||
|  | ||||
|  | ||||
| @pytest.fixture | ||||
| def setup_test_device() -> None: | ||||
|     """Set up test device configuration.""" | ||||
|     CORE.name = "test-device" | ||||
|     CORE.friendly_name = "Test Device" | ||||
|  | ||||
|  | ||||
| def test_unique_key_generation() -> None: | ||||
|     """Test that unique keys are generated correctly.""" | ||||
|     # Test with no device | ||||
|     key1: tuple[int, str, str] = (0, "binary_sensor", "temperature") | ||||
|     assert key1 == (0, "binary_sensor", "temperature") | ||||
|  | ||||
|     # Test with device | ||||
|     key2: tuple[int, str, str] = (12345, "sensor", "humidity") | ||||
|     assert key2 == (12345, "sensor", "humidity") | ||||
|  | ||||
|  | ||||
| def test_duplicate_tracking() -> None: | ||||
|     """Test that duplicates are tracked correctly.""" | ||||
|     # First occurrence | ||||
|     key: tuple[int, str, str] = (0, "sensor", "temperature") | ||||
|     assert key not in CORE.unique_ids | ||||
|  | ||||
|     CORE.unique_ids[key] = 1 | ||||
|     assert CORE.unique_ids[key] == 1 | ||||
|  | ||||
|     # Second occurrence | ||||
|     count: int = CORE.unique_ids[key] + 1 | ||||
|     CORE.unique_ids[key] = count | ||||
|     assert CORE.unique_ids[key] == 2 | ||||
|  | ||||
|  | ||||
| def test_object_id_sanitization() -> None: | ||||
|     """Test that object IDs are properly sanitized.""" | ||||
|     # Test various inputs | ||||
|     assert sanitize(snake_case("Temperature Sensor")) == "temperature_sensor" | ||||
|     assert sanitize(snake_case("Living Room Light!")) == "living_room_light_" | ||||
|     assert sanitize(snake_case("Test-Device")) == "test-device" | ||||
|     assert sanitize(snake_case("")) == "" | ||||
|  | ||||
|  | ||||
| def test_suffix_generation() -> None: | ||||
|     """Test that suffixes are generated correctly.""" | ||||
|     base_id: str = "temperature" | ||||
|  | ||||
|     # No suffix for first occurrence | ||||
|     object_id_1: str = base_id | ||||
|     assert object_id_1 == "temperature" | ||||
|  | ||||
|     # Add suffix for duplicates | ||||
|     count: int = 2 | ||||
|     object_id_2: str = f"{base_id}_{count}" | ||||
|     assert object_id_2 == "temperature_2" | ||||
|  | ||||
|     count = 3 | ||||
|     object_id_3: str = f"{base_id}_{count}" | ||||
|     assert object_id_3 == "temperature_3" | ||||
|  | ||||
|  | ||||
| def test_different_platforms_same_name() -> None: | ||||
|     """Test that same name on different platforms doesn't conflict.""" | ||||
|     # Simulate two entities with same name on different platforms | ||||
|     key1: tuple[int, str, str] = (0, "binary_sensor", "status") | ||||
|     key2: tuple[int, str, str] = (0, "text_sensor", "status") | ||||
|  | ||||
|     # They should be different keys | ||||
|     assert key1 != key2 | ||||
|  | ||||
|     # Track them separately | ||||
|     CORE.unique_ids[key1] = 1 | ||||
|     CORE.unique_ids[key2] = 1 | ||||
|  | ||||
|     # Both should be at count 1 (no conflict) | ||||
|     assert CORE.unique_ids[key1] == 1 | ||||
|     assert CORE.unique_ids[key2] == 1 | ||||
|  | ||||
|  | ||||
| def test_different_devices_same_name_platform() -> None: | ||||
|     """Test that same name+platform on different devices doesn't conflict.""" | ||||
|     # Simulate two entities with same name and platform but different devices | ||||
|     key1: tuple[int, str, str] = (12345, "sensor", "temperature") | ||||
|     key2: tuple[int, str, str] = (67890, "sensor", "temperature") | ||||
|  | ||||
|     # They should be different keys | ||||
|     assert key1 != key2 | ||||
|  | ||||
|     # Track them separately | ||||
|     CORE.unique_ids[key1] = 1 | ||||
|     CORE.unique_ids[key2] = 1 | ||||
|  | ||||
|     # Both should be at count 1 (no conflict) | ||||
|     assert CORE.unique_ids[key1] == 1 | ||||
|     assert CORE.unique_ids[key2] == 1 | ||||
|  | ||||
|  | ||||
| def test_empty_name_handling(setup_test_device: None) -> None: | ||||
|     """Test handling of entities with empty names.""" | ||||
|     # When name is empty, it should use the device name | ||||
|     empty_name: str = "" | ||||
|     base_id: str | ||||
|     if not empty_name: | ||||
|         if CORE.friendly_name: | ||||
|             base_id = sanitize(snake_case(CORE.friendly_name)) | ||||
|         else: | ||||
|             base_id = sanitize(snake_case(CORE.name)) | ||||
|  | ||||
|     assert base_id == "test_device"  # Uses friendly name | ||||
|  | ||||
|  | ||||
| def test_reset_clears_unique_ids() -> None: | ||||
|     """Test that CORE.reset() clears the unique_ids tracking.""" | ||||
|     # Add some tracked IDs | ||||
|     CORE.unique_ids[(0, "sensor", "test")] = 2 | ||||
|     CORE.unique_ids[(0, "binary_sensor", "test")] = 3 | ||||
|  | ||||
|     assert len(CORE.unique_ids) == 2 | ||||
|  | ||||
|     # Reset should clear them | ||||
|     CORE.reset() | ||||
|     assert len(CORE.unique_ids) == 0 | ||||
		Reference in New Issue
	
	Block a user