blob: 507811fd1f06e205454bbf03e81f0864af097661 [file] [log] [blame] [edit]
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);
}