Allow custom mounted classes

This commit is contained in:
Syrus Akbary 2016-12-17 16:58:01 -08:00
parent 27cd00b9f9
commit 4c72942b95
2 changed files with 65 additions and 1 deletions

View File

@ -4,6 +4,8 @@ from .unmountedtype import UnmountedType
class MountedType(OrderedType): class MountedType(OrderedType):
_mount_cls_override = None
@classmethod @classmethod
def mount(cls, unmounted): # noqa: N802 def mount(cls, unmounted): # noqa: N802
''' '''
@ -13,7 +15,9 @@ class MountedType(OrderedType):
'{} can\'t mount {}' '{} can\'t mount {}'
).format(cls.__name__, repr(unmounted)) ).format(cls.__name__, repr(unmounted))
return cls( mount_cls = cls._mount_cls_override or cls
return mount_cls(
unmounted.get_type(), unmounted.get_type(),
*unmounted.args, *unmounted.args,
_creation_counter=unmounted.creation_counter, _creation_counter=unmounted.creation_counter,

View File

@ -0,0 +1,60 @@
import pytest
from ..mountedtype import MountedType
from ..field import Field
from ..objecttype import ObjectType
from ..scalars import String
class CustomField(Field):
def __init__(self, *args, **kwargs):
self.metadata = kwargs.pop('metadata', None)
super(CustomField, self).__init__(*args, **kwargs)
def test_mounted_type():
unmounted = String()
mounted = Field.mount(unmounted)
assert isinstance(mounted, Field)
assert mounted.type == String
def test_mounted_type_custom():
unmounted = String(metadata={'hey': 'yo!'})
mounted = CustomField.mount(unmounted)
assert isinstance(mounted, CustomField)
assert mounted.type == String
assert mounted.metadata == {'hey': 'yo!'}
@pytest.yield_fixture
def custom_field():
# We set the override
Field._mount_cls_override = CustomField
# Run the test
yield CustomField
# Remove the class override (back to the original state)
Field._mount_cls_override = None
def test_mounted_type_overrided(custom_field):
# This function is using the custom_field yield fixture
unmounted = String(metadata={'hey': 'yo!'})
mounted = Field.mount(unmounted)
assert isinstance(mounted, CustomField)
assert mounted.type == String
assert mounted.metadata == {'hey': 'yo!'}
def test_mounted_type_overrided(custom_field):
# This function is using the custom_field yield fixture
class Query(ObjectType):
test = String(metadata={'other': 'thing'})
test_field = Query._meta.fields['test']
assert isinstance(test_field, CustomField)
assert test_field.metadata == {'other': 'thing'}