81 lines
2.4 KiB
Rust
81 lines
2.4 KiB
Rust
use crate::prelude::*;
|
|
use pretty_assertions::assert_eq;
|
|
use schemars::{generate::SchemaSettings, Schema};
|
|
|
|
#[derive(JsonSchema, Deserialize, Serialize, Default)]
|
|
#[schemars(inline)]
|
|
pub struct OuterStruct {
|
|
#[schemars(extend("examples" = [8, null]))]
|
|
maybe_int: Option<i32>,
|
|
values: serde_json::Map<String, Value>,
|
|
value: Value,
|
|
inner: InnerEnum,
|
|
maybe_inner: Option<InnerEnum>,
|
|
tuples: Vec<(u8, i64)>,
|
|
}
|
|
|
|
#[derive(JsonSchema, Deserialize, Serialize, Default)]
|
|
pub enum InnerEnum {
|
|
#[default]
|
|
UndocumentedUnit1,
|
|
UndocumentedUnit2,
|
|
/// This is a documented unit variant
|
|
DocumentedUnit,
|
|
ValueNewType(Value),
|
|
}
|
|
|
|
#[test]
|
|
fn draft07() {
|
|
test!(OuterStruct, SchemaSettings::draft07())
|
|
.assert_snapshot()
|
|
.assert_allows_ser_roundtrip_default()
|
|
.assert_matches_de_roundtrip(arbitrary_values());
|
|
}
|
|
|
|
#[test]
|
|
fn draft2019_09() {
|
|
test!(OuterStruct, SchemaSettings::draft2019_09())
|
|
.assert_snapshot()
|
|
.assert_allows_ser_roundtrip_default()
|
|
.assert_matches_de_roundtrip(arbitrary_values());
|
|
}
|
|
|
|
#[test]
|
|
fn draft2020_12() {
|
|
test!(OuterStruct, SchemaSettings::draft2020_12())
|
|
.assert_snapshot()
|
|
.assert_allows_ser_roundtrip_default()
|
|
.assert_matches_de_roundtrip(arbitrary_values());
|
|
}
|
|
|
|
#[test]
|
|
fn openapi3() {
|
|
let mut settings = SchemaSettings::openapi3();
|
|
// Hack to apply recursive transforms to schemas at components.schemas:
|
|
// First, move them to $defs, then run the transforms, then move them back again.
|
|
settings.transforms.insert(
|
|
0,
|
|
Box::new(|s: &mut Schema| {
|
|
let defs = s.pointer_mut("/components/schemas").unwrap().take();
|
|
s.insert("$defs".to_owned(), defs);
|
|
}),
|
|
);
|
|
settings.transforms.push(Box::new(|s: &mut Schema| {
|
|
*s.pointer_mut("/components/schemas").unwrap() = s.remove("$defs").unwrap();
|
|
}));
|
|
|
|
test!(OuterStruct, settings.clone()).assert_snapshot();
|
|
|
|
// Ensure that `take_definitions()` applies transforms correctly
|
|
|
|
let gen1 = settings.into_generator();
|
|
let definitions1 =
|
|
&Value::from(gen1.into_root_schema_for::<OuterStruct>())["components"]["schemas"];
|
|
|
|
let mut gen2 = SchemaSettings::openapi3().into_generator();
|
|
gen2.subschema_for::<OuterStruct>();
|
|
let definitions2 = Value::Object(gen2.take_definitions(true));
|
|
|
|
assert_eq!(definitions1, &definitions2);
|
|
}
|