Skip to content

Passing JSONString with value "null" as mutation input leads to an error. #224

Open
@sergey-komissarov

Description

@sergey-komissarov

Hello, graphql-core 2.1 is unable to parse such values as argument.

Result: Argument "value" has invalid value "null". Expected type "JSONString", found "null".

Seems that None value is invalid regardless of the argument type. Of course we can handle it by passing null via query argument but I still think this is a bug.

Exception stack trace:

File "/venv/lib/python3.7/site-packages/graphql/graphql.py", line 44, in graphql
     return execute_graphql(*args, **kwargs)
File "/venv/lib/python3.7/site-packages/graphql/graphql.py", line 70, in execute_graphql
     **execute_options
File "/venv/lib/python3.7/site-packages/graphql/backend/core.py", line 30, in execute_and_validate
     validation_errors = validate(schema, document_ast)
File "/venv/lib/python3.7/site-packages/graphql/validation/validation.py", line 33, in validate
     return visit_using_rules(schema, type_info, ast, rules)
File "/venv/lib/python3.7/site-packages/graphql/validation/validation.py", line 40, in visit_using_rules
     visit(ast, TypeInfoVisitor(type_info, ParallelVisitor(visitors)))
File "/venv/lib/python3.7/site-packages/graphql/language/visitor.py", line 128, in visit
     result = enter(node, key, parent, path, ancestors)
File "/venv/lib/python3.7/site-packages/graphql/language/visitor.py", line 279, in enter
     result = self.visitor.enter(node, key, parent, path, ancestors)
File "/venv/lib/python3.7/site-packages/graphql/language/visitor.py", line 231, in enter
     result = visitor.enter(node, key, parent, path, ancestors)
File "/venv/lib/python3.7/site-packages/graphql/language/visitor.py", line 191, in enter
     return method(self, node, key, parent, path, ancestors)
File "/venv/lib/python3.7/site-packages/graphql/validation/rules/arguments_of_correct_type.py", line 24, in enter_Argument
     errors = is_valid_literal_value(arg_def.type, node.value)
File "/venv/lib/python3.7/site-packages/graphql/utils/is_valid_literal_value.py", line 86, in is_valid_literal_value
     if parse_result is None:

Simple way to reproduce:

Query example:

mutation {
  testNull(value: "null") { value }
}

GraphQL schema:

TestNull:
  value: JSONString

testNull(value: JSONString): TestNull

Graphene code:

class TestNull(graphene.Mutation):
    class Input:
        value = graphene.JSONString()

    value = graphene.JSONString()

    @classmethod
    def mutate(cls, instance, input, info):
        value = input.get('value')
        print(f"VALUE={value}")
        return TestNull(value=value)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions