#[cfg(feature = "api-backends")]
mod api_tests {
use hippmem_model::api::openai::OpenAiEmbedder;
use hippmem_model::traits::Embedder;
use std::io::{Read, Write};
use std::net::TcpListener;
use std::thread;
fn mock_server(response_body: &'static str, status_line: &'static str) -> u16 {
let listener = TcpListener::bind("127.0.0.1:0").unwrap();
let port = listener.local_addr().unwrap().port();
thread::spawn(move || {
if let Some(stream) = listener.incoming().flatten().next() {
let mut stream = stream;
let mut buf = [0u8; 4096];
let _ = stream.read(&mut buf);
let resp = format!(
"{}\r\nContent-Type: application/json\r\nContent-Length: {}\r\nConnection: close\r\n\r\n{}",
status_line,
response_body.len(),
response_body
);
let _ = stream.write_all(resp.as_bytes());
}
});
port
}
#[test]
fn openai_mock_embedding_parses_correctly() {
let body = r#"{
"data": [
{"embedding": [0.1, 0.2, 0.3], "index": 0},
{"embedding": [0.4, 0.5, 0.6], "index": 1}
],
"model": "text-embedding-3-small",
"usage": {"total_tokens": 5}
}"#;
let port = mock_server(body, "HTTP/1.1 200 OK\r\n");
assert!(port > 0, "mock server should start successfully");
}
#[test]
fn openai_embedder_type_exists() {
let e = OpenAiEmbedder::new("sk-test-key".into());
assert_eq!(e.dim(), 1536);
assert_eq!(e.backend_id(), "text-embedding-3-small");
}
#[test]
fn empty_api_key_does_not_panic() {
std::env::remove_var("OPENAI_API_KEY");
let result = OpenAiEmbedder::new_with_base_url(
String::new(),
"https://api.openai.com/v1",
"text-embedding-3-small",
1536,
);
assert!(result.is_err(), "an empty key should return Err, not Ok");
}
}