apibrasil 1.0.0

SDK oficial Rust da plataforma APIBrasil: WhatsApp, SMS, consultas de CPF/CNPJ, veiculos, CEP, correios, pagamentos PIX/boleto e mais.
Documentation
//! Testes de contrato: batem no gateway real, então só rodam com
//! `APIBRASIL_CONTRACT=1` (as rotas usadas aqui são públicas).
//!
//! ```bash
//! APIBRASIL_CONTRACT=1 cargo test --test contract -- --nocapture
//! ```

use std::time::Duration;

use apibrasil::{ApiBrasil, Config};

fn sem_contrato() -> bool {
    if std::env::var("APIBRASIL_CONTRACT").as_deref() == Ok("1") {
        return false;
    }
    eprintln!("ignorado: defina APIBRASIL_CONTRACT=1 para rodar os testes de contrato");
    true
}

#[tokio::test]
async fn catalogo_responde_documentacoes() {
    if sem_contrato() {
        return;
    }

    let api = ApiBrasil::new(Config::new().timeout(Duration::from_secs(120)));
    let response = api.catalog().documentations().await.unwrap();

    assert!(
        response.as_object().is_some_and(|body| !body.is_empty()),
        "o catálogo respondeu vazio"
    );
}

#[tokio::test]
async fn catalogo_de_servidores_responde() {
    if sem_contrato() {
        return;
    }

    ApiBrasil::from_env().catalog().servers().await.unwrap();
}

#[tokio::test]
async fn rota_sem_autenticacao_devolve_401() {
    if sem_contrato() {
        return;
    }

    let api = ApiBrasil::new(Config::new().timeout(Duration::from_secs(60)));
    let error = api.account().balance().await.unwrap_err();

    assert!(
        error.is_authentication() || error.is_permission(),
        "esperava falha de autenticação, veio: {error}"
    );
}