in avro/src/types.rs [2691:2778]
fn test_avro_3460_validation_with_refs_real_struct() -> TestResult {
use crate::ser::Serializer;
use serde::Serialize;
#[derive(Serialize, Clone)]
struct TestInner {
z: i32,
}
#[derive(Serialize)]
struct TestRefSchemaStruct1 {
a: TestInner,
b: String, // could be literally anything
}
#[derive(Serialize)]
struct TestRefSchemaStruct2 {
a: TestInner,
b: i32, // could be literally anything
}
#[derive(Serialize)]
struct TestRefSchemaStruct3 {
a: TestInner,
b: Option<TestInner>, // could be literally anything
}
let schema = Schema::parse_str(
r#"
{
"type":"record",
"name":"TestStruct",
"fields": [
{
"name":"a",
"type":{
"type":"record",
"name": "Inner",
"fields": [ {
"name":"z",
"type":"int"
}]
}
},
{
"name":"b",
"type":"Inner"
}
]
}"#,
)?;
let test_inner = TestInner { z: 3 };
let test_outer1 = TestRefSchemaStruct1 {
a: test_inner.clone(),
b: "testing".into(),
};
let test_outer2 = TestRefSchemaStruct2 {
a: test_inner.clone(),
b: 24,
};
let test_outer3 = TestRefSchemaStruct3 {
a: test_inner,
b: None,
};
let mut ser = Serializer::default();
let test_outer1: Value = test_outer1.serialize(&mut ser)?;
let mut ser = Serializer::default();
let test_outer2: Value = test_outer2.serialize(&mut ser)?;
let mut ser = Serializer::default();
let test_outer3: Value = test_outer3.serialize(&mut ser)?;
assert!(
!test_outer1.validate(&schema),
"field b record is invalid against the schema"
);
assert!(
!test_outer2.validate(&schema),
"field b record is invalid against the schema"
);
assert!(
!test_outer3.validate(&schema),
"field b record is invalid against the schema"
);
Ok(())
}