From ff06d5a540a3c5d5039a4f4b99440128096d4c53 Mon Sep 17 00:00:00 2001 From: Barnabas Jovanovics Date: Tue, 22 Aug 2023 10:05:49 +0200 Subject: [PATCH] fix: wrap type in non-null reference if allow_nil? is set to false --- lib/resource/resource.ex | 48 ++++++++++++++++++++--- test/attribute_test.exs | 19 +++++++-- test/support/resources/constrained_map.ex | 4 +- test/support/resources/map_types.ex | 10 ++++- 4 files changed, 68 insertions(+), 13 deletions(-) diff --git a/lib/resource/resource.ex b/lib/resource/resource.ex index 1fc0e87..ffae4a0 100644 --- a/lib/resource/resource.ex +++ b/lib/resource/resource.ex @@ -2454,13 +2454,24 @@ defmodule AshGraphql.Resource do identifier: name, __reference__: AshGraphql.Resource.ref(env), name: to_string(name), - type: nested_type_name + type: + if Keyword.get( + constraints || [], + :allow_nil?, + true + ) do + nested_type_name + else + %Absinthe.Blueprint.TypeReference.NonNull{ + of_type: nested_type_name + } + end } | fields ] } - _ -> + {type, constraints} -> {types, [ %Absinthe.Blueprint.Schema.FieldDefinition{ @@ -2468,7 +2479,18 @@ defmodule AshGraphql.Resource do identifier: name, __reference__: AshGraphql.Resource.ref(env), name: to_string(name), - type: do_field_type(attribute[:type], nil, nil, false) + type: + if Keyword.get( + constraints || [], + :allow_nil?, + true + ) do + do_field_type(type, nil, nil, false) + else + %Absinthe.Blueprint.TypeReference.NonNull{ + of_type: do_field_type(type, nil, nil, false) + } + end } | fields ]} @@ -2515,13 +2537,20 @@ defmodule AshGraphql.Resource do identifier: name, __reference__: AshGraphql.Resource.ref(env), name: to_string(name), - type: nested_type_name + type: + if Keyword.get(constraints || [], :allow_nil?, true) do + nested_type_name + else + %Absinthe.Blueprint.TypeReference.NonNull{ + of_type: nested_type_name + } + end } | fields ] } - _ -> + {type, constraints} -> {types, [ %Absinthe.Blueprint.Schema.InputValueDefinition{ @@ -2529,7 +2558,14 @@ defmodule AshGraphql.Resource do identifier: name, __reference__: AshGraphql.Resource.ref(env), name: to_string(name), - type: do_field_type(attribute[:type], nil, nil, false) + type: + if Keyword.get(constraints || [], :allow_nil?, true) do + do_field_type(type, nil, nil, false) + else + %Absinthe.Blueprint.TypeReference.NonNull{ + of_type: do_field_type(type, nil, nil, false) + } + end } | fields ]} diff --git a/test/attribute_test.exs b/test/attribute_test.exs index 84e84d5..e23e667 100644 --- a/test/attribute_test.exs +++ b/test/attribute_test.exs @@ -157,8 +157,11 @@ defmodule AshGraphql.AttributeTest do data["__type"]["inputFields"] |> Enum.find(fn field -> field["name"] == "foo" end) - assert foo_field["type"]["kind"] == "SCALAR" - assert foo_field["type"]["name"] == "String" + # non null field + assert foo_field["type"]["kind"] == "NON_NULL" + + assert foo_field["type"]["ofType"]["kind"] == "SCALAR" + assert foo_field["type"]["ofType"]["name"] == "String" bar_field = data["__type"]["inputFields"] @@ -257,7 +260,11 @@ defmodule AshGraphql.AttributeTest do }, %{ "name" => "fooBar", - "type" => %{"kind" => "SCALAR", "name" => "String", "ofType" => nil} + "type" => %{ + "kind" => "NON_NULL", + "name" => nil, + "ofType" => %{"kind" => "SCALAR", "name" => "String"} + } } ] } @@ -301,7 +308,11 @@ defmodule AshGraphql.AttributeTest do }, %{ "name" => "fooBar", - "type" => %{"kind" => "SCALAR", "name" => "String", "ofType" => nil} + "type" => %{ + "kind" => "NON_NULL", + "name" => nil, + "ofType" => %{"kind" => "SCALAR", "name" => "String"} + } } ] } diff --git a/test/support/resources/constrained_map.ex b/test/support/resources/constrained_map.ex index 1a91775..7032875 100644 --- a/test/support/resources/constrained_map.ex +++ b/test/support/resources/constrained_map.ex @@ -6,7 +6,9 @@ defmodule AshGraphql.Test.ConstrainedMap do fields: [ foo_bar: [ type: :string, - allow_nil?: false + constraints: [ + allow_nil?: false + ] ], baz: [ type: :integer diff --git a/test/support/resources/map_types.ex b/test/support/resources/map_types.ex index 361ea8d..bc66e1d 100644 --- a/test/support/resources/map_types.ex +++ b/test/support/resources/map_types.ex @@ -11,7 +11,10 @@ defmodule AshGraphql.Test.MapTypes do constraints( fields: [ foo: [ - type: :string + type: :string, + constraints: [ + allow_nil?: false + ] ], bar: [ type: :integer @@ -39,7 +42,10 @@ defmodule AshGraphql.Test.MapTypes do constraints( fields: [ foo: [ - type: :string + type: :string, + constraints: [ + allow_nil?: false + ] ], bar: [ type: :integer