diff --git a/graphene/types/argument.py b/graphene/types/argument.py index 043cad2b..8a621b42 100644 --- a/graphene/types/argument.py +++ b/graphene/types/argument.py @@ -28,9 +28,14 @@ class Argument(OrderedType): ) -def to_arguments(args, extra_args): +def to_arguments(args, extra_args=None): from .unmountedtype import UnmountedType - extra_args = sorted(extra_args.items(), key=lambda f: f[1]) + from .field import Field + from .inputfield import InputField + if extra_args: + extra_args = sorted(extra_args.items(), key=lambda f: f[1]) + else: + extra_args = [] iter_arguments = chain(args.items(), extra_args) arguments = OrderedDict() for default_name, arg in iter_arguments: @@ -44,6 +49,13 @@ def to_arguments(args, extra_args): if isinstance(arg, UnmountedType): arg = arg.Argument() + if isinstance(arg, (InputField, Field)): + raise ValueError('Expected {} to be Argument, but received {}. Try using Argument({}).'.format( + default_name, + type(arg).__name__, + arg.type + )) + if not isinstance(arg, Argument): raise ValueError('Unknown argument "{}".'.format(default_name)) diff --git a/graphene/types/tests/test_argument.py b/graphene/types/tests/test_argument.py index 34ed3144..b4cc3d58 100644 --- a/graphene/types/tests/test_argument.py +++ b/graphene/types/tests/test_argument.py @@ -1,6 +1,8 @@ import pytest -from ..argument import Argument +from ..argument import Argument, to_arguments +from ..field import Field +from ..inputfield import InputField from ..structures import NonNull from ..scalars import String @@ -24,3 +26,38 @@ def test_argument_comparasion(): def test_argument_required(): arg = Argument(String, required=True) assert arg.type == NonNull(String) + + +def test_to_arguments(): + args = { + 'arg_string': Argument(String), + 'unmounted_arg': String(required=True) + } + + my_args = to_arguments(args) + assert my_args == { + 'arg_string': Argument(String), + 'unmounted_arg': Argument(String, required=True) + } + + +def test_to_arguments_raises_if_field(): + args = { + 'arg_string': Field(String), + } + + with pytest.raises(ValueError) as exc_info: + to_arguments(args) + + assert str(exc_info.value) == 'Expected arg_string to be Argument, but received Field. Try using Argument(String).' + + +def test_to_arguments_raises_if_inputfield(): + args = { + 'arg_string': InputField(String), + } + + with pytest.raises(ValueError) as exc_info: + to_arguments(args) + + assert str(exc_info.value) == 'Expected arg_string to be Argument, but received InputField. Try using Argument(String).'