aurabase 0.1.1

Official Rust SDK for Aurabase: high-performance open-source Backend-as-a-Service (BaaS)
Documentation
//! B16 — `nl2sql` n'a pas le droit d'émettre `schema`.
//!
//! Mesuré sur banc réel (k3d `aurabase`, 2026-08-03) : le corps que ce SDK
//! envoyait — `{"question": "...", "schema": "todos(id uuid, title text)", …}` —
//! rend **HTTP 400** :
//!
//! > Le champ `schema` n'est pas accepté par NL2SQL : le schéma interrogé est
//! > introspecté depuis la base du projet, car lui seul fait autorité sur ce qui
//! > existe réellement. Retirez `schema` de la requête.
//!
//! La garde serveur (`Nl2SqlRequest::reject_server_owned_fields`, appelée en tout
//! premier dans `services/aura-ai/src/handlers/nl2sql.rs`) s'exécute avant la
//! résolution du tenant et avant tout appel au modèle. Le même corps SANS `schema`
//! la franchit. `nl2sql` était donc **cassé à 100 %** dans ce SDK, pas dégradé.

use aurabase::create_client;
use wiremock::matchers::{method, path};
use wiremock::{Mock, MockServer, Request, ResponseTemplate};

fn test_client(base_url: &str) -> aurabase::AuraClient {
    create_client(base_url, "aura_anon_test", None)
}

#[tokio::test]
async fn nl2sql_n_emet_jamais_le_champ_schema() {
    let server = MockServer::start().await;
    Mock::given(method("POST"))
        .and(path("/v1/ai/nl2sql"))
        .respond_with(ResponseTemplate::new(200).set_body_json(serde_json::json!({
            "data": { "sql": "SELECT 1 LIMIT 100", "limit": 100, "limit_injected": true }
        })))
        .mount(&server)
        .await;

    let client = test_client(&server.uri());
    client
        .ai()
        .nl2sql(
            "combien de todos",
            Some(aurabase::services::ai::Nl2SqlOptions {
                dialect: Some("postgres".to_string()),
                ..Default::default()
            }),
        )
        .await
        .expect("nl2sql() a échoué au transport");

    let requests: Vec<Request> = server.received_requests().await.expect("aucune requête");
    let body: serde_json::Value =
        serde_json::from_slice(&requests[0].body).expect("corps non JSON");
    let obj = body.as_object().expect("corps non objet");

    assert!(
        !obj.contains_key("schema"),
        "le serveur refuse `schema` en 400 — le SDK ne doit plus l'émettre ; corps = {body}"
    );
    assert!(!obj.contains_key("allowed_schema"), "corps = {body}");
    assert!(!obj.contains_key("schema_context"), "corps = {body}");
    assert_eq!(
        obj.get("question").and_then(|v| v.as_str()),
        Some("combien de todos")
    );
    assert_eq!(
        obj.get("dialect").and_then(|v| v.as_str()),
        Some("postgres")
    );
}