153 lines
3.8 KiB
Rust
153 lines
3.8 KiB
Rust
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(),
|
|
// order of `examples`, `required` and `x-custom` is unspecified
|
|
&["$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,
|
|
);
|
|
});
|
|
}
|