@@ -403,3 +403,67 @@ def test_trigger_dag_run_defaults_logical_date_to_now(self):
403403
404404 # Also verify timezone is UTC
405405 assert trigger_body .logical_date .tzinfo is not None , "logical_date should have timezone info"
406+
407+ def test_apply_datamodel_defaults_trigger_dag_run_with_none (self ):
408+ """Test _apply_datamodel_defaults sets logical_date to now when None for TriggerDAGRunPostBody."""
409+ from datetime import datetime , timezone
410+
411+ from airflowctl .api .datamodels .generated import TriggerDAGRunPostBody
412+
413+ command_factory = CommandFactory ()
414+
415+ # Test with logical_date=None
416+ params = {"logical_date" : None , "conf" : {}}
417+ result = command_factory ._apply_datamodel_defaults (TriggerDAGRunPostBody , params )
418+
419+ assert result ["logical_date" ] is not None , "logical_date should be defaulted to now"
420+ assert isinstance (result ["logical_date" ], datetime )
421+
422+ # Verify it's close to current time (within 5 seconds)
423+ time_diff = abs ((datetime .now (timezone .utc ) - result ["logical_date" ]).total_seconds ())
424+ assert time_diff < 5 , f"logical_date should be close to now, but diff is { time_diff } seconds"
425+
426+ # Verify timezone is UTC
427+ assert result ["logical_date" ].tzinfo is not None , "logical_date should have timezone info"
428+
429+ def test_apply_datamodel_defaults_trigger_dag_run_with_value (self ):
430+ """Test _apply_datamodel_defaults preserves existing logical_date for TriggerDAGRunPostBody."""
431+ from datetime import datetime , timezone
432+
433+ from airflowctl .api .datamodels .generated import TriggerDAGRunPostBody
434+
435+ command_factory = CommandFactory ()
436+
437+ # Test with an existing logical_date value
438+ specific_date = datetime (2026 , 1 , 15 , 12 , 0 , 0 , tzinfo = timezone .utc )
439+ params = {"logical_date" : specific_date , "conf" : {}}
440+ result = command_factory ._apply_datamodel_defaults (TriggerDAGRunPostBody , params )
441+
442+ # Should preserve the provided value, not override it
443+ assert result ["logical_date" ] == specific_date , "logical_date should not be changed when already set"
444+
445+ def test_apply_datamodel_defaults_trigger_dag_run_without_logical_date (self ):
446+ """Test _apply_datamodel_defaults doesn't add logical_date if not present."""
447+ from airflowctl .api .datamodels .generated import TriggerDAGRunPostBody
448+
449+ command_factory = CommandFactory ()
450+
451+ # Test without logical_date key
452+ params = {"conf" : {}}
453+ result = command_factory ._apply_datamodel_defaults (TriggerDAGRunPostBody , params )
454+
455+ # Should not add logical_date if it wasn't in params
456+ assert "logical_date" not in result , "logical_date should not be added if not originally present"
457+
458+ def test_apply_datamodel_defaults_other_datamodel (self ):
459+ """Test _apply_datamodel_defaults doesn't modify params for other datamodels."""
460+ from airflowctl .api .datamodels .generated import BackfillPostBody
461+
462+ command_factory = CommandFactory ()
463+
464+ # Test with a different datamodel (BackfillPostBody)
465+ params = {"dag_id" : "test_dag" , "from_date" : None }
466+ result = command_factory ._apply_datamodel_defaults (BackfillPostBody , params )
467+
468+ # Should return params unchanged for other datamodels
469+ assert result == params , "Params should be unchanged for non-TriggerDAGRunPostBody datamodels"
0 commit comments