@@ -417,19 +417,59 @@ def test_set_gear_removes_existing_gear(self):
417417 mock_client .remove_gear_from_activity .assert_called_once_with ("uuid-old" , "99999" )
418418 mock_client .add_gear_to_activity .assert_called_once_with ("uuid-new" , "99999" )
419419
420- def test_set_gear_gear_not_found (self ):
421- """Test set_gear returns False when gear name is not in account ."""
420+ def test_create_gear_success (self ):
421+ """Test _create_gear POSTs to Garmin API and returns the UUID ."""
422422 provider = GarminProvider ()
423423
424424 mock_client = Mock ()
425425 mock_client .get_device_last_used .return_value = {"userProfileNumber" : "12345" }
426- mock_client .get_gear . return_value = [ {"uuid" : "uuid-bike " , "displayName" : "Trek Bike" }]
426+ mock_client .garth . post . return_value . json . return_value = {"uuid" : "new- uuid-123 " , "displayName" : "New Bike" }
427427 provider ._get_client = Mock (return_value = mock_client )
428428
429- result = provider .set_gear ("Unknown Gear" , "99999" )
429+ uuid = provider ._create_gear ("New Bike" )
430+
431+ assert uuid == "new-uuid-123"
432+ mock_client .garth .post .assert_called_once_with (
433+ "connectapi" ,
434+ "/gear-service/gear" ,
435+ json = {
436+ "displayName" : "New Bike" ,
437+ "customMakeModel" : "New Bike" ,
438+ "gearStatusName" : "active" ,
439+ "userProfilePk" : "12345" ,
440+ },
441+ )
430442
431- assert result is False
432- mock_client .add_gear_to_activity .assert_not_called ()
443+ def test_create_gear_no_uuid_raises (self ):
444+ """Test _create_gear raises if the API response contains no UUID."""
445+ provider = GarminProvider ()
446+
447+ mock_client = Mock ()
448+ mock_client .get_device_last_used .return_value = {"userProfileNumber" : "12345" }
449+ mock_client .garth .post .return_value .json .return_value = {}
450+ provider ._get_client = Mock (return_value = mock_client )
451+
452+ with pytest .raises (RuntimeError , match = "no UUID" ):
453+ provider ._create_gear ("New Bike" )
454+
455+ def test_set_gear_creates_when_not_found (self ):
456+ """Test set_gear creates the gear in Garmin Connect if it doesn't exist yet."""
457+ provider = GarminProvider ()
458+
459+ mock_client = Mock ()
460+ mock_client .get_device_last_used .return_value = {"userProfileNumber" : "12345" }
461+ mock_client .get_gear .return_value = [] # no existing gear
462+ mock_client .garth .post .return_value .json .return_value = {"uuid" : "new-uuid-abc" }
463+ mock_client .get_activity_gear .return_value = []
464+ provider ._get_client = Mock (return_value = mock_client )
465+
466+ with patch ("tracekit.providers.garmin.garmin_provider.GarminActivity" ) as mock_act_cls :
467+ mock_act_cls .get_or_none .return_value = None
468+ result = provider .set_gear ("Brand New Bike" , "99999" )
469+
470+ assert result is True
471+ mock_client .garth .post .assert_called_once ()
472+ mock_client .add_gear_to_activity .assert_called_once_with ("new-uuid-abc" , "99999" )
433473
434474 def test_set_gear_api_error (self ):
435475 """Test set_gear returns False on API error."""
0 commit comments