@@ -161,6 +161,54 @@ def test_user_can_get_recently_used_directories(self) -> None:
161161 assert vehicle_dir == "/vehicle"
162162 mock_get_dirs .assert_called_once ()
163163
164+ def test_creation_updates_recent_history (self ) -> None :
165+ """Creating a new vehicle via the manager must automatically update the template."""
166+ mock_filesystem = MagicMock (spec = LocalFilesystem )
167+ manager = VehicleProjectManager (mock_filesystem )
168+
169+ with (
170+ patch .object (manager ._creator , "create_new_vehicle_from_template" ) as mock_create ,
171+ patch .object (LocalFilesystem , "store_recently_used_template_dirs" ) as mock_store_template ,
172+ ):
173+ mock_create .return_value = "/new/vehicle/path"
174+ settings = MagicMock (spec = NewVehicleProjectSettings )
175+
176+ # Act
177+ result = manager .create_new_vehicle_from_template ("/templates/ArduCopter" , "/vehicles" , "Name" , settings )
178+
179+ # Assert history updated
180+ assert result == "/new/vehicle/path"
181+ mock_store_template .assert_called_once_with ("/templates/ArduCopter" , "/vehicles" )
182+
183+ def test_creation_does_not_store_vehicle_dir_in_history (self ) -> None :
184+ """
185+ Creating a vehicle must NOT store the vehicle directory in recent-vehicle history directly.
186+
187+ The vehicle dir is persisted to history by the subsequent open_vehicle_directory call in
188+ __main__, so the manager must not write it a second time during creation (which would
189+ result in duplicate entries and wrong history order).
190+
191+ GIVEN: A project manager performing vehicle creation
192+ WHEN: create_new_vehicle_from_template succeeds
193+ THEN: store_recently_used_vehicle_dir must not be called
194+ """
195+ mock_filesystem = MagicMock (spec = LocalFilesystem )
196+ manager = VehicleProjectManager (mock_filesystem )
197+
198+ with (
199+ patch .object (manager ._creator , "create_new_vehicle_from_template" ) as mock_create ,
200+ patch .object (LocalFilesystem , "store_recently_used_template_dirs" ),
201+ patch .object (manager , "store_recently_used_vehicle_dir" ) as mock_store_vehicle ,
202+ ):
203+ mock_create .return_value = "/new/vehicle/path"
204+ settings = MagicMock (spec = NewVehicleProjectSettings )
205+
206+ # Act
207+ manager .create_new_vehicle_from_template ("/templates/ArduCopter" , "/vehicles" , "Name" , settings )
208+
209+ # Assert: vehicle dir history must not be written during creation
210+ mock_store_vehicle .assert_not_called ()
211+
164212 def test_user_can_get_current_working_directory (self ) -> None :
165213 """
166214 User can get current working directory.
@@ -318,86 +366,104 @@ def test_user_can_open_vehicle_directory_successfully(self) -> None:
318366
319367 GIVEN: A project manager with valid vehicle directory
320368 WHEN: User opens vehicle directory
321- THEN: Should open directory and return path
369+ THEN: Should open directory, update history and return path
322370 """
323371 # Arrange: Mock filesystem
324372 mock_filesystem = MagicMock (spec = LocalFilesystem )
325373 manager = VehicleProjectManager (mock_filesystem )
326374
327- # Mock the opener
328- with patch .object (manager ._opener , "open_vehicle_directory" ) as mock_open :
375+ # Mock the opener and history store
376+ with (
377+ patch .object (manager ._opener , "open_vehicle_directory" ) as mock_open ,
378+ patch .object (manager , "store_recently_used_vehicle_dir" ) as mock_store ,
379+ ):
329380 mock_open .return_value = "/opened/vehicle/path"
330381
331382 # Act: Open vehicle directory
332383 result = manager .open_vehicle_directory ("/vehicle/path" )
333384
334- # Assert: Directory opened successfully
385+ # Assert: Directory opened successfully and history recorded
335386 assert result == "/opened/vehicle/path"
336387 mock_open .assert_called_once_with ("/vehicle/path" )
388+ mock_store .assert_called_once_with ("/opened/vehicle/path" )
337389
338390 def test_user_sees_error_when_vehicle_directory_opening_fails (self ) -> None :
339391 """
340392 User sees error when vehicle directory opening fails.
341393
342394 GIVEN: A project manager with invalid vehicle directory
343395 WHEN: User attempts to open vehicle directory
344- THEN: Should raise VehicleProjectOpenError
396+ THEN: Should raise VehicleProjectOpenError and not update history
345397 """
346398 # Arrange: Mock filesystem
347399 mock_filesystem = MagicMock (spec = LocalFilesystem )
348400 manager = VehicleProjectManager (mock_filesystem )
349401
350402 # Mock the opener to raise an exception
351- with patch .object (manager ._opener , "open_vehicle_directory" ) as mock_open :
403+ with (
404+ patch .object (manager ._opener , "open_vehicle_directory" ) as mock_open ,
405+ patch .object (manager , "store_recently_used_vehicle_dir" ) as mock_store ,
406+ ):
352407 mock_open .side_effect = VehicleProjectOpenError ("Open Error" , "Opening failed" )
353408
354409 # Act & Assert: Opening should raise error
355410 with pytest .raises (VehicleProjectOpenError , match = "Opening failed" ):
356411 manager .open_vehicle_directory ("/invalid/path" )
357412
413+ mock_store .assert_not_called ()
414+
358415 def test_user_can_open_last_vehicle_directory_successfully (self ) -> None :
359416 """
360417 User can open last used vehicle directory successfully.
361418
362419 GIVEN: A project manager with last used vehicle directory
363420 WHEN: User opens last vehicle directory
364- THEN: Should open directory and return path
421+ THEN: Should open directory, update history and return path
365422 """
366423 # Arrange: Mock filesystem
367424 mock_filesystem = MagicMock (spec = LocalFilesystem )
368425 manager = VehicleProjectManager (mock_filesystem )
369426
370- # Mock the opener
371- with patch .object (manager ._opener , "open_last_vehicle_directory" ) as mock_open :
427+ # Mock the opener and history storage
428+ with (
429+ patch .object (manager ._opener , "open_last_vehicle_directory" ) as mock_open ,
430+ patch .object (manager , "store_recently_used_vehicle_dir" ) as mock_store ,
431+ ):
372432 mock_open .return_value = "/last/vehicle/path"
373433
374434 # Act: Open last vehicle directory
375435 result = manager .open_last_vehicle_directory ("/last/path" )
376436
377- # Assert: Directory opened successfully
437+ # Assert: Directory opened successfully and history recorded
378438 assert result == "/last/vehicle/path"
379439 mock_open .assert_called_once_with ("/last/path" )
440+ mock_store .assert_called_once_with ("/last/vehicle/path" )
380441
381442 def test_user_sees_error_when_opening_last_vehicle_directory_fails (self ) -> None :
382443 """
383444 User sees error when opening last vehicle directory fails.
384445
385446 GIVEN: A project manager with invalid last vehicle directory
386447 WHEN: User attempts to open last vehicle directory
387- THEN: Should raise VehicleProjectOpenError
448+ THEN: Should raise VehicleProjectOpenError and not update history
388449 """
389450 # Arrange: Mock filesystem
390451 mock_filesystem = MagicMock (spec = LocalFilesystem )
391452 manager = VehicleProjectManager (mock_filesystem )
392453
393454 # Mock the opener to raise an exception
394- with patch .object (manager ._opener , "open_last_vehicle_directory" ) as mock_open :
455+ with (
456+ patch .object (manager ._opener , "open_last_vehicle_directory" ) as mock_open ,
457+ patch .object (manager , "store_recently_used_vehicle_dir" ) as mock_store ,
458+ ):
395459 mock_open .side_effect = VehicleProjectOpenError ("Last Open Error" , "Last directory opening failed" )
396460
397461 # Act & Assert: Opening should raise error
398462 with pytest .raises (VehicleProjectOpenError , match = "Last directory opening failed" ):
399463 manager .open_last_vehicle_directory ("/invalid/last/path" )
400464
465+ mock_store .assert_not_called ()
466+
401467
402468class TestFilesystemStateManagement :
403469 """Test filesystem state management operations."""
@@ -865,20 +931,21 @@ def test_user_can_complete_new_vehicle_creation_workflow(self) -> None:
865931 mock_create .return_value = "/new/vehicle/MyVehicle"
866932 mock_settings = MagicMock (spec = NewVehicleProjectSettings )
867933
868- # Act: Complete workflow
934+ # Act: Complete workflow - manager should take care of history updates
869935 vehicle_path = manager .create_new_vehicle_from_template (
870936 "/templates/ArduCopter" , "/vehicles" , "MyVehicle" , mock_settings
871937 )
872- manager .store_recently_used_template_dirs ("/templates/ArduCopter" , "/vehicles" )
873- manager .store_recently_used_vehicle_dir (vehicle_path )
874938
875- # Assert: Complete workflow executed
939+ # Assert: Complete workflow executed and history recorded
876940 assert vehicle_path == "/new/vehicle/MyVehicle"
877941 assert manager ._settings is mock_settings
878942 assert manager .configuration_template == "ArduCopter"
879943 mock_create .assert_called_once ()
880944 mock_store_template .assert_called_once_with ("/templates/ArduCopter" , "/vehicles" )
881- mock_store_vehicle .assert_called_once_with ("/new/vehicle/MyVehicle" )
945+ # the manager does not store the vehicle directory here; the
946+ # __main__ path opens the new project which causes the history write
947+ # later, so the mock should not be invoked as part of creation.
948+ mock_store_vehicle .assert_not_called ()
882949
883950 def test_user_can_complete_vehicle_opening_workflow (self ) -> None :
884951 """
@@ -898,9 +965,10 @@ def test_user_can_complete_vehicle_opening_workflow(self) -> None:
898965 ):
899966 mock_open .return_value = "/opened/vehicle/path"
900967
901- # Act: Complete workflow
968+ # Act: Complete workflow - the manager method is responsible for
969+ # updating the history, so we don't call store_recently_used_vehicle_dir
970+ # explicitly here.
902971 vehicle_path = manager .open_vehicle_directory ("/vehicle/path" )
903- manager .store_recently_used_vehicle_dir (vehicle_path )
904972
905973 # Assert: Complete workflow executed
906974 assert vehicle_path == "/opened/vehicle/path"
0 commit comments