@@ -202,16 +202,16 @@ def test_user_cannot_create_project_with_nonexistent_template_directory(self, pr
202202 new_base_dir = "/valid/base/dir"
203203 new_vehicle_name = "valid_name"
204204
205- with patch .object (LocalFilesystem , "directory_exists" , return_value = False ):
205+ with (
206+ patch .object (LocalFilesystem , "directory_exists" , return_value = False ),
207+ pytest .raises (VehicleProjectCreationError ) as exc_info ,
208+ ):
206209 # Act & Assert: Should raise validation error
207- with pytest .raises (VehicleProjectCreationError ) as exc_info :
208- project_creator .create_new_vehicle_from_template (
209- template_dir , new_base_dir , new_vehicle_name , default_settings
210- )
210+ project_creator .create_new_vehicle_from_template (template_dir , new_base_dir , new_vehicle_name , default_settings )
211211
212- assert "Vehicle template directory" in exc_info .value .title
213- assert "does not exist" in exc_info .value .message
214- assert template_dir in exc_info .value .message
212+ assert "Vehicle template directory" in exc_info .value .title
213+ assert "does not exist" in exc_info .value .message
214+ assert template_dir in exc_info .value .message
215215
216216 def test_user_cannot_create_project_with_empty_vehicle_name (self , project_creator , default_settings ) -> None :
217217 """
@@ -226,15 +226,15 @@ def test_user_cannot_create_project_with_empty_vehicle_name(self, project_creato
226226 new_base_dir = "/valid/base/dir"
227227 new_vehicle_name = ""
228228
229- with patch .object (LocalFilesystem , "directory_exists" , return_value = True ):
229+ with (
230+ patch .object (LocalFilesystem , "directory_exists" , return_value = True ),
231+ pytest .raises (VehicleProjectCreationError ) as exc_info ,
232+ ):
230233 # Act & Assert: Should raise validation error
231- with pytest .raises (VehicleProjectCreationError ) as exc_info :
232- project_creator .create_new_vehicle_from_template (
233- template_dir , new_base_dir , new_vehicle_name , default_settings
234- )
234+ project_creator .create_new_vehicle_from_template (template_dir , new_base_dir , new_vehicle_name , default_settings )
235235
236- assert "New vehicle directory" in exc_info .value .title
237- assert "must not be empty" in exc_info .value .message
236+ assert "New vehicle directory" in exc_info .value .title
237+ assert "must not be empty" in exc_info .value .message
238238
239239 def test_user_cannot_create_project_with_invalid_vehicle_name (self , project_creator , default_settings ) -> None :
240240 """
@@ -263,6 +263,28 @@ def test_user_cannot_create_project_with_invalid_vehicle_name(self, project_crea
263263 assert "invalid characters" in exc_info .value .message
264264 assert new_vehicle_name in exc_info .value .message
265265
266+ def test_user_cannot_create_project_with_traversal_style_vehicle_name (self , project_creator , default_settings ) -> None :
267+ """
268+ User receives validation error when vehicle name contains path traversal syntax.
269+
270+ GIVEN: A user attempts to create a vehicle project
271+ WHEN: They provide a vehicle name that looks like a relative path
272+ THEN: AMC rejects it before any filesystem changes are attempted
273+ """
274+ template_dir = "/valid/template/dir"
275+ new_base_dir = "/valid/base/dir"
276+ new_vehicle_name = "../escape"
277+
278+ with (
279+ patch .object (LocalFilesystem , "directory_exists" , return_value = True ),
280+ pytest .raises (VehicleProjectCreationError ) as exc_info ,
281+ ):
282+ project_creator .create_new_vehicle_from_template (template_dir , new_base_dir , new_vehicle_name , default_settings )
283+
284+ assert "New vehicle directory" in exc_info .value .title
285+ assert "invalid characters" in exc_info .value .message
286+ project_creator .local_filesystem .create_new_vehicle_dir .assert_not_called ()
287+
266288
267289class TestVehicleProjectCreationWorkflow :
268290 """Test complete vehicle project creation workflows."""
0 commit comments