From 1b5a12b698568150863f5809b0bc8041662e2ece Mon Sep 17 00:00:00 2001 From: Eero Ruohola Date: Fri, 24 Jul 2020 23:37:19 +0300 Subject: [PATCH] Add tests for SubclassWithMeta --- graphene/utils/subclass_with_meta.py | 4 +- .../utils/tests/test_subclass_with_meta.py | 63 +++++++++++++++++++ 2 files changed, 65 insertions(+), 2 deletions(-) create mode 100644 graphene/utils/tests/test_subclass_with_meta.py diff --git a/graphene/utils/subclass_with_meta.py b/graphene/utils/subclass_with_meta.py index 52088d06..07de8c70 100644 --- a/graphene/utils/subclass_with_meta.py +++ b/graphene/utils/subclass_with_meta.py @@ -21,8 +21,8 @@ class SubclassWithMeta(metaclass=SubclassWithMeta_Meta): def __init_subclass__(cls, **meta_options): """Consume all the passed kwargs and cls's possible `Meta`. - The consumed kwargs and all of the attributes from `Meta` - will be passed for further processing to the next + The consumed kwargs and all of the attributes/keys from `Meta` + will be combined into a dict and passed for further processing to the next `__init_subclass_with_meta__` in the method resolution order. """ _Meta = getattr(cls, "Meta", None) diff --git a/graphene/utils/tests/test_subclass_with_meta.py b/graphene/utils/tests/test_subclass_with_meta.py new file mode 100644 index 00000000..1640a7d8 --- /dev/null +++ b/graphene/utils/tests/test_subclass_with_meta.py @@ -0,0 +1,63 @@ +from ..subclass_with_meta import SubclassWithMeta + + +def test_init_subclass_calls_super(): + class DefinesInitSubclass: + subclass_init_count = 0 + + def __init_subclass__(cls, **kwargs): + DefinesInitSubclass.subclass_init_count += 1 + super().__init_subclass__(**kwargs) + + class InheritsAsFirst(SubclassWithMeta, DefinesInitSubclass): + pass + + class InheritsAsLast(DefinesInitSubclass, SubclassWithMeta): + pass + + assert DefinesInitSubclass.subclass_init_count == 2 + + +def test_kwargs_are_consumed(): + class DefinesInitSubclass: + passed_kwargs = [] + + def __init_subclass__(cls, **kwargs): + if kwargs: + DefinesInitSubclass.passed_kwargs.append(kwargs) + super().__init_subclass__(**kwargs) + + class InheritsAsFirst(SubclassWithMeta, DefinesInitSubclass, is_consumed="foo"): + pass + + class InheritsAsLast(DefinesInitSubclass, SubclassWithMeta, not_consumed="bar"): + pass + + assert DefinesInitSubclass.passed_kwargs == [{"not_consumed": "bar"}] + + +def test_meta_is_deleted_and_props_passed(): + class DefinesInitSubclassWithMeta(SubclassWithMeta): + passed_meta_options = [] + + @classmethod + def __init_subclass_with_meta__(cls, **options): + if options: + DefinesInitSubclassWithMeta.passed_meta_options.append(options) + super().__init_subclass_with_meta__() + + class HasMetaClass(DefinesInitSubclassWithMeta, foo1=1): + class Meta: + foo2 = 2 + foo3 = 3 + + class HasMetaDict(DefinesInitSubclassWithMeta, bar1=1): + Meta = {"bar2": 2, "bar3": 3} + + assert not hasattr(HasMetaClass, "Meta") + assert not hasattr(HasMetaDict, "Meta") + + assert DefinesInitSubclassWithMeta.passed_meta_options == [ + {"foo1": 1, "foo2": 2, "foo3": 3}, + {"bar1": 1, "bar2": 2, "bar3": 3}, + ]