Improved Django fields testing

This commit is contained in:
Syrus Akbary 2015-10-03 13:51:45 -07:00
parent d47f1d544e
commit 2f3bfdf863
4 changed files with 117 additions and 11 deletions

View File

@ -25,6 +25,7 @@ from graphene.core.fields import (
IDField,
ListField,
NonNullField,
FloatField,
)
from graphene.decorators import (

View File

@ -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)

View File

@ -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)

View File

@ -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)