bamboo-server 2026.5.2

HTTP server and API layer for the Bamboo agent framework
Documentation
use crate::error::AppError;

use super::upstream::{build_provider_models_request, extract_model_ids};

#[test]
fn build_provider_models_request_constructs_openai_defaults() {
    let request =
        build_provider_models_request("openai", "sk-test", None).expect("openai request builds");
    assert_eq!(request.url, "https://api.openai.com/v1/models");
    assert_eq!(
        request.auth_header,
        Some(("Authorization", "Bearer sk-test".to_string()))
    );
}

#[test]
fn build_provider_models_request_constructs_gemini_base_url_query_auth() {
    let request = build_provider_models_request(
        "gemini",
        "g-key",
        Some("https://custom.googleapis.com/v1beta/models/"),
    )
    .expect("gemini request builds");
    assert_eq!(
        request.url,
        "https://custom.googleapis.com/v1beta/models?key=g-key"
    );
    assert!(request.auth_header.is_none());
}

#[test]
fn extract_model_ids_supports_openai_data_format() {
    let models = extract_model_ids(serde_json::json!({
        "data": [
            {"id": "gpt-4o"},
            {"id": "gpt-4.1-mini"}
        ]
    }))
    .expect("model extraction should succeed");

    assert_eq!(models, vec!["gpt-4o", "gpt-4.1-mini"]);
}

#[test]
fn extract_model_ids_supports_gemini_models_format() {
    let models = extract_model_ids(serde_json::json!({
        "models": [
            {"name": "models/gemini-2.0-flash"},
            {"id": "gemini-2.5-pro"},
            "gemini-custom"
        ]
    }))
    .expect("model extraction should succeed");

    assert_eq!(
        models,
        vec!["models/gemini-2.0-flash", "gemini-2.5-pro", "gemini-custom"]
    );
}

#[test]
fn extract_model_ids_errors_for_unexpected_shape() {
    let error =
        extract_model_ids(serde_json::json!({"unexpected": true})).expect_err("expected error");

    match error {
        AppError::InternalError(error) => {
            assert!(error.to_string().contains("Unexpected response format"))
        }
        other => panic!("unexpected error: {other}"),
    }
}