2023-03-23 05:56:25 +00:00
|
|
|
// Copyright 2023 Oxide Computer Company
|
2022-03-04 18:58:16 +00:00
|
|
|
|
2023-03-23 05:56:25 +00:00
|
|
|
use std::str::from_utf8;
|
2022-03-04 18:58:16 +00:00
|
|
|
|
|
|
|
use dropshot::{
|
|
|
|
endpoint, ApiDescription, HttpError, HttpResponseUpdatedNoContent, Path,
|
2022-05-12 22:07:48 +00:00
|
|
|
Query, RequestContext, TypedBody,
|
2022-03-04 18:58:16 +00:00
|
|
|
};
|
2022-03-15 23:11:47 +00:00
|
|
|
use http::Response;
|
|
|
|
use hyper::Body;
|
2022-03-04 18:58:16 +00:00
|
|
|
use openapiv3::OpenAPI;
|
2023-04-25 16:11:52 +00:00
|
|
|
use progenitor_impl::{
|
|
|
|
space_out_items, GenerationSettings, Generator, InterfaceStyle,
|
|
|
|
};
|
2022-03-04 18:58:16 +00:00
|
|
|
use schemars::JsonSchema;
|
|
|
|
use serde::Deserialize;
|
|
|
|
|
2023-04-25 16:11:52 +00:00
|
|
|
fn generate_formatted(generator: &mut Generator, spec: &OpenAPI) -> String {
|
|
|
|
let content = generator.generate_tokens(&spec).unwrap();
|
|
|
|
let rustfmt_config = rustfmt_wrapper::config::Config {
|
|
|
|
normalize_doc_attributes: Some(true),
|
|
|
|
wrap_comments: Some(true),
|
|
|
|
..Default::default()
|
|
|
|
};
|
|
|
|
space_out_items(
|
|
|
|
rustfmt_wrapper::rustfmt_config(rustfmt_config, content).unwrap(),
|
|
|
|
)
|
|
|
|
.unwrap()
|
|
|
|
}
|
|
|
|
|
2022-03-04 18:58:16 +00:00
|
|
|
#[allow(dead_code)]
|
|
|
|
#[derive(Deserialize, JsonSchema)]
|
|
|
|
struct CursedPath {
|
|
|
|
#[serde(rename = "ref")]
|
|
|
|
reef: String,
|
|
|
|
#[serde(rename = "type")]
|
|
|
|
tripe: String,
|
|
|
|
#[serde(rename = "trait")]
|
|
|
|
trade: String,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[allow(dead_code)]
|
|
|
|
#[derive(Deserialize, JsonSchema)]
|
|
|
|
struct CursedQuery {
|
|
|
|
#[serde(rename = "if")]
|
|
|
|
iffy: String,
|
|
|
|
#[serde(rename = "in")]
|
|
|
|
inn: String,
|
|
|
|
#[serde(rename = "use")]
|
|
|
|
youse: String,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[endpoint {
|
|
|
|
method = GET,
|
|
|
|
path = "/{ref}/{type}/{trait}",
|
|
|
|
}]
|
|
|
|
async fn renamed_parameters(
|
2023-03-23 05:56:25 +00:00
|
|
|
_rqctx: RequestContext<()>,
|
2022-03-04 18:58:16 +00:00
|
|
|
_path: Path<CursedPath>,
|
|
|
|
_query: Query<CursedQuery>,
|
|
|
|
) -> Result<HttpResponseUpdatedNoContent, HttpError> {
|
2022-03-15 23:11:47 +00:00
|
|
|
unreachable!();
|
2022-03-04 18:58:16 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/// Test parameters that conflict with Rust reserved words and therefore must
|
|
|
|
/// be renamed.
|
|
|
|
#[test]
|
|
|
|
fn test_renamed_parameters() {
|
|
|
|
let mut api = ApiDescription::new();
|
|
|
|
api.register(renamed_parameters).unwrap();
|
|
|
|
|
|
|
|
let mut out = Vec::new();
|
|
|
|
|
|
|
|
api.openapi("pagination-demo", "9000")
|
|
|
|
.write(&mut out)
|
|
|
|
.unwrap();
|
|
|
|
|
|
|
|
let out = from_utf8(&out).unwrap();
|
|
|
|
|
|
|
|
let spec = serde_json::from_str::<OpenAPI>(out).unwrap();
|
|
|
|
|
2022-07-03 02:09:38 +00:00
|
|
|
let mut generator = Generator::default();
|
2023-04-25 16:11:52 +00:00
|
|
|
let output = generate_formatted(&mut generator, &spec);
|
2022-03-04 18:58:16 +00:00
|
|
|
expectorate::assert_contents(
|
|
|
|
format!("tests/output/{}.out", "test_renamed_parameters"),
|
|
|
|
&output,
|
|
|
|
)
|
|
|
|
}
|
2022-03-15 23:11:47 +00:00
|
|
|
|
|
|
|
#[endpoint {
|
|
|
|
method = GET,
|
|
|
|
path = "/",
|
|
|
|
}]
|
|
|
|
async fn freeform_response(
|
2023-03-23 05:56:25 +00:00
|
|
|
_rqctx: RequestContext<()>,
|
2022-03-15 23:11:47 +00:00
|
|
|
) -> Result<Response<Body>, HttpError> {
|
|
|
|
unreachable!();
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Test freeform responses.
|
|
|
|
#[test]
|
|
|
|
fn test_freeform_response() {
|
|
|
|
let mut api = ApiDescription::new();
|
|
|
|
api.register(freeform_response).unwrap();
|
|
|
|
|
|
|
|
let mut out = Vec::new();
|
|
|
|
|
|
|
|
api.openapi("pagination-demo", "9000")
|
|
|
|
.write(&mut out)
|
|
|
|
.unwrap();
|
|
|
|
|
|
|
|
let out = from_utf8(&out).unwrap();
|
|
|
|
let spec = serde_json::from_str::<OpenAPI>(out).unwrap();
|
|
|
|
|
2022-07-03 02:09:38 +00:00
|
|
|
let mut generator = Generator::default();
|
2023-04-25 16:11:52 +00:00
|
|
|
let output = generate_formatted(&mut generator, &spec);
|
2022-03-15 23:11:47 +00:00
|
|
|
expectorate::assert_contents(
|
|
|
|
format!("tests/output/{}.out", "test_freeform_response"),
|
|
|
|
&output,
|
|
|
|
)
|
|
|
|
}
|
2022-05-12 22:07:48 +00:00
|
|
|
|
|
|
|
#[derive(Deserialize, JsonSchema)]
|
|
|
|
#[allow(dead_code)]
|
|
|
|
struct BodyWithDefaults {
|
|
|
|
s: String,
|
|
|
|
#[serde(default)]
|
|
|
|
yes: bool,
|
|
|
|
#[serde(default = "forty_two", rename = "forty-two")]
|
|
|
|
forty_two: u32,
|
2022-08-27 16:31:35 +00:00
|
|
|
#[serde(default = "yes_yes")]
|
|
|
|
something: Option<bool>,
|
2022-05-12 22:07:48 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
fn forty_two() -> u32 {
|
|
|
|
42
|
|
|
|
}
|
|
|
|
|
2022-08-27 16:31:35 +00:00
|
|
|
fn yes_yes() -> Option<bool> {
|
|
|
|
Some(true)
|
|
|
|
}
|
|
|
|
|
2022-05-12 22:07:48 +00:00
|
|
|
#[endpoint {
|
|
|
|
method = POST,
|
|
|
|
path = "/",
|
|
|
|
}]
|
|
|
|
async fn default_params(
|
2023-03-23 05:56:25 +00:00
|
|
|
_rqctx: RequestContext<()>,
|
2022-05-12 22:07:48 +00:00
|
|
|
_body: TypedBody<BodyWithDefaults>,
|
|
|
|
) -> Result<Response<Body>, HttpError> {
|
|
|
|
unreachable!();
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Test default type values.
|
|
|
|
#[test]
|
|
|
|
fn test_default_params() {
|
|
|
|
let mut api = ApiDescription::new();
|
|
|
|
api.register(default_params).unwrap();
|
|
|
|
|
|
|
|
let mut out = Vec::new();
|
|
|
|
|
|
|
|
api.openapi("pagination-demo", "9000")
|
|
|
|
.write(&mut out)
|
|
|
|
.unwrap();
|
|
|
|
|
|
|
|
let out = from_utf8(&out).unwrap();
|
|
|
|
let spec = serde_json::from_str::<OpenAPI>(out).unwrap();
|
|
|
|
|
2022-07-03 02:09:38 +00:00
|
|
|
let mut generator = Generator::default();
|
2023-04-25 16:11:52 +00:00
|
|
|
let output = generate_formatted(&mut generator, &spec);
|
2022-05-12 22:07:48 +00:00
|
|
|
expectorate::assert_contents(
|
2022-08-27 16:31:35 +00:00
|
|
|
format!("tests/output/{}.out", "test_default_params_positional"),
|
2022-05-12 22:07:48 +00:00
|
|
|
&output,
|
2022-08-27 16:31:35 +00:00
|
|
|
);
|
|
|
|
|
|
|
|
let mut generator = Generator::new(
|
|
|
|
GenerationSettings::default().with_interface(InterfaceStyle::Builder),
|
|
|
|
);
|
2023-04-25 16:11:52 +00:00
|
|
|
let output = generate_formatted(&mut generator, &spec);
|
2022-08-27 16:31:35 +00:00
|
|
|
expectorate::assert_contents(
|
|
|
|
format!("tests/output/{}.out", "test_default_params_builder"),
|
|
|
|
&output,
|
|
|
|
);
|
2022-05-12 22:07:48 +00:00
|
|
|
}
|