@@ -405,8 +405,31 @@ def test_passes_environment_variables(self):
405405 definition = tuner ._build_training_job_definition (inputs = None )
406406 assert definition .environment == {"MY_VAR" : "value" , "OTHER" : "123" }
407407
408+ def test_passes_empty_environment (self ):
409+ """Should pass through empty dict environment as-is.
410+
411+ An empty dict is valid for the SageMaker API, so we pass it through
412+ rather than silently converting it to None/Unassigned.
413+ """
414+ trainer = _mock_model_trainer (environment = {})
415+
416+ tuner = HyperparameterTuner (
417+ model_trainer = trainer ,
418+ objective_metric_name = "accuracy" ,
419+ hyperparameter_ranges = _hp_ranges (),
420+ )
421+
422+ definition = tuner ._build_training_job_definition (inputs = None )
423+ assert definition .environment == {}, (
424+ "Empty dict environment should be passed through as-is"
425+ )
426+
408427 def test_skips_environment_when_none (self ):
409- """Should not set environment when model_trainer.environment is None."""
428+ """Should not set environment when model_trainer.environment is None.
429+
430+ When environment is None, it is not passed to the Pydantic constructor,
431+ so the field stays as Unassigned (excluded from serialization).
432+ """
410433 trainer = _mock_model_trainer (environment = None )
411434
412435 tuner = HyperparameterTuner (
@@ -416,10 +439,16 @@ def test_skips_environment_when_none(self):
416439 )
417440
418441 definition = tuner ._build_training_job_definition (inputs = None )
419- assert _is_unassigned (definition .environment )
442+ assert _is_unassigned (definition .environment ), (
443+ "Environment should be Unassigned when model_trainer.environment is None"
444+ )
420445
421446 def test_skips_environment_when_not_dict (self ):
422- """Should not set environment when it's not a dict (e.g. MagicMock)."""
447+ """Should not set environment when it's not a dict (e.g. MagicMock).
448+
449+ Non-dict values are not passed to the Pydantic constructor to avoid
450+ validation errors. The field stays as Unassigned.
451+ """
423452 trainer = _mock_model_trainer (environment = MagicMock ())
424453
425454 tuner = HyperparameterTuner (
@@ -429,7 +458,9 @@ def test_skips_environment_when_not_dict(self):
429458 )
430459
431460 definition = tuner ._build_training_job_definition (inputs = None )
432- assert _is_unassigned (definition .environment )
461+ assert _is_unassigned (definition .environment ), (
462+ "Environment should be Unassigned when model_trainer.environment is not a dict"
463+ )
433464
434465 def test_passes_vpc_config (self ):
435466 """Should set definition.vpc_config from model_trainer.networking._to_vpc_config()."""
0 commit comments