browserbase 0.1.0

Rust SDK for Browserbase - cloud browser automation platform
Documentation
use browserbase::{Browserbase, models::CreateContextRequest};
use serde_json::json;
use wiremock::{
    Mock, MockServer, ResponseTemplate,
    matchers::{body_json, header, method, path},
};

#[tokio::test]
async fn create_context_posts_project_id() {
    let server = MockServer::start().await;
    let base_url = format!("{}/v1/", server.uri());

    Mock::given(method("POST"))
        .and(path("/v1/contexts"))
        .and(header("X-BB-API-Key", "test-key"))
        .and(body_json(json!({"projectId": "proj_123"})))
        .respond_with(ResponseTemplate::new(201).set_body_json(json!({
            "id": "ctx_1",
            "projectId": "proj_123",
            "uploadUrl": "https://example/upload",
            "publicKey": "pk",
            "cipherAlgorithm": "AES-256-CBC",
            "initializationVectorSize": 16
        })))
        .mount(&server)
        .await;

    let bb = Browserbase::builder("test-key")
        .unwrap()
        .base_url(&base_url)
        .unwrap()
        .build()
        .unwrap();

    let ctx = bb
        .contexts()
        .create(CreateContextRequest::new("proj_123"))
        .await
        .unwrap();

    assert_eq!(ctx.id, "ctx_1");
    assert_eq!(ctx.project_id.as_deref(), Some("proj_123"));
    assert_eq!(ctx.cipher_algorithm.as_deref(), Some("AES-256-CBC"));
}

#[tokio::test]
async fn list_contexts_returns_all_contexts() {
    let server = MockServer::start().await;
    let base_url = format!("{}/v1/", server.uri());

    Mock::given(method("GET"))
        .and(path("/v1/contexts"))
        .and(header("X-BB-API-Key", "test-key"))
        .respond_with(ResponseTemplate::new(200).set_body_json(json!([
            {"id": "ctx_1", "projectId": "proj_123"},
            {"id": "ctx_2", "projectId": "proj_123"}
        ])))
        .mount(&server)
        .await;

    let bb = Browserbase::builder("test-key")
        .unwrap()
        .base_url(&base_url)
        .unwrap()
        .build()
        .unwrap();

    let contexts = bb.contexts().list().await.unwrap();
    assert_eq!(contexts.len(), 2);
    assert_eq!(contexts[0].id, "ctx_1");
    assert_eq!(contexts[1].id, "ctx_2");
}

#[tokio::test]
async fn get_context_returns_context_details() {
    let server = MockServer::start().await;
    let base_url = format!("{}/v1/", server.uri());

    Mock::given(method("GET"))
        .and(path("/v1/contexts/ctx_1"))
        .and(header("X-BB-API-Key", "test-key"))
        .respond_with(ResponseTemplate::new(200).set_body_json(json!({
            "id": "ctx_1",
            "projectId": "proj_123",
            "uploadUrl": "https://example/upload",
            "initializationVectorSize": 16
        })))
        .mount(&server)
        .await;

    let bb = Browserbase::builder("test-key")
        .unwrap()
        .base_url(&base_url)
        .unwrap()
        .build()
        .unwrap();

    let ctx = bb.contexts().get("ctx_1").await.unwrap();
    assert_eq!(ctx.id, "ctx_1");
    assert_eq!(ctx.initialization_vector_size, Some(16));
}

#[tokio::test]
async fn update_context_sends_put_request() {
    use browserbase::models::UpdateContextRequest;

    let server = MockServer::start().await;
    let base_url = format!("{}/v1/", server.uri());

    Mock::given(method("PUT"))
        .and(path("/v1/contexts/ctx_1"))
        .and(header("X-BB-API-Key", "test-key"))
        .respond_with(ResponseTemplate::new(200).set_body_json(json!({
            "id": "ctx_1",
            "uploadUrl": "https://example/upload",
            "publicKey": "new_pk"
        })))
        .mount(&server)
        .await;

    let bb = Browserbase::builder("test-key")
        .unwrap()
        .base_url(&base_url)
        .unwrap()
        .build()
        .unwrap();

    let req = UpdateContextRequest::new().upload_url("https://example/upload");
    let ctx = bb.contexts().update("ctx_1", req).await.unwrap();
    assert_eq!(ctx.id, "ctx_1");
}

#[tokio::test]
async fn delete_context_returns_unit() {
    let server = MockServer::start().await;
    let base_url = format!("{}/v1/", server.uri());

    Mock::given(method("DELETE"))
        .and(path("/v1/contexts/ctx_1"))
        .and(header("X-BB-API-Key", "test-key"))
        .respond_with(ResponseTemplate::new(204))
        .mount(&server)
        .await;

    let bb = Browserbase::builder("test-key")
        .unwrap()
        .base_url(&base_url)
        .unwrap()
        .build()
        .unwrap();

    bb.contexts().delete("ctx_1").await.unwrap();
}