@@ -2073,4 +2073,109 @@ mod tests {
20732073 assert ! ( json[ "content" ] [ 0 ] . get( "file_data" ) . is_none( ) ) ;
20742074 assert ! ( json[ "content" ] [ 0 ] . get( "file_url" ) . is_none( ) ) ;
20752075 }
2076+
2077+ fn response_with_metadata ( metadata : Option < Value > ) -> Value {
2078+ let mut base = json ! ( {
2079+ "id" : "resp_123" ,
2080+ "object" : "response" ,
2081+ "created_at" : 0 ,
2082+ "status" : "completed" ,
2083+ "model" : "gpt-5.4" ,
2084+ "output" : [ ] ,
2085+ } ) ;
2086+ if let Some ( value) = metadata {
2087+ base[ "metadata" ] = value;
2088+ }
2089+ base
2090+ }
2091+
2092+ #[ test]
2093+ fn completion_response_deserializes_null_metadata ( ) {
2094+ let response: CompletionResponse =
2095+ serde_json:: from_value ( response_with_metadata ( Some ( Value :: Null ) ) )
2096+ . expect ( "response with metadata: null should deserialize" ) ;
2097+
2098+ assert ! ( response. additional_parameters. metadata. is_none( ) ) ;
2099+ }
2100+
2101+ #[ test]
2102+ fn completion_response_deserializes_empty_object_metadata ( ) {
2103+ let response: CompletionResponse =
2104+ serde_json:: from_value ( response_with_metadata ( Some ( json ! ( { } ) ) ) )
2105+ . expect ( "response with metadata: {} should deserialize" ) ;
2106+
2107+ assert_eq ! (
2108+ response
2109+ . additional_parameters
2110+ . metadata
2111+ . as_ref( )
2112+ . map( |m| m. len( ) ) ,
2113+ Some ( 0 )
2114+ ) ;
2115+ }
2116+
2117+ #[ test]
2118+ fn completion_response_deserializes_object_metadata ( ) {
2119+ let response: CompletionResponse =
2120+ serde_json:: from_value ( response_with_metadata ( Some ( json ! ( { "key" : "value" } ) ) ) )
2121+ . expect ( "response with metadata: {\" key\" : \" value\" } should deserialize" ) ;
2122+
2123+ let metadata = response
2124+ . additional_parameters
2125+ . metadata
2126+ . expect ( "metadata should be Some" ) ;
2127+ assert_eq ! (
2128+ metadata. get( "key" ) . and_then( |v| v. as_str( ) ) ,
2129+ Some ( "value" )
2130+ ) ;
2131+ }
2132+
2133+ #[ test]
2134+ fn completion_response_deserializes_missing_metadata ( ) {
2135+ let response: CompletionResponse =
2136+ serde_json:: from_value ( response_with_metadata ( None ) )
2137+ . expect ( "response without metadata should deserialize" ) ;
2138+
2139+ assert ! ( response. additional_parameters. metadata. is_none( ) ) ;
2140+ }
2141+
2142+ #[ test]
2143+ fn additional_parameters_skips_none_metadata_on_serialize ( ) {
2144+ let params = AdditionalParameters {
2145+ metadata : None ,
2146+ ..Default :: default ( )
2147+ } ;
2148+
2149+ let json = serde_json:: to_value ( params) . expect ( "should serialize" ) ;
2150+ assert ! (
2151+ !json. as_object( ) . unwrap( ) . contains_key( "metadata" ) ,
2152+ "metadata should not be present when None"
2153+ ) ;
2154+ }
2155+
2156+ #[ test]
2157+ fn additional_parameters_serializes_some_metadata ( ) {
2158+ let mut map = Map :: new ( ) ;
2159+ map. insert ( "key" . to_string ( ) , Value :: String ( "value" . to_string ( ) ) ) ;
2160+ let params = AdditionalParameters {
2161+ metadata : Some ( map) ,
2162+ ..Default :: default ( )
2163+ } ;
2164+
2165+ let json = serde_json:: to_value ( params) . expect ( "should serialize" ) ;
2166+ let obj = json. as_object ( ) . unwrap ( ) ;
2167+ assert ! ( obj. contains_key( "metadata" ) , "metadata should be present" ) ;
2168+ assert_eq ! ( obj[ "metadata" ] [ "key" ] , "value" ) ;
2169+ }
2170+
2171+ #[ test]
2172+ fn additional_parameters_deserializes_null_metadata ( ) {
2173+ let json = json ! ( {
2174+ "metadata" : null,
2175+ } ) ;
2176+
2177+ let params: AdditionalParameters =
2178+ serde_json:: from_value ( json) . expect ( "should deserialize metadata: null" ) ;
2179+ assert ! ( params. metadata. is_none( ) ) ;
2180+ }
20762181}
0 commit comments