use gotcha::axum::response::IntoResponse;
use gotcha::{api, openapi::Operable, Json};
#[api(id = "no_return")]
async fn no_return() {}
#[api(id = "explicit_unit")]
async fn explicit_unit() -> () {}
#[api(id = "json_unit")]
async fn json_unit() -> Json<()> {
Json(())
}
fn extract<H, T>(_handler: H) -> &'static Operable
where
H: gotcha::axum::handler::Handler<T, ()>,
T: 'static,
{
gotcha::router::extract_operable::<H, T, ()>().expect("handler is registered")
}
fn main() {
let actual_status = ().into_response().status();
assert_eq!(actual_status.as_u16(), 200, "axum sends 200 with an empty body for the unit type");
for operable in [extract(no_return), extract(explicit_unit)] {
let responses = operable.generate("/x".to_owned()).responses;
let rendered = serde_json::to_string(&responses).unwrap();
let documented = actual_status.as_u16().to_string();
assert!(responses.data.contains_key(&documented), "documents the status axum sends: {rendered}");
let gotcha::oas::Referenceable::Data(response) = &responses.data[&documented] else {
panic!("expected an inline response");
};
assert!(response.content.is_none(), "an empty body carries no content: {rendered}");
}
let json_responses = extract(json_unit).generate("/j".to_owned()).responses;
let rendered = serde_json::to_string(&json_responses).unwrap();
assert!(json_responses.data.contains_key("200"), "Json<()> keeps its 200: {rendered}");
assert!(!rendered.contains("void"), "`void` is not a valid OpenAPI type: {rendered}");
}