From ee46d8c7bed7528a847fc2bdf4ce4ff2b50f6c54 Mon Sep 17 00:00:00 2001 From: Syrus Akbary Date: Wed, 15 Jun 2016 21:16:31 -0700 Subject: [PATCH] Improved Scalars tests --- graphene/types/tests/test_scalars.py | 88 +++++++++++++++++++++++++++- 1 file changed, 85 insertions(+), 3 deletions(-) diff --git a/graphene/types/tests/test_scalars.py b/graphene/types/tests/test_scalars.py index e97365cb..20b1b0eb 100644 --- a/graphene/types/tests/test_scalars.py +++ b/graphene/types/tests/test_scalars.py @@ -1,21 +1,65 @@ +import datetime import pytest from graphene.utils.get_graphql_type import get_graphql_type -from graphql import GraphQLBoolean, GraphQLFloat, GraphQLInt, GraphQLString +from graphql import GraphQLBoolean, GraphQLFloat, GraphQLInt, GraphQLString, GraphQLScalarType, graphql +from graphql.language import ast from ..field import Field from ..objecttype import ObjectType from ..scalars import Boolean, Float, Int, Scalar, String +from ..schema import Schema class DatetimeScalar(Scalar): + class Meta: + name = 'DateTime' - def serialize(value): - return value.isoformat() + @staticmethod + def serialize(dt): + assert isinstance(dt, datetime.datetime) + return dt.isoformat() + + @staticmethod + def parse_literal(node): + if isinstance(node, ast.StringValue): + return datetime.datetime.strptime(node.value, "%Y-%m-%dT%H:%M:%S.%f") + + @staticmethod + def parse_value(value): + return datetime.datetime.strptime(value, "%Y-%m-%dT%H:%M:%S.%f") + + +def serialize_date_time(dt): + assert isinstance(dt, datetime.datetime) + return dt.isoformat() + + +def parse_literal(node): + if isinstance(node, ast.StringValue): + return datetime.datetime.strptime(node.value, "%Y-%m-%dT%H:%M:%S.%f") + + +def parse_value(value): + return datetime.datetime.strptime(value, "%Y-%m-%dT%H:%M:%S.%f") + + +GraphQLDateTimeType = GraphQLScalarType( + name='DateTime', + serialize=serialize_date_time, + parse_literal=parse_literal, + parse_value=parse_value +) + + +class DatetimeScalarGraphQL(Scalar): + class Meta: + graphql_type = GraphQLDateTimeType scalar_classes = { DatetimeScalar: DatetimeScalar._meta.graphql_type, + DatetimeScalarGraphQL: GraphQLDateTimeType, String: GraphQLString, Int: GraphQLInt, Float: GraphQLFloat, @@ -55,3 +99,41 @@ def test_custom_scalar_empty(): pass assert """DatetimeScalar must provide "serialize" function.""" in str(excinfo.value) + + +@pytest.mark.parametrize("scalar_class", (DatetimeScalar, DatetimeScalarGraphQL)) +def test_custom_scalar_empty(scalar_class): + class Query(ObjectType): + datetime = scalar_class(_in=scalar_class(name='in')) + + def resolve_datetime(self, args, context, info): + return args.get('in') + + now = datetime.datetime.now() + isoformat = now.isoformat() + + schema = Schema(query=Query) + + response = graphql(schema, ''' + { + datetime(in: "%s") + } + ''' % isoformat) + + assert not response.errors + assert response.data == { + 'datetime': isoformat + } + + response = graphql(schema, ''' + query Test($date: DateTime) { + datetime(in: $date) + } + ''', variable_values={ + 'date': isoformat + }) + + assert not response.errors + assert response.data == { + 'datetime': isoformat + }