|
| 1 | +from pydantic_core import SchemaSerializer, SchemaValidator, core_schema |
| 2 | + |
| 3 | + |
| 4 | +def test_prebuilt_val_and_ser_used() -> None: |
| 5 | + class InnerModel: |
| 6 | + x: int |
| 7 | + |
| 8 | + inner_schema = core_schema.model_schema( |
| 9 | + InnerModel, |
| 10 | + schema=core_schema.model_fields_schema( |
| 11 | + {'x': core_schema.model_field(schema=core_schema.int_schema())}, |
| 12 | + ), |
| 13 | + ) |
| 14 | + |
| 15 | + inner_schema_validator = SchemaValidator(inner_schema) |
| 16 | + inner_schema_serializer = SchemaSerializer(inner_schema) |
| 17 | + InnerModel.__pydantic_complete__ = True # pyright: ignore[reportAttributeAccessIssue] |
| 18 | + InnerModel.__pydantic_validator__ = inner_schema_validator # pyright: ignore[reportAttributeAccessIssue] |
| 19 | + InnerModel.__pydantic_serializer__ = inner_schema_serializer # pyright: ignore[reportAttributeAccessIssue] |
| 20 | + |
| 21 | + class OuterModel: |
| 22 | + inner: InnerModel |
| 23 | + |
| 24 | + outer_schema = core_schema.model_schema( |
| 25 | + OuterModel, |
| 26 | + schema=core_schema.model_fields_schema( |
| 27 | + { |
| 28 | + 'inner': core_schema.model_field( |
| 29 | + schema=core_schema.model_schema( |
| 30 | + InnerModel, |
| 31 | + schema=core_schema.model_fields_schema( |
| 32 | + # note, we use str schema here even though that's incorrect |
| 33 | + # in order to verify that the prebuilt validator is used |
| 34 | + # off of InnerModel with the correct int schema, not this str schema |
| 35 | + {'x': core_schema.model_field(schema=core_schema.str_schema())}, |
| 36 | + ), |
| 37 | + ) |
| 38 | + ) |
| 39 | + } |
| 40 | + ), |
| 41 | + ) |
| 42 | + |
| 43 | + outer_validator = SchemaValidator(outer_schema) |
| 44 | + outer_serializer = SchemaSerializer(outer_schema) |
| 45 | + |
| 46 | + result = outer_validator.validate_python({'inner': {'x': 1}}) |
| 47 | + assert result.inner.x == 1 |
| 48 | + assert outer_serializer.to_python(result) == {'inner': {'x': 1}} |
0 commit comments