@@ -368,7 +368,7 @@ def test_safe_mode_heuristic_match(self, tmp_path):
368368 dagbag = DagBag (include_examples = False , safe_mode = True )
369369
370370 assert len (dagbag .dagbag_stats ) == 1
371- assert dagbag .dagbag_stats [0 ].file == f"/ { path .name } "
371+ assert dagbag .dagbag_stats [0 ].file == path .name
372372
373373 def test_safe_mode_heuristic_mismatch (self , tmp_path ):
374374 """
@@ -388,7 +388,65 @@ def test_safe_mode_disabled(self, tmp_path):
388388 with conf_vars ({("core" , "dags_folder" ): os .fspath (path .parent )}):
389389 dagbag = DagBag (include_examples = False , safe_mode = False )
390390 assert len (dagbag .dagbag_stats ) == 1
391- assert dagbag .dagbag_stats [0 ].file == f"/{ path .name } "
391+ assert dagbag .dagbag_stats [0 ].file == path .name
392+
393+ def test_dagbag_stats_file_is_relative_path_with_mixed_separators (self , tmp_path ):
394+ """
395+ Test that dagbag_stats.file contains a relative path even when DAGS_FOLDER
396+ and filepath have different path separators (simulates Windows behavior).
397+
398+ On Windows, settings.DAGS_FOLDER may use forward slashes (e.g., 'C:/foo/dags')
399+ while filepath from os.path operations uses backslashes (e.g., 'C:\\ foo\\ dags\\ my_dag.py').
400+ This test verifies that path normalization works correctly in such cases.
401+
402+ See: https://github.com/apache/airflow/issues/XXXXX
403+ """
404+ path = tmp_path / "testfile.py"
405+ path .write_text ("# airflow\n # DAG" )
406+
407+ # Simulate the Windows scenario where DAGS_FOLDER has forward slashes
408+ # but the filesystem returns paths with backslashes
409+ dags_folder_with_forward_slashes = path .parent .as_posix ()
410+ with conf_vars ({("core" , "dags_folder" ): dags_folder_with_forward_slashes }):
411+ dagbag = DagBag (include_examples = False , safe_mode = True )
412+
413+ assert len (dagbag .dagbag_stats ) == 1
414+ assert dagbag .dagbag_stats [0 ].file == path .name
415+
416+ def test_dagbag_stats_includes_bundle_info (self , tmp_path ):
417+ """Test that FileLoadStat includes bundle_path and bundle_name from DagBag."""
418+ path = tmp_path / "testfile.py"
419+ path .write_text ("# airflow\n # DAG" )
420+
421+ bundle_path = tmp_path / "bundle"
422+ bundle_path .mkdir ()
423+ bundle_name = "test_bundle"
424+
425+ with conf_vars ({("core" , "dags_folder" ): os .fspath (path .parent )}):
426+ dagbag = DagBag (
427+ include_examples = False ,
428+ safe_mode = True ,
429+ bundle_path = bundle_path ,
430+ bundle_name = bundle_name ,
431+ )
432+
433+ assert len (dagbag .dagbag_stats ) == 1
434+ stat = dagbag .dagbag_stats [0 ]
435+ assert stat .bundle_path == bundle_path
436+ assert stat .bundle_name == bundle_name
437+
438+ def test_dagbag_stats_bundle_info_none_when_not_provided (self , tmp_path ):
439+ """Test that FileLoadStat has None for bundle_path and bundle_name when not provided."""
440+ path = tmp_path / "testfile.py"
441+ path .write_text ("# airflow\n # DAG" )
442+
443+ with conf_vars ({("core" , "dags_folder" ): os .fspath (path .parent )}):
444+ dagbag = DagBag (include_examples = False , safe_mode = True )
445+
446+ assert len (dagbag .dagbag_stats ) == 1
447+ stat = dagbag .dagbag_stats [0 ]
448+ assert stat .bundle_path is None
449+ assert stat .bundle_name is None
392450
393451 def test_process_file_that_contains_multi_bytes_char (self , tmp_path ):
394452 """
0 commit comments