Skip to content

Commit fc2ab23

Browse files
authored
fix: resolve variable references in GraphQLObjectCoercing (#127)
1 parent a2a6e4c commit fc2ab23

File tree

2 files changed

+137
-4
lines changed

2 files changed

+137
-4
lines changed

graphql-jpa-query-schema/src/main/java/com/introproventures/graphql/jpa/query/schema/JavaScalars.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
import graphql.language.ObjectValue;
5151
import graphql.language.StringValue;
5252
import graphql.language.Value;
53+
import graphql.language.VariableReference;
5354
import graphql.schema.Coercing;
5455
import graphql.schema.CoercingParseValueException;
5556
import graphql.schema.CoercingSerializeException;
@@ -511,11 +512,12 @@ public Object parseValue(Object input) {
511512

512513
@Override
513514
public Object parseLiteral(Object input) {
514-
return parseFieldValue((Value) input, Collections.emptyMap());
515+
return parseLiteral((Value<?>) input, Collections.emptyMap());
515516
}
516517

517518
//recursively parse the input into a Map
518-
private Object parseFieldValue(Object value, Map<String, Object> variables) {
519+
@Override
520+
public Object parseLiteral(Object value, Map<String, Object> variables) {
519521
if (!(value instanceof Value)) {
520522
throw new IllegalArgumentException(
521523
"Expected AST type 'StringValue' but was '" + value + "'.");
@@ -539,18 +541,22 @@ private Object parseFieldValue(Object value, Map<String, Object> variables) {
539541
if (value instanceof NullValue) {
540542
return null;
541543
}
544+
if (value instanceof VariableReference) {
545+
String varName = ((VariableReference) value).getName();
546+
return variables.get(varName);
547+
}
542548
if (value instanceof ArrayValue) {
543549
List<Value> values = ((ArrayValue) value).getValues();
544550
return values.stream()
545-
.map(v -> parseFieldValue(v, variables))
551+
.map(v -> parseLiteral(v, variables))
546552
.collect(Collectors.toList());
547553
}
548554
if (value instanceof ObjectValue) {
549555
List<ObjectField> values = ((ObjectValue) value).getObjectFields();
550556
Map<String, Object> parsedValues = new LinkedHashMap<>();
551557

552558
values.forEach(field -> {
553-
Object parsedValue = parseFieldValue(field.getValue(), variables);
559+
Object parsedValue = parseLiteral(field.getValue(), variables);
554560
parsedValues.put(field.getName(), parsedValue);
555561
});
556562
return parsedValues;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
package com.introproventures.graphql.jpa.query.schema;
2+
3+
4+
import static org.assertj.core.api.Assertions.assertThat;
5+
6+
import java.math.BigDecimal;
7+
import java.math.BigInteger;
8+
import java.util.ArrayList;
9+
import java.util.Collections;
10+
import java.util.LinkedHashMap;
11+
import java.util.List;
12+
import java.util.Map;
13+
14+
import graphql.language.ArrayValue;
15+
import graphql.language.BooleanValue;
16+
import graphql.language.EnumValue;
17+
import graphql.language.FloatValue;
18+
import graphql.language.IntValue;
19+
import graphql.language.NullValue;
20+
import graphql.language.ObjectField;
21+
import graphql.language.ObjectValue;
22+
import graphql.language.StringValue;
23+
import graphql.language.Value;
24+
import graphql.language.VariableReference;
25+
import graphql.schema.Coercing;
26+
import org.junit.Test;
27+
28+
public class ObjectCoercingTests {
29+
30+
private Map<String, Object> variables = Collections.singletonMap( "varRef1", "value1");
31+
32+
private Coercing<?,?> coercing = new JavaScalars.GraphQLObjectCoercing();
33+
34+
@SuppressWarnings("serial")
35+
@Test
36+
public void testASTParsing() {
37+
// when
38+
assertThat(coercing.parseLiteral(mkStringValue("s"), variables)).isEqualTo("s");
39+
assertThat(coercing.parseLiteral(mkFloatValue("99.9"), variables)).isEqualTo(new BigDecimal("99.9"));
40+
assertThat(coercing.parseLiteral(mkIntValue(BigInteger.valueOf(666)), variables)).isEqualTo(BigInteger.valueOf(666));
41+
assertThat(coercing.parseLiteral(mkBooleanValue(true), variables)).isEqualTo(true);
42+
assertThat(coercing.parseLiteral(mkNullValue(), variables)).isEqualTo(null);
43+
assertThat(coercing.parseLiteral(mkVarRef("varRef1"), variables)).isEqualTo("value1");
44+
assertThat(coercing.parseLiteral(mkArrayValue(new ArrayList<Value>() {{ add(mkStringValue("s")); add(mkIntValue(BigInteger.valueOf(666))); }}), variables))
45+
.asList()
46+
.containsExactly("s",BigInteger.valueOf(666));
47+
48+
}
49+
50+
@SuppressWarnings({"serial", "rawtypes"})
51+
@Test
52+
public void testASTObjectParsing() {
53+
Map<String, Value> input = new LinkedHashMap<String, Value>();
54+
55+
input.put("fld1", mkStringValue("s"));
56+
input.put("fld2", mkIntValue(BigInteger.valueOf(666)));
57+
input.put("fld3", mkObjectValue(new LinkedHashMap<String, Value>() {{
58+
put("childFld1", mkStringValue("child1"));
59+
put("childFl2", mkVarRef("varRef1"));
60+
}}));
61+
62+
63+
Map<String, Object> expected = new LinkedHashMap<String, Object>();
64+
65+
expected.put("fld1", "s");
66+
expected.put("fld2", BigInteger.valueOf(666));
67+
expected.put("fld3", new LinkedHashMap<String, Object>() {{
68+
put("childFld1", "child1");
69+
put("childFl2", "value1");
70+
}});
71+
72+
assertThat(coercing.parseLiteral(mkObjectValue(input), variables)).isEqualTo(expected);
73+
}
74+
75+
@Test
76+
public void testSerializeIsAlwaysInAndOut() {
77+
assertThat(coercing.serialize(666)).isEqualTo(666);
78+
assertThat(coercing.serialize("same")).isEqualTo("same");
79+
}
80+
81+
@Test
82+
public void testParseValueIsAlwaysInAndOut() {
83+
assertThat(coercing.parseValue(666)).isEqualTo(666);
84+
assertThat(coercing.parseValue("same")).isEqualTo("same");
85+
}
86+
87+
ObjectValue mkObjectValue(Map<String, Value> fields) {
88+
List<ObjectField> list = new ArrayList<>();
89+
90+
for (String key : fields.keySet()) {
91+
list.add(new ObjectField(key, fields.get(key)));
92+
}
93+
return new ObjectValue(list);
94+
}
95+
96+
VariableReference mkVarRef(String name) {
97+
return new VariableReference(name);
98+
}
99+
100+
ArrayValue mkArrayValue(List<Value> values) {
101+
return new ArrayValue(values);
102+
}
103+
104+
NullValue mkNullValue() {
105+
return NullValue.newNullValue().build();
106+
}
107+
108+
EnumValue mkEnumValue(String val) {
109+
return new EnumValue(val);
110+
}
111+
112+
BooleanValue mkBooleanValue(boolean val) {
113+
return new BooleanValue(val);
114+
}
115+
116+
IntValue mkIntValue(BigInteger val) {
117+
return new IntValue(val);
118+
}
119+
120+
FloatValue mkFloatValue(String val) {
121+
return new FloatValue(new BigDecimal(val));
122+
}
123+
124+
StringValue mkStringValue(String val) {
125+
return new StringValue(val);
126+
}
127+
}

0 commit comments

Comments
 (0)