expect_json/expect/
mod.rs

1pub mod ops;
2
3use crate::expect::ops::ExpectArray;
4use crate::expect::ops::ExpectEmail;
5use crate::expect::ops::ExpectFloat;
6use crate::expect::ops::ExpectInteger;
7use crate::expect::ops::ExpectIsoDateTime;
8use crate::expect::ops::ExpectObject;
9use crate::expect::ops::ExpectString;
10use crate::expect::ops::ExpectUuid;
11
12///
13/// Expects a JSON object.
14///
15/// ```rust
16/// # async fn test() -> Result<(), Box<dyn ::std::error::Error>> {
17/// #
18/// # use axum::Router;
19/// # use axum::extract::Json;
20/// # use axum::routing::get;
21/// # use axum_test::TestServer;
22/// # use serde_json::json;
23/// #
24/// # let server = TestServer::new(Router::new())?;
25/// #
26/// use axum_test::expect_json;
27///
28/// let server = TestServer::new(Router::new())?;
29///
30/// server.get(&"/user/barrington")
31///     .await
32///     .assert_json(&json!({
33///         "name": "Barrington",
34///         "metadata": expect_json::object().contains(json!({
35///             "age": expect_json::integer().is_in_range(18..=100),
36///             "email": expect_json::email(),
37///         })),
38///     }));
39/// #
40/// # Ok(()) }
41/// ```
42pub fn object() -> ExpectObject {
43    ExpectObject::new()
44}
45
46///
47/// Expects a valid email address in the received JSON.
48///
49/// ```rust
50/// # async fn test() -> Result<(), Box<dyn ::std::error::Error>> {
51/// #
52/// # use axum::Router;
53/// # use axum::extract::Json;
54/// # use axum::routing::get;
55/// # use axum_test::TestServer;
56/// # use serde_json::json;
57/// #
58/// # let server = TestServer::new(Router::new())?;
59/// #
60/// use axum_test::expect_json;
61///
62/// let server = TestServer::new(Router::new())?;
63///
64/// server.get(&"/user/barrington")
65///     .await
66///     .assert_json(&json!({
67///         "name": "Barrington",
68///         "height_in_meters": expect_json::float().is_in_range(0.5..=2.5),
69///     }));
70/// #
71/// # Ok(()) }
72/// ```
73pub fn float() -> ExpectFloat {
74    ExpectFloat::new()
75}
76
77///
78/// Expects a valid email address in the received JSON.
79///
80/// ```rust
81/// # async fn test() -> Result<(), Box<dyn ::std::error::Error>> {
82/// #
83/// # use axum::Router;
84/// # use axum::extract::Json;
85/// # use axum::routing::get;
86/// # use axum_test::TestServer;
87/// # use serde_json::json;
88/// #
89/// # let server = TestServer::new(Router::new())?;
90/// #
91/// use axum_test::expect_json;
92///
93/// let server = TestServer::new(Router::new())?;
94///
95/// server.get(&"/user/barrington")
96///     .await
97///     .assert_json(&json!({
98///         "name": "Barrington",
99///         "age": expect_json::integer().is_in_range(18..=100),
100///     }));
101/// #
102/// # Ok(()) }
103/// ```
104pub fn integer() -> ExpectInteger {
105    ExpectInteger::new()
106}
107
108///
109/// Expects a JSON string.
110///
111/// ```rust
112/// # async fn test() -> Result<(), Box<dyn ::std::error::Error>> {
113/// #
114/// # use axum::Router;
115/// # use axum::extract::Json;
116/// # use axum::routing::get;
117/// # use axum_test::TestServer;
118/// # use serde_json::json;
119/// #
120/// # let server = TestServer::new(Router::new())?;
121/// #
122/// use axum_test::expect_json;
123///
124/// let server = TestServer::new(Router::new())?;
125///
126/// server.get(&"/user/barrington")
127///     .await
128///     .assert_json(&json!({
129///         "name": "Barrington",
130///         "metadata": expect_json::object().contains(json!({
131///             "age": expect_json::integer().is_in_range(18..=100),
132///             "email": expect_json::email(),
133///         })),
134///     }));
135/// #
136/// # Ok(()) }
137/// ```
138pub fn string() -> ExpectString {
139    ExpectString::new()
140}
141
142///
143/// Expects a JSON array. This has further operations to assert the length,
144/// uniqueness, all values meet a condition, etc.
145///
146/// ```rust
147/// # async fn test() -> Result<(), Box<dyn ::std::error::Error>> {
148/// #
149/// # use axum::Router;
150/// # use axum::extract::Json;
151/// # use axum::routing::get;
152/// # use axum_test::TestServer;
153/// # use serde_json::json;
154/// #
155/// # let server = TestServer::new(Router::new())?;
156/// #
157/// use axum_test::expect_json;
158///
159/// let server = TestServer::new(Router::new())?;
160///
161/// server.get(&"/user/barrington")
162///     .await
163///     .assert_json(&json!({
164///         "name": "Barrington",
165///         "tags": expect_json::array().all(expect_json::string()),
166///     }));
167/// #
168/// # Ok(()) }
169/// ```
170pub fn array() -> ExpectArray {
171    ExpectArray::new()
172}
173
174///
175/// Expects a valid-looking ISO date time.
176///
177/// ```rust
178/// # async fn test() -> Result<(), Box<dyn ::std::error::Error>> {
179/// #
180/// # use axum::Router;
181/// # use axum::extract::Json;
182/// # use axum::routing::get;
183/// # use axum_test::TestServer;
184/// # use serde_json::json;
185/// #
186/// # let server = TestServer::new(Router::new())?;
187/// #
188/// use axum_test::expect_json;
189/// use std::time::Duration;
190///
191/// let server = TestServer::new(Router::new())?;
192///
193/// server.get(&"/user/barrington")
194///     .await
195///     .assert_json(&json!({
196///         "name": "Barrington",
197///         "created_at": expect_json::iso_date_time().within_past(Duration::from_secs(60)),
198///     }));
199/// #
200/// # Ok(()) }
201/// ```
202pub fn iso_date_time() -> ExpectIsoDateTime {
203    ExpectIsoDateTime::new()
204}
205
206///
207/// Expect a valid UUID.
208///
209/// ```rust
210/// # async fn test() -> Result<(), Box<dyn ::std::error::Error>> {
211/// #
212/// # use axum::Router;
213/// # use axum::extract::Json;
214/// # use axum::routing::get;
215/// # use axum_test::TestServer;
216/// # use serde_json::json;
217/// #
218/// # let server = TestServer::new(Router::new())?;
219/// #
220/// use std::time::Duration;
221/// use axum_test::expect_json;
222///
223/// let server = TestServer::new(Router::new())?;
224///
225/// server.get(&"/user/alice")
226///     .await
227///     .assert_json(&json!({
228///         "name": "Alice",
229///         "id": expect_json::uuid(),
230///     }));
231/// #
232/// # Ok(()) }
233/// ```
234///
235pub fn uuid() -> ExpectUuid {
236    ExpectUuid::new()
237}
238
239///
240/// Expects a valid-looking email address.
241///
242/// ```rust
243/// # async fn test() -> Result<(), Box<dyn ::std::error::Error>> {
244/// #
245/// # use axum::Router;
246/// # use axum::extract::Json;
247/// # use axum::routing::get;
248/// # use axum_test::TestServer;
249/// # use serde_json::json;
250/// #
251/// # let server = TestServer::new(Router::new())?;
252/// #
253/// use axum_test::expect_json;
254///
255/// let server = TestServer::new(Router::new())?;
256///
257/// server.get(&"/user")
258///     .await
259///     .assert_json(&json!({
260///         "name": "John Doe",
261///         "email": expect_json::email(),
262///     }));
263/// #
264/// # Ok(()) }
265/// ```
266pub fn email() -> ExpectEmail {
267    ExpectEmail::new()
268}