Skip to content

Commit 996237c

Browse files
committed
test: add test coverage for metadata null handling
1 parent e2f156b commit 996237c

1 file changed

Lines changed: 105 additions & 0 deletions

File tree

  • crates/rig-core/src/providers/openai/responses_api

crates/rig-core/src/providers/openai/responses_api/mod.rs

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)