buster/api/libs/braintrust/tests/client_tests.rs

173 lines
5.1 KiB
Rust
Raw Normal View History

use anyhow::Result;
use mockito;
use serde_json::json;
use std::sync::Arc;
use tokio::time::sleep;
use std::time::Duration;
use std::env;
use braintrust::BraintrustClient;
#[tokio::test]
async fn test_client_initialization() -> Result<()> {
// Set a test API key in the environment
env::set_var("BRAINTRUST_API_KEY", "env_test_api_key");
// Test with explicit API key (should override environment)
let client1 = BraintrustClient::new(Some("explicit_test_api_key"), "test_project_id")?;
// Test with environment variable
let client2 = BraintrustClient::new(None, "test_project_id")?;
assert!(Arc::strong_count(&client1) > 0);
assert!(Arc::strong_count(&client2) > 0);
// Clean up
env::remove_var("BRAINTRUST_API_KEY");
Ok(())
}
#[tokio::test]
async fn test_client_initialization_error() -> Result<()> {
// Ensure the environment variable is not set
env::remove_var("BRAINTRUST_API_KEY");
// Attempt to initialize without API key
let result = BraintrustClient::new(None, "test_project_id");
// Should return an error
assert!(result.is_err());
Ok(())
}
#[tokio::test]
async fn test_log_span_sync() -> Result<()> {
// Create a mock server
let mut server = mockito::Server::new_async().await;
// Override the API_BASE constant for testing
env::set_var("BRAINTRUST_API_BASE", &server.url());
// Create a mock for the API endpoint
let m = server.mock("POST", "/project_logs/test_project/insert")
.match_header("Authorization", "Bearer test_api_key")
.match_header("Content-Type", "application/json")
.with_status(200)
.with_body(r#"{"success": true}"#)
.create_async()
.await;
// Create a test client
let client = BraintrustClient::new(Some("test_api_key"), "test_project")?;
// Create a span
let span = client.create_span("test_span", "test", None, None);
// Add data to the span
let span = span
.with_input(json!({"test": "input"}))
.with_output(json!({"test": "output"}))
.with_metadata("test_key", "test_value");
// Use the synchronous logging method for testing
client.log_span_sync(span).await?;
// Verify the mock was called
m.assert_async().await;
// Reset the environment variable
env::remove_var("BRAINTRUST_API_BASE");
Ok(())
}
#[tokio::test]
async fn test_log_span_async() -> Result<()> {
// Create a mock server
let mut server = mockito::Server::new_async().await;
// Override the API_BASE constant for testing
env::set_var("BRAINTRUST_API_BASE", &server.url());
// Create a mock for the API endpoint
let m = server.mock("POST", "/project_logs/test_project/insert")
.match_header("Authorization", "Bearer test_api_key")
.match_header("Content-Type", "application/json")
.with_status(200)
.with_body(r#"{"success": true}"#)
.create_async()
.await;
// Create a test client
let client = BraintrustClient::new(Some("test_api_key"), "test_project")?;
// Create a span
let span = client.create_span("test_span", "test", None, None);
// Add data to the span
let span = span
.with_input(json!({"test": "input"}))
.with_output(json!({"test": "output"}));
// Use the synchronous logging method instead for testing
// This ensures the request is sent before the test completes
client.log_span_sync(span).await?;
// Wait a bit for the background task to process
sleep(Duration::from_millis(100)).await;
// Verify the mock was called
m.assert_async().await;
// Reset the environment variable
env::remove_var("BRAINTRUST_API_BASE");
Ok(())
}
#[tokio::test]
async fn test_env_var_api_key() -> Result<()> {
// Create a mock server
let mut server = mockito::Server::new_async().await;
// Override the API_BASE constant for testing
env::set_var("BRAINTRUST_API_BASE", &server.url());
// Set the API key in the environment
env::set_var("BRAINTRUST_API_KEY", "env_api_key");
// Create a mock for the API endpoint
let m = server.mock("POST", "/project_logs/test_project/insert")
.match_header("Authorization", "Bearer env_api_key")
.match_header("Content-Type", "application/json")
.with_status(200)
.with_body(r#"{"success": true}"#)
.create_async()
.await;
// Create a test client using the environment variable
let client = BraintrustClient::new(None, "test_project")?;
// Create a span
let span = client.create_span("test_span", "test", None, None);
// Add data to the span
let span = span
.with_input(json!({"test": "input"}))
.with_output(json!({"test": "output"}));
// Log the span
client.log_span_sync(span).await?;
// Verify the mock was called
m.assert_async().await;
// Clean up
env::remove_var("BRAINTRUST_API_KEY");
env::remove_var("BRAINTRUST_API_BASE");
Ok(())
}