Skip to content

Commit 7e554c6

Browse files
committed
fix(template overview): fix filtering of vehicle type and tests
1 parent 4e7cd35 commit 7e554c6

File tree

2 files changed

+46
-48
lines changed

2 files changed

+46
-48
lines changed

ardupilot_methodic_configurator/frontend_tkinter_template_overview.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,7 @@ def _populate_treeview(self, connected_fc_vehicle_type: str) -> None:
226226
for key, template_overview in self.vehicle_components_provider.get_vehicle_components_overviews().items():
227227
attribute_names = template_overview.attributes()
228228
values = (key, *(getattr(template_overview, attr, "") for attr in attribute_names))
229-
if connected_fc_vehicle_type and connected_fc_vehicle_type not in key:
229+
if connected_fc_vehicle_type and not key.startswith(connected_fc_vehicle_type):
230230
continue
231231
self.tree.insert("", "end", text=key, values=values)
232232

tests/test_frontend_tkinter_template_overview.py

Lines changed: 45 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,8 @@ def mock_program_provider() -> MagicMock:
9393

9494

9595
@pytest.fixture
96-
def firmware_filtering_templates() -> dict[str, MagicMock]:
97-
"""Fixture providing mock templates for firmware filtering tests."""
96+
def vehicle_filtering_templates() -> dict[str, MagicMock]:
97+
"""Fixture providing mock templates for vehicle filtering tests."""
9898
return {
9999
"Copter/QuadX": MagicMock(attributes=lambda: ["name"], name="QuadCopter"),
100100
"Plane/FixedWing": MagicMock(attributes=lambda: ["name"], name="Airplane"),
@@ -107,9 +107,9 @@ def firmware_filtering_templates() -> dict[str, MagicMock]:
107107

108108

109109
@pytest.fixture
110-
def firmware_window(mock_vehicle_provider, mock_program_provider, firmware_filtering_templates) -> TemplateOverviewWindow:
111-
"""Fixture providing a configured window for firmware filtering tests."""
112-
mock_vehicle_provider.get_vehicle_components_overviews.return_value = firmware_filtering_templates
110+
def vehicle_window(mock_vehicle_provider, mock_program_provider, vehicle_filtering_templates) -> TemplateOverviewWindow:
111+
"""Fixture providing a configured window for vehicle filtering tests."""
112+
mock_vehicle_provider.get_vehicle_components_overviews.return_value = vehicle_filtering_templates
113113

114114
with (
115115
patch("tkinter.Toplevel"),
@@ -123,7 +123,7 @@ def firmware_window(mock_vehicle_provider, mock_program_provider, firmware_filte
123123
window = TemplateOverviewWindow(
124124
vehicle_components_provider=mock_vehicle_provider,
125125
program_settings_provider=mock_program_provider,
126-
connected_fc_vehicle_type="Copter", # Default firmware type for filtering tests
126+
connected_fc_vehicle_type="ArduCopter", # Default vehicle type for filtering tests
127127
)
128128
window.root = MagicMock()
129129
window.tree = MagicMock()
@@ -1051,86 +1051,84 @@ def test_main_function_handles_no_recently_used_directories(self) -> None:
10511051
mock_log_info.assert_not_called()
10521052

10531053

1054-
class TestFirmwareTypeFiltering:
1055-
"""Test firmware type filtering functionality."""
1054+
class TestVehicleTypeFiltering:
1055+
"""Test vehicle type filtering functionality."""
10561056

1057-
def test_filtering_shows_only_matching_firmware_templates(self, firmware_window) -> None:
1057+
def test_filtering_shows_only_matching_vehicle_templates(self, vehicle_window) -> None:
10581058
"""
1059-
Test that firmware filtering shows only templates matching the connected flight controller.
1059+
Test that vehicle filtering shows only templates matching the connected flight controller.
10601060
1061-
GIVEN: Multiple templates exist for different firmware types
1062-
WHEN: User has a specific firmware type connected (e.g., "Copter")
1063-
THEN: Only templates matching that firmware type should be displayed
1061+
GIVEN: Multiple templates exist for different vehicle types
1062+
WHEN: User has a specific vehicle type connected (e.g., "ArduCopter")
1063+
THEN: Only templates matching that vehicle type should be displayed
10641064
"""
10651065
# Act: Populate treeview with Copter filtering
1066-
firmware_window._populate_treeview("Copter")
1066+
vehicle_window._populate_treeview("ArduCopter")
10671067

1068-
# Assert: Only Copter templates are added
1069-
# Should include: Copter/QuadX, Copter/HexaX, ArduCopter/QuadX, and Custom/Copter/Experimental
1070-
assert firmware_window.tree.insert.call_count == 4
1068+
# Assert: Only ArduCopter templates are added
1069+
# Should not include: Copter/QuadX, Copter/HexaX, Custom/Copter/Experimental
1070+
assert vehicle_window.tree.insert.call_count == 1
10711071

10721072
# Verify the calls contain only Copter templates
1073-
call_args_list = firmware_window.tree.insert.call_args_list
1073+
call_args_list = vehicle_window.tree.insert.call_args_list
10741074
inserted_keys = [call[1]["text"] for call in call_args_list]
1075-
assert "Copter/QuadX" in inserted_keys
1076-
assert "Copter/HexaX" in inserted_keys
1075+
assert "Copter/QuadX" not in inserted_keys
1076+
assert "Copter/HexaX" not in inserted_keys
10771077
assert "ArduCopter/QuadX" in inserted_keys
1078-
assert "Custom/Copter/Experimental" in inserted_keys
1078+
assert "Custom/Copter/Experimental" not in inserted_keys
10791079
assert "Plane/FixedWing" not in inserted_keys
10801080
assert "Rover/SkidSteer" not in inserted_keys
10811081

1082-
def test_no_filtering_shows_all_templates(self, firmware_window) -> None:
1082+
def test_no_filtering_shows_all_templates(self, vehicle_window) -> None:
10831083
"""
1084-
Test that passing empty/None firmware type shows all available templates.
1084+
Test that passing empty/None vehicle type shows all available templates.
10851085
1086-
GIVEN: Multiple templates exist for different firmware types
1087-
WHEN: No specific firmware type is provided for filtering
1086+
GIVEN: Multiple templates exist for different vehicle types
1087+
WHEN: No specific vehicle type is provided for filtering
10881088
THEN: All available templates should be displayed
10891089
"""
10901090
# Act: Populate treeview without filtering
1091-
firmware_window._populate_treeview("")
1091+
vehicle_window._populate_treeview("")
10921092

10931093
# Assert: All templates are added
1094-
assert firmware_window.tree.insert.call_count == 7 # All seven templates
1094+
assert vehicle_window.tree.insert.call_count == 7 # All seven templates
10951095

10961096
# Verify all template types are included
1097-
call_args_list = firmware_window.tree.insert.call_args_list
1097+
call_args_list = vehicle_window.tree.insert.call_args_list
10981098
inserted_keys = [call[1]["text"] for call in call_args_list]
10991099
assert "Copter/QuadX" in inserted_keys
11001100
assert "Plane/FixedWing" in inserted_keys
11011101
assert "Rover/SkidSteer" in inserted_keys
11021102
assert "ArduCopter/QuadX" in inserted_keys
11031103

1104-
def test_partial_firmware_matching_works_correctly(self, firmware_window) -> None:
1104+
def test_partial_vehicle_matching_works_correctly(self, vehicle_window) -> None:
11051105
"""
1106-
Test that firmware filtering works with partial string matching.
1106+
Test that vehicle filtering works with partial string matching.
11071107
1108-
GIVEN: Templates with firmware types as part of their keys
1109-
WHEN: A specific firmware substring is used for filtering
1108+
GIVEN: Templates with vehicle types as part of their keys
1109+
WHEN: A specific vehicle substring is used for filtering
11101110
THEN: All templates containing that substring should be included
11111111
"""
1112-
# Act: Filter by "Copter" substring
1113-
firmware_window._populate_treeview("Copter")
1112+
# Act: Filter by "ArduCopter" substring
1113+
vehicle_window._populate_treeview("ArduCopter")
11141114

1115-
# Assert: Both ArduCopter and Custom/Copter templates are included
1116-
assert firmware_window.tree.insert.call_count == 4
1115+
# Assert: Only ArduCopter templates are included
1116+
assert vehicle_window.tree.insert.call_count == 1
11171117

1118-
call_args_list = firmware_window.tree.insert.call_args_list
1118+
call_args_list = vehicle_window.tree.insert.call_args_list
11191119
inserted_keys = [call[1]["text"] for call in call_args_list]
11201120
assert "ArduCopter/QuadX" in inserted_keys
1121-
assert "Custom/Copter/Experimental" in inserted_keys
1122-
assert "Copter/QuadX" in inserted_keys
1121+
assert "Custom/Copter/Experimental" not in inserted_keys
1122+
assert "Copter/QuadX" not in inserted_keys
11231123
assert "ArduPlane/FixedWing" not in inserted_keys
11241124

1125-
def test_constructor_passes_firmware_type_to_configure_treeview(
1126-
self, mock_vehicle_provider, mock_program_provider
1127-
) -> None:
1125+
def test_constructor_passes_vehicle_type_to_configure_treeview(self, mock_vehicle_provider, mock_program_provider) -> None:
11281126
"""
1129-
Test that the constructor properly passes firmware type to the configuration methods.
1127+
Test that the constructor properly passes vehicle type to the configuration methods.
11301128
1131-
GIVEN: A TemplateOverviewWindow is created with a specific firmware type
1129+
GIVEN: A TemplateOverviewWindow is created with a specific vehicle type
11321130
WHEN: The constructor initializes the UI components
1133-
THEN: The firmware type should be passed down to the treeview configuration
1131+
THEN: The vehicle type should be passed down to the treeview configuration
11341132
"""
11351133
with (
11361134
patch("tkinter.Toplevel"),
@@ -1141,12 +1139,12 @@ def test_constructor_passes_firmware_type_to_configure_treeview(
11411139
patch.object(TemplateOverviewWindow, "_configure_treeview") as mock_configure_treeview,
11421140
patch.object(TemplateOverviewWindow, "_bind_events"),
11431141
):
1144-
# Act: Create window with specific firmware type
1142+
# Act: Create window with specific vehicle type
11451143
TemplateOverviewWindow(
11461144
vehicle_components_provider=mock_vehicle_provider,
11471145
program_settings_provider=mock_program_provider,
11481146
connected_fc_vehicle_type="Plane",
11491147
)
11501148

1151-
# Assert: Firmware type is passed to configure_treeview
1149+
# Assert: vehicle type is passed to configure_treeview
11521150
mock_configure_treeview.assert_called_once_with("Plane")

0 commit comments

Comments
 (0)