mirror of https://github.com/buster-so/buster.git
173 lines
5.1 KiB
Rust
173 lines
5.1 KiB
Rust
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(())
|
|
}
|