11import base64
22import os
3+ import re
34from argparse import ArgumentTypeError
4- from datetime import datetime , timezone
5+ from datetime import datetime , timedelta , timezone
56
67import pytest
78
1617 format_file_size ,
1718 parse_file_size ,
1819 interval ,
20+ int_or_interval ,
1921 partial_format ,
2022 clean_lines ,
2123 format_line ,
@@ -351,6 +353,7 @@ def test_format_timedelta():
351353@pytest .mark .parametrize (
352354 "timeframe, num_secs" ,
353355 [
356+ ("0S" , 0 ),
354357 ("5S" , 5 ),
355358 ("2M" , 2 * 60 ),
356359 ("1H" , 60 * 60 ),
@@ -367,9 +370,9 @@ def test_interval(timeframe, num_secs):
367370@pytest .mark .parametrize (
368371 "invalid_interval, error_tuple" ,
369372 [
370- ("H" , ('Invalid number "": expected positive integer' ,)),
371- ("-1d" , ('Invalid number "-1": expected positive integer' ,)),
372- ("food" , ('Invalid number "foo": expected positive integer' ,)),
373+ ("H" , ('Invalid number "": expected nonnegative integer' ,)),
374+ ("-1d" , ('Invalid number "-1": expected nonnegative integer' ,)),
375+ ("food" , ('Invalid number "foo": expected nonnegative integer' ,)),
373376 ],
374377)
375378def test_interval_time_unit (invalid_interval , error_tuple ):
@@ -378,10 +381,49 @@ def test_interval_time_unit(invalid_interval, error_tuple):
378381 assert exc .value .args == error_tuple
379382
380383
381- def test_interval_number ():
384+ @pytest .mark .parametrize (
385+ "invalid_input, error_regex" ,
386+ [
387+ ("x" , r'^Unexpected time unit "x": choose from' ),
388+ ("-1t" , r'^Unexpected time unit "t": choose from' ),
389+ ("fool" , r'^Unexpected time unit "l": choose from' ),
390+ ("abc" , r'^Unexpected time unit "c": choose from' ),
391+ (" abc " , r'^Unexpected time unit " ": choose from' ),
392+ ],
393+ )
394+ def test_interval_invalid_time_format (invalid_input , error_regex ):
395+ with pytest .raises (ArgumentTypeError ) as exc :
396+ interval (invalid_input )
397+ assert re .search (error_regex , exc .value .args [0 ])
398+
399+
400+ @pytest .mark .parametrize (
401+ "input, result" ,
402+ [
403+ ("0" , 0 ),
404+ ("5" , 5 ),
405+ (" 999 " , 999 ),
406+ ("0S" , timedelta (seconds = 0 )),
407+ ("5S" , timedelta (seconds = 5 )),
408+ ("1m" , timedelta (days = 31 )),
409+ ],
410+ )
411+ def test_int_or_interval (input , result ):
412+ assert int_or_interval (input ) == result
413+
414+
415+ @pytest .mark .parametrize (
416+ "invalid_input, error_regex" ,
417+ [
418+ ("H" , r"Value is neither an integer nor an interval:" ),
419+ ("-1d" , r"Value is neither an integer nor an interval:" ),
420+ ("food" , r"Value is neither an integer nor an interval:" ),
421+ ],
422+ )
423+ def test_int_or_interval_time_unit (invalid_input , error_regex ):
382424 with pytest .raises (ArgumentTypeError ) as exc :
383- interval ( "5" )
384- assert exc .value .args == ( 'Unexpected time unit "5": choose from y, m, w, d, H, M, S' , )
425+ int_or_interval ( invalid_input )
426+ assert re . search ( error_regex , exc .value .args [ 0 ] )
385427
386428
387429def test_parse_timestamp ():
0 commit comments