@@ -307,3 +307,56 @@ def test_reportingperiod_raises(field, value):
307307 data = {field : value }
308308 with pytest .raises (ValueError ):
309309 model = ReportingPeriodModel (** data )
310+
311+
312+ @pytest .mark .parametrize (
313+ ["time_to_validate" , "time_format" , "timezone_treatment" , "expected" ],
314+ [
315+ ["23:00:00" , "%H:%M:%S" , "forbid" , dt .time (23 , 0 , 0 )],
316+ ["11:00:00" , "%I:%M:%S" , "forbid" , dt .time (11 , 0 , 0 )],
317+ ["23:00:00Z" , None , "require" , dt .time (23 , 0 , 0 , tzinfo = UTC )],
318+ ["12:00:00Zam" , None , "permit" , dt .time (0 , 0 , 0 , tzinfo = UTC )],
319+ ["12:00:00pm" , None , "forbid" , dt .time (12 , 0 , 0 )],
320+ ["1970-01-01" , "%Y-%m-%d" , "forbid" , dt .time (0 , 0 )],
321+ # not great that it effectively returns incorrect time object here. However, this would be
322+ # down to user error in setting up the dischema.
323+ [dt .datetime (2025 , 12 , 1 , 13 , 0 , 5 ), "%H:%M:%S" , "forbid" , dt .time (13 , 0 , 5 )],
324+ [dt .datetime (2025 , 12 , 1 , 13 , 0 , 5 , tzinfo = UTC ), "%H:%M:%S" , "require" , dt .time (13 , 0 , 5 , tzinfo = UTC )],
325+ [dt .time (13 , 0 , 0 ), "%H:%M:%S" , "forbid" , dt .time (13 , 0 , 0 )],
326+ [dt .time (13 , 0 , 0 , tzinfo = UTC ), "%H:%M:%S" , "permit" , dt .time (13 , 0 , 0 , tzinfo = UTC )],
327+ [dt .time (13 , 0 , 0 , tzinfo = UTC ), "%H:%M:%S" , "require" , dt .time (13 , 0 , 0 , tzinfo = UTC )],
328+ ]
329+ )
330+ def test_formattedtime (
331+ time_to_validate : str | dt .datetime | dt .time ,
332+ time_format : str ,
333+ timezone_treatment : str ,
334+ expected : dt .time
335+ ):
336+ """Test serialised time objects can be parsed correctly when valid."""
337+ time_type = hct .formattedtime (time_format , timezone_treatment )
338+ assert time_type .validate (time_to_validate ) == expected
339+
340+
341+ @pytest .mark .parametrize (
342+ ["time_to_validate" , "time_format" , "timezone_treatment" ],
343+ [
344+ ["1970-01-01" , "%H:%M:%S" , "forbid" ,],
345+ ["1970-01-01" , "%H:%M:%S" , "forbid" ,],
346+ ["23:00:00" , "%I:%M:%S" , "permit" ,],
347+ ["23:00:00" , "%H:%M:%S" , "require" ,],
348+ ["23:00:00Z" , "%I:%M:%S" , "forbid" ,],
349+ [dt .datetime (2025 , 12 , 1 , 13 , 0 , 5 , tzinfo = UTC ), "%H:%M:%S" , "forbid" ,],
350+ [dt .time (13 , 0 , 5 , tzinfo = UTC ), "%H:%M:%S" , "forbid" ,]
351+ ]
352+ )
353+ def test_formattedtime_raises (
354+ time_to_validate : str | dt .datetime | dt .time , time_format : str , timezone_treatment : str
355+ ):
356+ """
357+ Test incorrect serialised objects can be handled correctly when attempting to parse into time
358+ objects.
359+ """
360+ time_type = hct .formattedtime (time_format , timezone_treatment )
361+ with pytest .raises (ValueError ):
362+ time_type .validate (time_to_validate ) # pylint: disable=W0106
0 commit comments