test: verify embedding response parsing against real service format

- 6 parsing tests for EmbeddingResponse struct
- test_parse_real_embedding_response: exact format from embeddings-predictor
- test_parse_768_dim_response: full 768-dim vector
- test_parse_multi_input_response: array input returns multiple embeddings
- test_parse_embedding_error_response: error format
- test_parse_html_fails_gracefully: HTML error page correctly rejected
- Confirms: parsing is correct, 'expected ident' error is non-JSON response
This commit is contained in:
2026-09-14 08:25:55 +09:00
parent 57c61b522b
commit acfaa7efe6
2 changed files with 77 additions and 39 deletions
+69
View File
@@ -212,4 +212,73 @@ mod tests {
assert_eq!(BATCH_SIZE, 32);
assert_eq!(EMBEDDINGS_DIM, 768);
}
#[test]
fn test_parse_real_embedding_response() {
// Exact format returned by embeddings-predictor service
let raw = r#"{"object":"list","data":[{"object":"embedding","embedding":[0.1,0.2,0.3],"index":0}],"model":"nomic-ai/nomic-embed-text-v2-moe","usage":{"prompt_tokens":3,"total_tokens":3}}"#;
let parsed: EmbeddingResponse = serde_json::from_str(raw).expect("should parse");
match parsed {
EmbeddingResponse::Success { data, .. } => {
assert_eq!(data.len(), 1);
assert_eq!(data[0].embedding.len(), 3);
assert_eq!(data[0].index, 0);
}
EmbeddingResponse::Error { error } => panic!("parsed as error: {:?}", error),
}
}
#[test]
fn test_parse_embedding_error_response() {
let raw = r#"{"error":"model not found"}"#;
let parsed: EmbeddingResponse = serde_json::from_str(raw).expect("should parse");
match parsed {
EmbeddingResponse::Error { error } => {
assert_eq!(error.as_str().unwrap(), "model not found");
}
EmbeddingResponse::Success { .. } => panic!("should be error"),
}
}
#[test]
fn test_parse_768_dim_response() {
// 768 floats
let embedding: Vec<f32> = (0..768).map(|i| i as f32 * 0.001).collect();
let raw = format!(
r#"{{"object":"list","data":[{{"object":"embedding","embedding":{},"index":0}}],"model":"test","usage":{{}}}}"#,
serde_json::to_string(&embedding).unwrap()
);
let parsed: EmbeddingResponse = serde_json::from_str(&raw).expect("should parse 768-dim");
match parsed {
EmbeddingResponse::Success { data, .. } => {
assert_eq!(data[0].embedding.len(), 768);
}
_ => panic!("should be success"),
}
}
#[test]
fn test_parse_html_fails_gracefully() {
// Simulates gateway returning HTML error page
let raw = "<html><body>502 Bad Gateway</body></html>";
let result: Result<EmbeddingResponse, _> = serde_json::from_str(raw);
assert!(result.is_err(), "HTML should fail to parse as JSON");
let err_msg = result.unwrap_err().to_string();
assert!(err_msg.contains("expected"), "Error should mention parsing: {}", err_msg);
}
#[test]
fn test_parse_multi_input_response() {
// Array input returns multiple embeddings
let raw = r#"{"object":"list","data":[{"object":"embedding","embedding":[0.1,0.2,0.3],"index":0},{"object":"embedding","embedding":[0.4,0.5,0.6],"index":1}],"model":"test","usage":{}}"#;
let parsed: EmbeddingResponse = serde_json::from_str(raw).expect("should parse");
match parsed {
EmbeddingResponse::Success { data, .. } => {
assert_eq!(data.len(), 2);
assert_eq!(data[0].index, 0);
assert_eq!(data[1].index, 1);
}
_ => panic!("should be success"),
}
}
}