Skip to main content

api_bones_test/
lib.rs

1//! Test helpers for `api-bones` consumers.
2//!
3//! Provides builder ergonomics for api-bones types and assertion helpers for
4//! axum and reqwest responses so services share a single test vocabulary.
5//!
6//! # Feature flags
7//!
8//! | Feature | Adds |
9//! |---------|------|
10//! | `builders` (default) | [`builders`] — pure-Rust builders, no IO |
11//! | `axum` | [`axum`] — `axum-test` assertion helpers and `TestServer` |
12//! | `reqwest` | [`reqwest`] — reqwest assertion helpers |
13//! | `nats` | [`nats`] — `JetStream` `AuditCapture` fixture |
14//!
15//! # Quick start — builders
16//!
17//! ```rust,ignore
18//! use api_bones::error::ErrorCode;
19//! use api_bones_test::builders::{FakeApiResponse, FakePaginated, FakeProblem};
20//!
21//! let resp = FakeApiResponse::new(42u32).build();
22//! assert_eq!(resp.data, 42);
23//!
24//! let page = FakePaginated::new(vec![1u32, 2, 3]).build();
25//! assert_eq!(page.total_count, 3);
26//!
27//! let err = FakeProblem::new(ErrorCode::ValidationFailed)
28//!     .field("/email", "must be a valid email")
29//!     .build();
30//! assert!(!err.errors.is_empty());
31//! ```
32//!
33//! # Quick start — axum assertions
34//!
35//! ```rust,no_run
36//! # #[cfg(feature = "axum")]
37//! # async fn run() {
38//! use axum::Router;
39//! use api_bones_test::axum::TestServer;
40//!
41//! let app = Router::new(); // your router
42//! let server = TestServer::new(app);
43//! let payload: u32 = server.get_envelope("/items/1").await;
44//! # }
45//! ```
46//!
47//! # Quick start — reqwest assertions
48//!
49//! ```rust,no_run
50//! # #[cfg(feature = "reqwest")]
51//! # async fn run() {
52//! use api_bones_test::reqwest::assert_envelope_reqwest;
53//!
54//! let client = ::reqwest::Client::new();
55//! let resp = client.get("http://localhost:3000/items/1").send().await.unwrap();
56//! let payload: u32 = assert_envelope_reqwest(resp).await;
57//! # }
58//! ```
59//!
60//! # Quick start — NATS audit capture
61//!
62//! ```rust,no_run
63//! # #[cfg(feature = "nats")]
64//! # async fn run() {
65//! use std::time::Duration;
66//! use api_bones_test::nats::AuditCapture;
67//!
68//! // Requires a running NATS server (use testcontainers in CI)
69//! let client = async_nats::connect("nats://localhost:4222").await.unwrap();
70//! let capture = AuditCapture::new(&client, "my-service").await.unwrap();
71//! capture.assert_no_events(Duration::from_millis(100)).await;
72//! # }
73//! ```
74
75#[cfg(feature = "builders")]
76pub mod builders;
77
78#[cfg(feature = "axum")]
79pub mod axum;
80
81#[cfg(feature = "reqwest")]
82pub mod reqwest;
83
84#[cfg(feature = "nats")]
85pub mod nats;