diff --git a/graphene/types/tests/test_uuid.py b/graphene/types/tests/test_uuid.py index d34f1664..d031387b 100644 --- a/graphene/types/tests/test_uuid.py +++ b/graphene/types/tests/test_uuid.py @@ -36,6 +36,21 @@ def test_uuidstring_query_variable(): assert result.data == {"uuid": uuid_value} +def test_uuidstring_invalid_argument(): + uuid_value = {"not": "a string"} + + result = schema.execute( + """query Test($uuid: UUID){ uuid(input: $uuid) }""", + variables={"uuid": uuid_value}, + ) + assert result.errors + assert len(result.errors) == 1 + assert ( + result.errors[0].message + == "Variable '$uuid' got invalid value {'not': 'a string'}; UUID cannot represent value: {'not': 'a string'}" + ) + + def test_uuidstring_optional_uuid_input(): """ Test that we can provide a null value to an optional input diff --git a/graphene/types/uuid.py b/graphene/types/uuid.py index 773e31c7..5f10a22e 100644 --- a/graphene/types/uuid.py +++ b/graphene/types/uuid.py @@ -1,5 +1,6 @@ from uuid import UUID as _UUID +from graphql.error import GraphQLError from graphql.language.ast import StringValueNode from graphql import Undefined @@ -28,4 +29,9 @@ class UUID(Scalar): @staticmethod def parse_value(value): - return _UUID(value) + if isinstance(value, _UUID): + return value + try: + return _UUID(value) + except (ValueError, AttributeError): + raise GraphQLError(f"UUID cannot represent value: {repr(value)}")