use crate::prelude::*;
#[derive(JsonSchema, Deserialize, Serialize, Default)]
struct UnitStruct;
#[test]
fn unit() {
test!(UnitStruct)
.assert_snapshot()
.assert_allows_ser_roundtrip_default()
.assert_matches_de_roundtrip(arbitrary_values());
}
#[derive(JsonSchema, Deserialize, Serialize, Default)]
struct NormalStruct {
foo: String,
bar: bool,
}
#[test]
fn normal() {
test!(NormalStruct)
.assert_snapshot()
.assert_allows_ser_roundtrip_default()
.assert_allows_de_roundtrip([json!({
"foo": "",
"bar": true,
"unknown": 123
})])
.assert_matches_de_roundtrip(arbitrary_values());
}
#[derive(JsonSchema, Deserialize, Serialize, Default)]
struct NewType(String);
#[test]
fn newtype() {
test!(NewType)
.assert_snapshot()
.assert_allows_ser_roundtrip_default()
.assert_matches_de_roundtrip(arbitrary_values());
}
#[derive(JsonSchema, Deserialize, Serialize, Default)]
struct TupleStruct(String, bool);
#[test]
fn tuple() {
test!(TupleStruct)
.assert_snapshot()
.assert_allows_ser_roundtrip_default()
.assert_matches_de_roundtrip(arbitrary_values());
}
#[derive(JsonSchema, Deserialize, Serialize, Default)]
#[serde(rename_all = "camelCase")]
struct RenamedFields {
camel_case: i32,
#[serde(rename = "new_name")]
old_name: i32,
}
#[test]
fn renamed_fields() {
test!(RenamedFields)
.assert_snapshot()
.assert_allows_ser_roundtrip_default()
.assert_matches_de_roundtrip(arbitrary_values());
}
#[derive(JsonSchema, Deserialize, Serialize, Default)]
#[serde(deny_unknown_fields)]
struct DenyUnknownFields {
foo: String,
bar: bool,
}
#[test]
fn deny_unknown_fields() {
test!(DenyUnknownFields)
.assert_snapshot()
.assert_allows_ser_roundtrip_default()
.assert_rejects_de([json!({
"foo": "",
"bar": true,
"unknown": 123
})])
.assert_matches_de_roundtrip(arbitrary_values());
}
#[derive(JsonSchema, Deserialize, Serialize, Default)]
#[schemars(example = PropertyOrder::default(), extend("x-custom" = PropertyOrder::default()))]
struct PropertyOrder {
#[serde(rename = "$defs")]
pub defs: UnitStruct,
pub examples: UnitStruct,
pub properties: UnitStruct,
pub required: UnitStruct,
#[serde(rename = "$schema")]
pub schema: UnitStruct,
pub title: UnitStruct,
pub r#type: UnitStruct,
#[serde(rename = "x-custom")]
pub x_custom: UnitStruct,
}
#[cfg_attr(not(feature = "preserve_order"), ignore)]
#[test]
fn property_order() {
test!(PropertyOrder).assert_snapshot().custom(|schema, _| {
fn get_property_keys(value: &Value) -> Vec<&str> {
value
.as_object()
.expect("expected value to be an object")
.keys()
.map(String::as_str)
.collect()
}
let value = serde_json::to_value(schema).unwrap();
assert!(matches!(
get_property_keys(&value).as_slice(),
&["$schema", "title", "type", "properties", .., "$defs"]
));
let field_order = &[
"$defs",
"examples",
"properties",
"required",
"$schema",
"title",
"type",
"x-custom",
];
assert_eq!(
get_property_keys(&value["properties"]).as_slice(),
field_order,
);
assert_eq!(
get_property_keys(&value["examples"][0]).as_slice(),
field_order,
);
assert_eq!(
get_property_keys(&value["x-custom"]).as_slice(),
field_order,
);
});
}