From 2f3bfdf863ad6c9efbd32b0a961b1d59a4e3c57a Mon Sep 17 00:00:00 2001 From: Syrus Akbary Date: Sat, 3 Oct 2015 13:51:45 -0700 Subject: [PATCH] Improved Django fields testing --- graphene/__init__.py | 1 + graphene/contrib/django/converter.py | 20 ++--- graphene/contrib/django/types.py | 2 +- tests/contrib_django/test_converter.py | 105 +++++++++++++++++++++++++ 4 files changed, 117 insertions(+), 11 deletions(-) create mode 100644 tests/contrib_django/test_converter.py diff --git a/graphene/__init__.py b/graphene/__init__.py index cfcd6177..91d019d2 100644 --- a/graphene/__init__.py +++ b/graphene/__init__.py @@ -25,6 +25,7 @@ from graphene.core.fields import ( IDField, ListField, NonNullField, + FloatField, ) from graphene.decorators import ( diff --git a/graphene/contrib/django/converter.py b/graphene/contrib/django/converter.py index 2595a68d..098ab4c2 100644 --- a/graphene/contrib/django/converter.py +++ b/graphene/contrib/django/converter.py @@ -13,7 +13,7 @@ from graphene.contrib.django.fields import ConnectionOrListField, DjangoModelFie @singledispatch -def convert_django_field(field, cls): +def convert_django_field(field): raise Exception( "Don't know how to convert the Django field %s (%s)" % (field, field.__class__)) @@ -25,12 +25,12 @@ def convert_django_field(field, cls): @convert_django_field.register(models.SlugField) @convert_django_field.register(models.URLField) @convert_django_field.register(models.UUIDField) -def _(field, cls): +def _(field): return StringField(description=field.description) @convert_django_field.register(models.AutoField) -def _(field, cls): +def _(field): return IDField(description=field.description) @@ -39,33 +39,33 @@ def _(field, cls): @convert_django_field.register(models.SmallIntegerField) @convert_django_field.register(models.BigIntegerField) @convert_django_field.register(models.IntegerField) -def _(field, cls): +def _(field): return IntField(description=field.description) @convert_django_field.register(models.BooleanField) -def _(field, cls): +def _(field): return BooleanField(description=field.description, null=False) @convert_django_field.register(models.NullBooleanField) -def _(field, cls): - return BooleanField(description=field.description) +def _(field): + return BooleanField(description=field.description, null=True) @convert_django_field.register(models.FloatField) -def _(field, cls): +def _(field): return FloatField(description=field.description) @convert_django_field.register(models.ManyToManyField) @convert_django_field.register(models.ManyToOneRel) -def _(field, cls): +def _(field): model_field = DjangoModelField(field.related_model) return ConnectionOrListField(model_field) @convert_django_field.register(models.OneToOneField) @convert_django_field.register(models.ForeignKey) -def _(field, cls): +def _(field): return DjangoModelField(field.related_model, description=field.description) diff --git a/graphene/contrib/django/types.py b/graphene/contrib/django/types.py index d88a7f14..0c5026dc 100644 --- a/graphene/contrib/django/types.py +++ b/graphene/contrib/django/types.py @@ -33,7 +33,7 @@ class DjangoObjectTypeMeta(ObjectTypeMeta): # We skip this field if we specify only_fields and is not # in there. Or when we excldue this field in exclude_fields continue - converted_field = convert_django_field(field, cls) + converted_field = convert_django_field(field) cls.add_to_class(field.name, converted_field) diff --git a/tests/contrib_django/test_converter.py b/tests/contrib_django/test_converter.py new file mode 100644 index 00000000..37402608 --- /dev/null +++ b/tests/contrib_django/test_converter.py @@ -0,0 +1,105 @@ +from py.test import raises +from collections import namedtuple +from pytest import raises +import graphene +from graphene import relay +from graphene.contrib.django.converter import ( + convert_django_field +) +from graphene.contrib.django.fields import ( + ConnectionOrListField, + DjangoModelField +) +from django.db import models +from .models import Article, Reporter + + +def assert_conversion(django_field, graphene_field, *args): + field = django_field(*args) + graphene_type = convert_django_field(field) + assert isinstance(graphene_type, graphene_field) + return graphene_type + + +def test_should_unknown_django_field_raise_exception(): + with raises(Exception) as excinfo: + convert_django_field(None) + assert 'Don\'t know how to convert the Django field' in str(excinfo.value) + + +def test_should_date_convert_string(): + assert_conversion(models.DateField, graphene.StringField) + + +def test_should_char_convert_string(): + assert_conversion(models.CharField, graphene.StringField) + + +def test_should_text_convert_string(): + assert_conversion(models.TextField, graphene.StringField) + + +def test_should_email_convert_string(): + assert_conversion(models.EmailField, graphene.StringField) + + +def test_should_slug_convert_string(): + assert_conversion(models.SlugField, graphene.StringField) + + +def test_should_url_convert_string(): + assert_conversion(models.URLField, graphene.StringField) + + +def test_should_auto_convert_id(): + assert_conversion(models.AutoField, graphene.IDField) + + +def test_should_positive_integer_convert_int(): + assert_conversion(models.PositiveIntegerField, graphene.IntField) + + +def test_should_positive_small_convert_int(): + assert_conversion(models.PositiveSmallIntegerField, graphene.IntField) + + +def test_should_small_integer_convert_int(): + assert_conversion(models.SmallIntegerField, graphene.IntField) + + +def test_should_big_integer_convert_int(): + assert_conversion(models.BigIntegerField, graphene.IntField) + + +def test_should_integer_convert_int(): + assert_conversion(models.IntegerField, graphene.IntField) + + +def test_should_boolean_convert_boolean(): + assert_conversion(models.BooleanField, graphene.BooleanField) + + +def test_should_nullboolean_convert_boolean(): + field = assert_conversion(models.NullBooleanField, graphene.BooleanField) + assert field.null == True + + +def test_should_float_convert_float(): + assert_conversion(models.FloatField, graphene.FloatField) + + +def test_should_manytomany_convert_connectionorlist(): + field = assert_conversion(models.ManyToManyField, ConnectionOrListField, Article) + + +def test_should_manytoone_convert_connectionorlist(): + graphene_type = convert_django_field(Reporter.articles.related) + assert isinstance(graphene_type, ConnectionOrListField) + + +def test_should_onetoone_convert_model(): + assert_conversion(models.OneToOneField, DjangoModelField, Article) + + +def test_should_onetoone_convert_model(): + assert_conversion(models.ForeignKey, DjangoModelField, Article)