context69-sdk 0.5.0

Async Rust SDK for the Context69 HTTP API.
Documentation
use axum::http::{Method, StatusCode};
use context69_contracts::{SourceConfigInput, UpsertSourceConnectionRequest};
use serde_json::json;

use super::support::{client, spawn_empty, spawn_json};

fn source_json() -> serde_json::Value {
    json!({
        "group_key": "personal",
        "group_path": "personal",
        "visibility": "private",
        "source_key": "alerts/prod",
        "display_name": "Alerts",
        "description": null,
        "example_queries": [],
        "connection": "warehouse",
        "has_database_url": true,
        "origin_status": "connected",
        "origin_message": null,
        "sync_strategy": "incremental",
        "connector_type": "postgres_sql",
        "base_query": "select 1",
        "batch_size": 100,
        "last_cursor_updated_at": null,
        "last_cursor_external_id": null,
        "last_success_at": null
    })
}

fn source_request() -> SourceConfigInput {
    SourceConfigInput {
        source_key: "alerts/prod".to_string(),
        display_name: Some("Alerts".to_string()),
        description: None,
        example_queries: vec![],
        connection: "warehouse".to_string(),
        database_url: None,
        sync_strategy: "incremental".to_string(),
        connector_type: "postgres_sql".to_string(),
        base_query: "select 1".to_string(),
        batch_size: 100,
        visibility: None,
    }
}

#[tokio::test]
async fn sources_collection_creates() {
    let (base_url, captured) = spawn_json(StatusCode::CREATED, &source_json()).await;
    let source = client(&base_url)
        .sources()
        .create(&source_request())
        .await
        .expect("create source");
    let request = captured.await.expect("captured request");
    assert_eq!(source.source_key, "alerts/prod");
    assert_eq!(request.method, Method::POST);
    assert_eq!(request.uri.path(), "/v1/sources");
}

#[tokio::test]
async fn source_resource_encodes_key_on_update() {
    let (base_url, captured) = spawn_json(StatusCode::OK, &source_json()).await;
    client(&base_url)
        .source("alerts/prod")
        .update(&source_request())
        .await
        .expect("update source");
    let request = captured.await.expect("captured request");
    assert_eq!(request.method, Method::PUT);
    assert_eq!(request.uri.path(), "/v1/sources/alerts%2Fprod");
}

#[tokio::test]
async fn source_connections_update_uses_collection_endpoint() {
    let input = UpsertSourceConnectionRequest {
        name: "main/warehouse".to_string(),
        database_url: Some("postgres://example".to_string()),
    };
    let response = json!({
        "name": "main/warehouse",
        "has_database_url": true,
        "origin_status": "unknown",
        "origin_message": null
    });
    let (base_url, captured) = spawn_json(StatusCode::OK, &response).await;
    client(&base_url)
        .source_connections()
        .update(&input)
        .await
        .expect("update connection");
    let request = captured.await.expect("captured request");
    assert_eq!(request.method, Method::PUT);
    assert_eq!(request.uri.path(), "/v1/source-connections");
}

#[tokio::test]
async fn source_connection_delete_encodes_name() {
    let (base_url, captured) = spawn_empty(StatusCode::NO_CONTENT).await;
    client(&base_url)
        .source_connection("main/warehouse")
        .delete()
        .await
        .expect("delete connection");
    let request = captured.await.expect("captured request");
    assert_eq!(
        request.uri.path(),
        "/v1/source-connections/main%2Fwarehouse"
    );
}