(defer_build: bool, generate_schema_calls: CallCounter)
| 818 | |
| 819 | @pytest.mark.parametrize('defer_build', [True, False]) |
| 820 | def test_config_model_defer_build_nested(defer_build: bool, generate_schema_calls: CallCounter): |
| 821 | config = ConfigDict(defer_build=defer_build) |
| 822 | |
| 823 | assert generate_schema_calls.count == 0 |
| 824 | |
| 825 | class MyNestedModel(BaseModel): |
| 826 | model_config = config |
| 827 | x: int |
| 828 | |
| 829 | class MyModel(BaseModel): |
| 830 | y: MyNestedModel |
| 831 | |
| 832 | assert isinstance(MyModel.__pydantic_validator__, SchemaValidator) |
| 833 | assert isinstance(MyModel.__pydantic_serializer__, SchemaSerializer) |
| 834 | |
| 835 | expected_schema_count = 1 if defer_build is True else 2 |
| 836 | assert generate_schema_calls.count == expected_schema_count, 'Should respect defer_build' |
| 837 | |
| 838 | if defer_build: |
| 839 | assert isinstance(MyNestedModel.__pydantic_validator__, MockValSer) |
| 840 | assert isinstance(MyNestedModel.__pydantic_serializer__, MockValSer) |
| 841 | else: |
| 842 | assert isinstance(MyNestedModel.__pydantic_validator__, SchemaValidator) |
| 843 | assert isinstance(MyNestedModel.__pydantic_serializer__, SchemaSerializer) |
| 844 | |
| 845 | m = MyModel(y={'x': 1}) |
| 846 | assert m.y.x == 1 |
| 847 | assert m.model_dump() == {'y': {'x': 1}} |
| 848 | assert m.model_validate({'y': {'x': 1}}).y.x == 1 |
| 849 | assert m.model_json_schema()['type'] == 'object' |
| 850 | |
| 851 | if defer_build: |
| 852 | assert isinstance(MyNestedModel.__pydantic_validator__, MockValSer) |
| 853 | assert isinstance(MyNestedModel.__pydantic_serializer__, MockValSer) |
| 854 | else: |
| 855 | assert isinstance(MyNestedModel.__pydantic_validator__, SchemaValidator) |
| 856 | assert isinstance(MyNestedModel.__pydantic_serializer__, SchemaSerializer) |
| 857 | |
| 858 | assert generate_schema_calls.count == expected_schema_count, 'Should not build duplicated core schemas' |
| 859 | |
| 860 | |
| 861 | def test_config_model_defer_build_ser_first(): |
nothing calls this directly
no test coverage detected