@@ -401,6 +401,13 @@ def documentation_url(cls) -> AnyUrl:
401401 set (),
402402 id = "all_csvs_modified_before_start_date" ,
403403 ),
404+ pytest .param (
405+ ["**/*.csv" ],
406+ {"start_date" : "2023-06-01T03:54:07Z" , "streams" : []},
407+ {"a.csv" , "a/b.csv" , "a/c.csv" , "a/b/c.csv" , "a/c/c.csv" , "a/b/c/d.csv" },
408+ set (),
409+ id = "all_csvs_start_date_without_microseconds" ,
410+ ),
404411 pytest .param (
405412 ["**/*.csv" ],
406413 {"start_date" : "2023-06-05T03:54:07.000Z" , "streams" : []},
@@ -494,6 +501,63 @@ def test_preserve_sub_directories_scenarios(
494501 assert file_paths [AbstractFileBasedStreamReader .FILE_FOLDER ] == path .dirname (source_file_path )
495502
496503
504+ @pytest .mark .parametrize (
505+ "start_date_str, expected" ,
506+ [
507+ pytest .param (
508+ "2025-01-01T00:00:00.000000Z" ,
509+ datetime (2025 , 1 , 1 , 0 , 0 , 0 ),
510+ id = "with_microseconds_zero" ,
511+ ),
512+ pytest .param (
513+ "2025-06-15T12:30:45.123456Z" ,
514+ datetime (2025 , 6 , 15 , 12 , 30 , 45 , 123456 ),
515+ id = "with_microseconds_nonzero" ,
516+ ),
517+ pytest .param (
518+ "2025-01-01T00:00:00Z" ,
519+ datetime (2025 , 1 , 1 , 0 , 0 , 0 ),
520+ id = "without_microseconds" ,
521+ ),
522+ pytest .param (
523+ "2025-12-31T23:59:59Z" ,
524+ datetime (2025 , 12 , 31 , 23 , 59 , 59 ),
525+ id = "without_microseconds_end_of_day" ,
526+ ),
527+ pytest .param (
528+ "2025-01-01" ,
529+ datetime (2025 , 1 , 1 , 0 , 0 , 0 ),
530+ id = "date_only_ab_datetime_parse_fallback" ,
531+ ),
532+ pytest .param (
533+ "2025-01-01T00:00:00+05:30" ,
534+ datetime (2024 , 12 , 31 , 18 , 30 , 0 ),
535+ id = "with_timezone_offset_converted_to_utc" ,
536+ ),
537+ ],
538+ )
539+ def test_parse_start_date (start_date_str : str , expected : datetime ) -> None :
540+ reader = TestStreamReader ()
541+ assert reader ._parse_start_date (start_date_str ) == expected
542+
543+
544+ def test_parse_start_date_respects_overridden_date_time_format () -> None :
545+ """Verify that subclasses overriding DATE_TIME_FORMAT are honored by _parse_start_date."""
546+
547+ class CustomFormatReader (TestStreamReader ):
548+ DATE_TIME_FORMAT = "custom:%Y/%m/%d %H:%M:%S"
549+
550+ reader = CustomFormatReader ()
551+
552+ assert reader ._parse_start_date ("custom:2025/01/01 00:00:00" ) == datetime (2025 , 1 , 1 , 0 , 0 , 0 )
553+
554+
555+ def test_parse_start_date_invalid_raises () -> None :
556+ reader = TestStreamReader ()
557+ with pytest .raises (ValueError ):
558+ reader ._parse_start_date ("not-a-date" )
559+
560+
497561def test_upload_with_file_transfer_reader ():
498562 stream_reader = TestStreamReaderWithDefaultUpload ()
499563
0 commit comments