|
12 | 12 |
|
13 | 13 | import os |
14 | 14 | import pytest |
| 15 | +from collections import defaultdict |
15 | 16 | from unittest.mock import MagicMock, patch |
16 | 17 | import configparser |
17 | 18 |
|
@@ -153,3 +154,69 @@ def test_configparser_delimiter_consistency(self): |
153 | 154 | ) |
154 | 155 | finally: |
155 | 156 | os.unlink(temp_file) |
| 157 | + |
| 158 | + |
| 159 | +class TestConfigSensorNameMatching: |
| 160 | + """Test that sensor config is matched by name, not position. |
| 161 | +
|
| 162 | + Verifies the fix for config loading that uses sensor names as keys |
| 163 | + instead of positional lists, so reordering/adding/removing sensors |
| 164 | + between restarts doesn't misalign visibility settings. |
| 165 | + """ |
| 166 | + |
| 167 | + def test_config_fewer_sensors_than_system(self): |
| 168 | + """Config has fewer sensors than currently on the system. |
| 169 | +
|
| 170 | + New sensors should default to visible (True). |
| 171 | + """ |
| 172 | + from s_tui.sensors_menu import SensorsMenu |
| 173 | + |
| 174 | + # Create a mock source with 3 sensors |
| 175 | + source = MagicMock() |
| 176 | + source.get_source_name.return_value = "Temp" |
| 177 | + source.get_sensor_list.return_value = ["Core0,0", "Core1,0", "Core2,0"] |
| 178 | + |
| 179 | + # Config only knows about 2 of them (dict keyed by lowercase name) |
| 180 | + default_conf = {"Temp": {"core0,0": True, "core1,0": False}} |
| 181 | + |
| 182 | + menu = SensorsMenu(MagicMock(), [source], default_conf) |
| 183 | + active = menu.active_sensors["Temp"] |
| 184 | + assert active[0] is True # Core0,0 from config |
| 185 | + assert active[1] is False # Core1,0 from config |
| 186 | + assert active[2] is True # Core2,0 new, defaults visible |
| 187 | + |
| 188 | + def test_config_more_sensors_than_system(self): |
| 189 | + """Config has more sensors than currently on the system. |
| 190 | +
|
| 191 | + Extra config entries should be silently ignored. |
| 192 | + """ |
| 193 | + from s_tui.sensors_menu import SensorsMenu |
| 194 | + |
| 195 | + # System has only 1 sensor |
| 196 | + source = MagicMock() |
| 197 | + source.get_source_name.return_value = "Temp" |
| 198 | + source.get_sensor_list.return_value = ["Core0,0"] |
| 199 | + |
| 200 | + # Config has entries for 3 sensors |
| 201 | + default_conf = { |
| 202 | + "Temp": {"core0,0": False, "core1,0": True, "core2,0": True} |
| 203 | + } |
| 204 | + |
| 205 | + menu = SensorsMenu(MagicMock(), [source], default_conf) |
| 206 | + active = menu.active_sensors["Temp"] |
| 207 | + assert len(active) == 1 |
| 208 | + assert active[0] is False # Core0,0 from config |
| 209 | + |
| 210 | + def test_config_empty_defaults_all_visible(self): |
| 211 | + """No config for a source means all sensors default to visible.""" |
| 212 | + from s_tui.sensors_menu import SensorsMenu |
| 213 | + |
| 214 | + source = MagicMock() |
| 215 | + source.get_source_name.return_value = "Fan" |
| 216 | + source.get_sensor_list.return_value = ["fan0", "fan1"] |
| 217 | + |
| 218 | + default_conf = defaultdict(dict) |
| 219 | + |
| 220 | + menu = SensorsMenu(MagicMock(), [source], default_conf) |
| 221 | + active = menu.active_sensors["Fan"] |
| 222 | + assert active == [True, True] |
0 commit comments