Skip to content

Commit f0109d3

Browse files
committed
fix handling null default values for input fields with object or list types (wundergraph#707)
1 parent 593c352 commit f0109d3

File tree

3 files changed

+64
-9
lines changed

3 files changed

+64
-9
lines changed

v2/pkg/astnormalization/inject_input_default_values.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -171,13 +171,17 @@ func (v *inputFieldDefaultInjectionVisitor) processObjectOrListInput(fieldType i
171171
finalVal := defaultValue
172172
replaced := false
173173
valIsList := valType == jsonparser.Array
174-
if fieldIsList && valIsList {
174+
175+
switch {
176+
case valType == jsonparser.Null:
177+
replaced = true
178+
case fieldIsList && valIsList:
175179
_, err := jsonparser.ArrayEach(varVal, v.jsonWalker(typeDoc.ResolveListOrNameType(fieldType), defaultValue, &node, typeDoc, &finalVal, &replaced))
176180
if err != nil {
177181
return nil, false, err
178182

179183
}
180-
} else if !fieldIsList && !valIsList {
184+
case !fieldIsList && !valIsList:
181185
finalVal, replaced, err = v.recursiveInjectInputFields(node.Ref, defaultValue)
182186
if err != nil {
183187
return nil, false, err

v2/pkg/astnormalization/inject_input_default_values_test.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,20 @@ type Mutation {
3232
mutationSimpleInputList(in: [SimpleTestInput]): String
3333
mutationUseCustomScalar(in: CustomScalar!): String
3434
mutationUseCustomScalarList(in: [CustomScalar!]): String
35+
36+
testNullDefaultValuesForObjectAndList(data: NullDefaultForObjectAndListField!): String!
37+
testNullDefaultValueForFields(data: NullDefaultFields!): String!
38+
}
39+
40+
input NullDefaultForObjectAndListField {
41+
other: String!
42+
nested: NullDefaultFields = null
43+
nestedList: [NullDefaultFields] = null
44+
}
45+
46+
input NullDefaultFields {
47+
a: String = null
48+
b: Int = null
3549
}
3650
3751
input MultiNestedInput {
@@ -264,4 +278,31 @@ func TestInputDefaultValueExtraction(t *testing.T) {
264278
mutationUseCustomScalarList(in: $a)
265279
}`, `{"a":[{"test": "testval"}]}`, `{"a":[{"test": "testval"}]}`)
266280
})
281+
282+
t.Run("null default value for object and list fields", func(t *testing.T) {
283+
runWithVariables(t, extractVariables, testInputDefaultSchema, `
284+
mutation TestDefaults($data: NullDefaultForObjectAndListField!) {
285+
testNullDefaultValuesForObjectAndList(data: $data)
286+
}`, "", `
287+
mutation TestDefaults($data: NullDefaultForObjectAndListField!) {
288+
testNullDefaultValuesForObjectAndList(data: $data)
289+
}`, `{"data":{"other":"value"}}`,
290+
`{"data":{"other":"value","nested":null,"nestedList":null}}`,
291+
func(walker *astvisitor.Walker) {
292+
injectInputFieldDefaults(walker)
293+
})
294+
})
295+
296+
t.Run("null default value for scalar fields", func(t *testing.T) {
297+
runWithVariables(t, extractVariables, testInputDefaultSchema, `
298+
mutation{
299+
testNullDefaultValueForFields(data: {})
300+
}`, "", `
301+
mutation($a: NullDefaultFields!) {
302+
testNullDefaultValueForFields(data: $a)
303+
}`, "", `{"a":{"a":null,"b":null}}`,
304+
func(walker *astvisitor.Walker) {
305+
injectInputFieldDefaults(walker)
306+
})
307+
})
267308
}

v2/pkg/astnormalization/variables_default_value_extraction_test.go

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ const (
2929
}
3030
type Mutation {
3131
simple(input: String = "foo"): String
32-
mixed(a: String, b: String, input: String = "foo", nonNullInput: String! = "bar"): String
32+
mixed(a: String, b: String, input: String = "foo", nonNullInput: String! = "bar", nullableWithNullDefault: String = null): String
3333
}
3434
scalar String
3535
input ComplexInput {
@@ -70,9 +70,9 @@ func TestVariablesDefaultValueExtraction(t *testing.T) {
7070
mutation simple($a: String) {
7171
mixed(a: $a, b: "bar")
7272
}`, "", `
73-
mutation simple($a: String, $b: String, $c: String!) {
74-
mixed(a: $a, b: "bar", input: $b, nonNullInput: $c)
75-
}`, `{"a":"aaa"}`, `{"c":"bar","b":"foo","a":"aaa"}`)
73+
mutation simple($a: String, $b: String, $c: String!, $d: String) {
74+
mixed(a: $a, b: "bar", input: $b, nonNullInput: $c, nullableWithNullDefault: $d)
75+
}`, `{"a":"aaa"}`, `{"d":null,"c":"bar","b":"foo","a":"aaa"}`)
7676
})
7777
})
7878

@@ -261,9 +261,19 @@ func TestVariablesDefaultValueExtraction(t *testing.T) {
261261
mutation simple($a: String = "bar", $b: String = "bazz") {
262262
mixed(a: $a, b: $b)
263263
}`, "", `
264-
mutation simple($a: String, $b: String, $c: String, $d: String!) {
265-
mixed(a: $a, b: $b, input: $c, nonNullInput: $d)
266-
}`, `{"a":"aaa"}`, `{"d":"bar","c":"foo","b":"bazz","a":"aaa"}`)
264+
mutation simple($a: String, $b: String, $c: String, $d: String!, $e: String) {
265+
mixed(a: $a, b: $b, input: $c, nonNullInput: $d, nullableWithNullDefault: $e)
266+
}`, `{"a":"aaa"}`, `{"e":null,"d":"bar","c":"foo","b":"bazz","a":"aaa"}`)
267267

268268
})
269+
270+
t.Run("variable with null default value", func(t *testing.T) {
271+
runWithVariablesDefaultValues(t, extractVariablesDefaultValue, variablesDefaultValueExtractionDefinition, `
272+
query q($data: ComplexInput = null) {
273+
complex(input: $data)
274+
}`, "", `
275+
query q($data: ComplexInput) {
276+
complex(input: $data)
277+
}`, ``, `{"data":null}`)
278+
})
269279
}

0 commit comments

Comments
 (0)