From bc3d9e59d4d85476829d5e31f161cfb1a0189032 Mon Sep 17 00:00:00 2001 From: helloqiu Date: Wed, 24 Oct 2018 18:08:50 +0800 Subject: [PATCH] fix(converter): wrap field with NonNull if it is required #536 --- graphene_django/converter.py | 10 +++++----- graphene_django/tests/test_converter.py | 22 ++++++++++++++++++++-- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/graphene_django/converter.py b/graphene_django/converter.py index c40313df0..3369a9da9 100644 --- a/graphene_django/converter.py +++ b/graphene_django/converter.py @@ -211,10 +211,10 @@ def dynamic_type(): @convert_django_field.register(ArrayField) def convert_postgres_array_to_list(field, registry=None): - base_type = convert_django_field(field.base_field) - if not isinstance(base_type, (List, NonNull)): - base_type = type(base_type) - return List(base_type, description=field.help_text, required=not field.null) + inner_type = convert_django_field(field.base_field) + if not isinstance(inner_type, (List, NonNull)): + inner_type = NonNull(type(inner_type)) if inner_type.kwargs['required'] else type(inner_type) + return List(inner_type, description=field.help_text, required=not field.null) @convert_django_field.register(HStoreField) @@ -227,5 +227,5 @@ def convert_posgres_field_to_string(field, registry=None): def convert_posgres_range_to_string(field, registry=None): inner_type = convert_django_field(field.base_field) if not isinstance(inner_type, (List, NonNull)): - inner_type = type(inner_type) + inner_type = NonNull(type(inner_type)) if inner_type.kwargs['required'] else type(inner_type) return List(inner_type, description=field.help_text, required=not field.null) diff --git a/graphene_django/tests/test_converter.py b/graphene_django/tests/test_converter.py index 5dc0184c1..b3d4eefa8 100644 --- a/graphene_django/tests/test_converter.py +++ b/graphene_django/tests/test_converter.py @@ -241,7 +241,7 @@ class A(DjangoObjectType): class Meta: model = Article - graphene_field = convert_django_field(Reporter.articles.rel, + graphene_field = convert_django_field(Reporter.articles.rel, A._meta.registry) assert isinstance(graphene_field, graphene.Dynamic) dynamic_field = graphene_field.get_type() @@ -270,6 +270,14 @@ def test_should_postgres_array_convert_list(): ) assert isinstance(field.type, graphene.NonNull) assert isinstance(field.type.of_type, graphene.List) + assert isinstance(field.type.of_type.of_type, graphene.NonNull) + assert field.type.of_type.of_type.of_type == graphene.String + + field = assert_conversion( + ArrayField, graphene.List, models.CharField(max_length=100, null=True) + ) + assert isinstance(field.type, graphene.NonNull) + assert isinstance(field.type.of_type, graphene.List) assert field.type.of_type.of_type == graphene.String @@ -281,6 +289,15 @@ def test_should_postgres_array_multiple_convert_list(): assert isinstance(field.type, graphene.NonNull) assert isinstance(field.type.of_type, graphene.List) assert isinstance(field.type.of_type.of_type, graphene.List) + assert isinstance(field.type.of_type.of_type.of_type, graphene.NonNull) + assert field.type.of_type.of_type.of_type.of_type == graphene.String + + field = assert_conversion( + ArrayField, graphene.List, ArrayField(models.CharField(max_length=100, null=True)) + ) + assert isinstance(field.type, graphene.NonNull) + assert isinstance(field.type.of_type, graphene.List) + assert isinstance(field.type.of_type.of_type, graphene.List) assert field.type.of_type.of_type.of_type == graphene.String @@ -301,4 +318,5 @@ def test_should_postgres_range_convert_list(): field = assert_conversion(IntegerRangeField, graphene.List) assert isinstance(field.type, graphene.NonNull) assert isinstance(field.type.of_type, graphene.List) - assert field.type.of_type.of_type == graphene.Int + assert isinstance(field.type.of_type.of_type, graphene.NonNull) + assert field.type.of_type.of_type.of_type == graphene.Int