|
8 | 8 |
|
9 | 9 | from custom_components.spook.ectoplasms.script.repairs.unknown_entity_references import ( |
10 | 10 | extract_entities_from_trigger_config, |
| 11 | + extract_referenced_entities_from_script, |
11 | 12 | ) |
12 | 13 |
|
13 | 14 |
|
@@ -95,3 +96,63 @@ def test_trigger_blueprint_input_shape() -> None: |
95 | 96 | "light.a", |
96 | 97 | "light.b", |
97 | 98 | } |
| 99 | + |
| 100 | + |
| 101 | +class MockScript: # pylint: disable=too-few-public-methods |
| 102 | + """Mock script object.""" |
| 103 | + |
| 104 | + def __init__(self, referenced_entities: set[str]) -> None: |
| 105 | + """Initialize the mock script.""" |
| 106 | + self.referenced_entities = referenced_entities |
| 107 | + |
| 108 | + |
| 109 | +class MockBrokenScript: # pylint: disable=too-few-public-methods |
| 110 | + """Mock script object with broken referenced entity extraction.""" |
| 111 | + |
| 112 | + @property |
| 113 | + def referenced_entities(self) -> set[str]: |
| 114 | + """Raise the same error Home Assistant can raise for dict entity IDs.""" |
| 115 | + msg = "unhashable type: 'dict'" |
| 116 | + raise TypeError(msg) |
| 117 | + |
| 118 | + |
| 119 | +class MockUnexpectedBrokenScript: # pylint: disable=too-few-public-methods |
| 120 | + """Mock script object with an unrelated TypeError.""" |
| 121 | + |
| 122 | + @property |
| 123 | + def referenced_entities(self) -> set[str]: |
| 124 | + """Raise an unexpected TypeError.""" |
| 125 | + msg = "unexpected failure" |
| 126 | + raise TypeError(msg) |
| 127 | + |
| 128 | + |
| 129 | +class MockScriptEntity: # pylint: disable=too-few-public-methods |
| 130 | + """Mock script entity.""" |
| 131 | + |
| 132 | + def __init__( |
| 133 | + self, script: MockScript | MockBrokenScript | MockUnexpectedBrokenScript |
| 134 | + ) -> None: |
| 135 | + """Initialize the mock script entity.""" |
| 136 | + self.script = script |
| 137 | + |
| 138 | + |
| 139 | +def test_extract_referenced_entities_from_script() -> None: |
| 140 | + """Test script referenced entities are returned as a set.""" |
| 141 | + entity = MockScriptEntity(MockScript({"light.kitchen"})) |
| 142 | + |
| 143 | + assert extract_referenced_entities_from_script(entity) == {"light.kitchen"} |
| 144 | + |
| 145 | + |
| 146 | +def test_extract_referenced_entities_handles_home_assistant_type_error() -> None: |
| 147 | + """Test broken Home Assistant referenced entity extraction is ignored.""" |
| 148 | + entity = MockScriptEntity(MockBrokenScript()) |
| 149 | + |
| 150 | + assert extract_referenced_entities_from_script(entity) == set() |
| 151 | + |
| 152 | + |
| 153 | +def test_extract_referenced_entities_reraises_unexpected_type_error() -> None: |
| 154 | + """Test unrelated TypeErrors are not swallowed.""" |
| 155 | + entity = MockScriptEntity(MockUnexpectedBrokenScript()) |
| 156 | + |
| 157 | + with pytest.raises(TypeError, match="unexpected failure"): |
| 158 | + extract_referenced_entities_from_script(entity) |
0 commit comments