From de890776d119317a19c3d8171b8e126ec4e04dc8 Mon Sep 17 00:00:00 2001 From: John Carter Date: Sun, 17 May 2020 12:41:43 +1200 Subject: [PATCH] Add test coverage that default_factory doesn't copy its value --- tests/test_dataclasses.py | 17 +++++++++++++++++ tests/test_main.py | 14 ++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/tests/test_dataclasses.py b/tests/test_dataclasses.py index 22b126a136f..d799e35a0c2 100644 --- a/tests/test_dataclasses.py +++ b/tests/test_dataclasses.py @@ -431,6 +431,23 @@ class User: assert fields['aliases'].default == {'John': 'Joey'} +def test_default_factory_singleton_field(): + class MySingleton: + pass + + class MyConfig: + arbitrary_types_allowed = True + + MY_SINGLETON = MySingleton() + + @pydantic.dataclasses.dataclass(config=MyConfig) + class Foo: + singleton: MySingleton = dataclasses.field(default_factory=lambda: MY_SINGLETON) + + # Returning a singleton from a default_factory is supported + assert Foo().singleton is Foo().singleton + + def test_schema(): @pydantic.dataclasses.dataclass class User: diff --git a/tests/test_main.py b/tests/test_main.py index fdbc9ea3f19..2e3d8cbdfe1 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -1087,6 +1087,20 @@ class FunctionModel(BaseModel): m = FunctionModel() assert m.uid is uuid4 + # Returning a singleton from a default_factory is supported + class MySingleton: + pass + + MY_SINGLETON = MySingleton() + + class SingletonFieldModel(BaseModel): + singleton: MySingleton = Field(default_factory=lambda: MY_SINGLETON) + + class Config: + arbitrary_types_allowed = True + + assert SingletonFieldModel().singleton is SingletonFieldModel().singleton + @pytest.mark.skipif(sys.version_info < (3, 7), reason='field constraints are set but not enforced with python 3.6') def test_none_min_max_items():