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();
}