@@ -93,6 +93,30 @@ module ToParamTests =
9393 let result = toParam( box( None: DateOnly option))
9494 result |> shouldEqual null
9595
96+ [<Fact>]
97+ let ``toParam formats TimeOnly as HH : mm : ss.FFFFFFF`` () =
98+ let t = TimeOnly( 14 , 30 , 0 )
99+ let result = toParam( box t)
100+ result |> shouldEqual " 14:30:00"
101+
102+ [<Fact>]
103+ let ``toParam formats TimeOnly with sub - second precision`` () =
104+ let t = TimeOnly( 9 , 5 , 3 , 123 )
105+ let result = toParam( box t)
106+ // "HH:mm:ss.FFFFFFF" — trailing zeros stripped by F specifier
107+ result |> shouldEqual " 09:05:03.123"
108+
109+ [<Fact>]
110+ let ``toParam unwraps Some ( TimeOnly ) and formats correctly`` () =
111+ let t = TimeOnly( 8 , 0 , 0 )
112+ let result = toParam( box( Some t))
113+ result |> shouldEqual " 08:00:00"
114+
115+ [<Fact>]
116+ let ``toParam returns null for None ( TimeOnly ) ``() =
117+ let result = toParam( box( None: TimeOnly option))
118+ result |> shouldEqual null
119+
96120
97121module ToQueryParamsTests =
98122
@@ -351,6 +375,36 @@ module ToQueryParamsTests =
351375 let result = toQueryParams " dates" ( box values) stubClient
352376 result |> shouldEqual [ ( " dates" , " 2025-03-01" ) ]
353377
378+ [<Fact>]
379+ let ``toQueryParams handles TimeOnly`` () =
380+ let t = TimeOnly( 14 , 30 , 0 )
381+ let result = toQueryParams " time" ( box t) stubClient
382+ result |> shouldEqual [ ( " time" , " 14:30:00" ) ]
383+
384+ [<Fact>]
385+ let ``toQueryParams handles TimeOnly array`` () =
386+ let values : TimeOnly [] = [| TimeOnly( 9 , 0 , 0 ); TimeOnly( 17 , 30 , 0 ) |]
387+ let result = toQueryParams " times" ( box values) stubClient
388+ result |> shouldEqual [ ( " times" , " 09:00:00" ); ( " times" , " 17:30:00" ) ]
389+
390+ [<Fact>]
391+ let ``toQueryParams handles Option < TimeOnly > Some`` () =
392+ let t = TimeOnly( 12 , 0 , 0 )
393+ let result = toQueryParams " time" ( box( Some t)) stubClient
394+ result |> shouldEqual [ ( " time" , " 12:00:00" ) ]
395+
396+ [<Fact>]
397+ let ``toQueryParams handles Option < TimeOnly > None`` () =
398+ let result = toQueryParams " time" ( box( None: TimeOnly option)) stubClient
399+ result |> shouldEqual []
400+
401+ [<Fact>]
402+ let ``toQueryParams skips None items in Option < TimeOnly > array`` () =
403+ let t = TimeOnly( 8 , 0 , 0 )
404+ let values : Option < TimeOnly >[] = [| Some t; None |]
405+ let result = toQueryParams " times" ( box values) stubClient
406+ result |> shouldEqual [ ( " times" , " 08:00:00" ) ]
407+
354408
355409module CombineUrlTests =
356410
@@ -779,6 +833,19 @@ module ToFormUrlEncodedContentTests =
779833 decodedValue |> shouldEqual " 2025-07-04"
780834 }
781835
836+ [<Fact>]
837+ let ``toFormUrlEncodedContent formats TimeOnly as HH : mm : ss.FFFFFFF`` () =
838+ task {
839+ let t = TimeOnly( 9 , 5 , 3 , 123 )
840+ use content = toFormUrlEncodedContent( seq { ( " time" , box t) })
841+
842+ let! body = content.ReadAsStringAsync()
843+ let encodedValue = body.Substring( " time=" .Length)
844+ let decodedValue = WebUtility.UrlDecode( encodedValue)
845+
846+ decodedValue |> shouldEqual " 09:05:03.123"
847+ }
848+
782849 [<Fact>]
783850 let ``toFormUrlEncodedContent skips values when toParam returns null`` () =
784851 task {
@@ -867,6 +934,16 @@ module ToMultipartFormDataContentTests =
867934 body |> shouldEqual " 2025-07-04"
868935 }
869936
937+ [<Fact>]
938+ let ``toMultipartFormDataContent formats TimeOnly as HH : mm : ss.FFFFFFF`` () =
939+ task {
940+ let t = TimeOnly( 9 , 5 , 3 , 123 )
941+ use content = toMultipartFormDataContent( seq { ( " time" , box t) })
942+ let part = content |> Seq.exactlyOne
943+ let! body = part.ReadAsStringAsync()
944+ body |> shouldEqual " 09:05:03.123"
945+ }
946+
870947 [<Fact>]
871948 let ``toMultipartFormDataContent skips values when toParam returns null`` () =
872949 task {
0 commit comments