|
1 | 1 | from __future__ import annotations
|
2 | 2 |
|
3 |
| -from typing import List, Union, Optional |
| 3 | +from typing import Any, List, Union, Optional |
4 | 4 | from datetime import date, datetime
|
5 | 5 | from typing_extensions import Required, Annotated, TypedDict
|
6 | 6 |
|
| 7 | +import pytest |
| 8 | + |
7 | 9 | from finch._utils import PropertyInfo, transform, parse_datetime
|
| 10 | +from finch._models import BaseModel |
8 | 11 |
|
9 | 12 |
|
10 | 13 | class Foo1(TypedDict):
|
@@ -186,3 +189,44 @@ class DateDictWithRequiredAlias(TypedDict, total=False):
|
186 | 189 | def test_datetime_with_alias() -> None:
|
187 | 190 | assert transform({"required_prop": None}, DateDictWithRequiredAlias) == {"prop": None} # type: ignore[comparison-overlap]
|
188 | 191 | assert transform({"required_prop": date.fromisoformat("2023-02-23")}, DateDictWithRequiredAlias) == {"prop": "2023-02-23"} # type: ignore[comparison-overlap]
|
| 192 | + |
| 193 | + |
| 194 | +class MyModel(BaseModel): |
| 195 | + foo: str |
| 196 | + |
| 197 | + |
| 198 | +def test_pydantic_model_to_dictionary() -> None: |
| 199 | + assert transform(MyModel(foo="hi!"), Any) == {"foo": "hi!"} |
| 200 | + assert transform(MyModel.construct(foo="hi!"), Any) == {"foo": "hi!"} |
| 201 | + |
| 202 | + |
| 203 | +def test_pydantic_empty_model() -> None: |
| 204 | + assert transform(MyModel.construct(), Any) == {} |
| 205 | + |
| 206 | + |
| 207 | +def test_pydantic_unknown_field() -> None: |
| 208 | + assert transform(MyModel.construct(my_untyped_field=True), Any) == {"my_untyped_field": True} |
| 209 | + |
| 210 | + |
| 211 | +def test_pydantic_mismatched_types() -> None: |
| 212 | + model = MyModel.construct(foo=True) |
| 213 | + with pytest.warns(UserWarning): |
| 214 | + params = transform(model, Any) |
| 215 | + assert params == {"foo": True} |
| 216 | + |
| 217 | + |
| 218 | +def test_pydantic_mismatched_object_type() -> None: |
| 219 | + model = MyModel.construct(foo=MyModel.construct(hello="world")) |
| 220 | + with pytest.warns(UserWarning): |
| 221 | + params = transform(model, Any) |
| 222 | + assert params == {"foo": {"hello": "world"}} |
| 223 | + |
| 224 | + |
| 225 | +class ModelNestedObjects(BaseModel): |
| 226 | + nested: MyModel |
| 227 | + |
| 228 | + |
| 229 | +def test_pydantic_nested_objects() -> None: |
| 230 | + model = ModelNestedObjects.construct(nested={"foo": "stainless"}) |
| 231 | + assert isinstance(model.nested, MyModel) |
| 232 | + assert transform(model, Any) == {"nested": {"foo": "stainless"}} |
0 commit comments