diff --git a/bom/application/pom.xml b/bom/application/pom.xml
index 1be4e177d50cb..2dfb8b8f178b2 100644
--- a/bom/application/pom.xml
+++ b/bom/application/pom.xml
@@ -44,7 +44,7 @@
3.2.1
3.0.5
2.1.23
- 1.6.2
+ 1.7.0
2.1.1
5.5.0
3.5.3
diff --git a/extensions/smallrye-graphql/deployment/src/main/java/io/quarkus/smallrye/graphql/deployment/SmallRyeGraphQLProcessor.java b/extensions/smallrye-graphql/deployment/src/main/java/io/quarkus/smallrye/graphql/deployment/SmallRyeGraphQLProcessor.java
index df27e9ab5c54c..0a24fad627214 100644
--- a/extensions/smallrye-graphql/deployment/src/main/java/io/quarkus/smallrye/graphql/deployment/SmallRyeGraphQLProcessor.java
+++ b/extensions/smallrye-graphql/deployment/src/main/java/io/quarkus/smallrye/graphql/deployment/SmallRyeGraphQLProcessor.java
@@ -46,6 +46,7 @@
import io.quarkus.deployment.builditem.ShutdownContextBuildItem;
import io.quarkus.deployment.builditem.SystemPropertyBuildItem;
import io.quarkus.deployment.builditem.TransformedClassesBuildItem;
+import io.quarkus.deployment.builditem.nativeimage.NativeImageResourceBundleBuildItem;
import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem;
import io.quarkus.deployment.builditem.nativeimage.ReflectiveHierarchyBuildItem;
import io.quarkus.deployment.builditem.nativeimage.ServiceProviderBuildItem;
@@ -194,6 +195,12 @@ void registerNativeImageResources(BuildProducer servic
.produce(ServiceProviderBuildItem.allProvidersFromClassPath(SmallRyeGraphQLConfigMapping.class.getName()));
}
+ @BuildStep
+ void registerNativeResourceBundle(BuildProducer nativeResourceBundleProvider)
+ throws IOException {
+ nativeResourceBundleProvider.produce(new NativeImageResourceBundleBuildItem("i18n.Validation"));
+ }
+
@BuildStep
SmallRyeGraphQLModifiedClasesBuildItem createIndex(TransformedClassesBuildItem transformedClassesBuildItem) {
Map modifiedClasses = new HashMap<>();
diff --git a/extensions/smallrye-graphql/deployment/src/test/java/io/quarkus/smallrye/graphql/deployment/HotReloadTest.java b/extensions/smallrye-graphql/deployment/src/test/java/io/quarkus/smallrye/graphql/deployment/HotReloadTest.java
index bc17dcc634f58..6eacf9b78afd3 100644
--- a/extensions/smallrye-graphql/deployment/src/test/java/io/quarkus/smallrye/graphql/deployment/HotReloadTest.java
+++ b/extensions/smallrye-graphql/deployment/src/test/java/io/quarkus/smallrye/graphql/deployment/HotReloadTest.java
@@ -52,7 +52,7 @@ public void testAddAndRemoveFieldChange() {
.statusCode(200)
.and()
.body(CoreMatchers.containsString(
- "{\"errors\":[{\"message\":\"Validation error of type FieldUndefined: Field 'foo' in type 'TestPojo' is undefined @ 'foo/foo'\",\"locations\":[{\"line\":7,\"column\":5}],\"extensions\":{\"classification\":\"ValidationError\"}}],\"data\":null}"));
+ "{\"errors\":[{\"message\":\"Validation error (FieldUndefined@[foo/foo]) : Field 'foo' in type 'TestPojo' is undefined\",\"locations\":[{\"line\":7,\"column\":5}],\"extensions\":{\"classification\":\"ValidationError\"}}],\"data\":null}"));
LOG.info("Initial request done");
// Make a code change (add a field)
@@ -94,7 +94,7 @@ public void testAddAndRemoveFieldChange() {
.statusCode(200)
.and()
.body(CoreMatchers.containsString(
- "{\"errors\":[{\"message\":\"Validation error of type FieldUndefined: Field 'foo' in type 'TestPojo' is undefined @ 'foo/foo'\",\"locations\":[{\"line\":7,\"column\":5}],\"extensions\":{\"classification\":\"ValidationError\"}}],\"data\":null}"));
+ "{\"errors\":[{\"message\":\"Validation error (FieldUndefined@[foo/foo]) : Field 'foo' in type 'TestPojo' is undefined\",\"locations\":[{\"line\":7,\"column\":5}],\"extensions\":{\"classification\":\"ValidationError\"}}],\"data\":null}"));
LOG.info("Code change done - field removed");
diff --git a/extensions/smallrye-graphql/deployment/src/test/java/io/quarkus/smallrye/graphql/deployment/InstrumentationTest.java b/extensions/smallrye-graphql/deployment/src/test/java/io/quarkus/smallrye/graphql/deployment/InstrumentationTest.java
new file mode 100644
index 0000000000000..fdd4ea5f203e7
--- /dev/null
+++ b/extensions/smallrye-graphql/deployment/src/test/java/io/quarkus/smallrye/graphql/deployment/InstrumentationTest.java
@@ -0,0 +1,84 @@
+package io.quarkus.smallrye.graphql.deployment;
+
+import static io.quarkus.smallrye.graphql.deployment.AbstractGraphQLTest.getPropertyAsString;
+import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.nullValue;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.microprofile.graphql.GraphQLApi;
+import org.eclipse.microprofile.graphql.Query;
+import org.eclipse.microprofile.graphql.Source;
+import org.jboss.shrinkwrap.api.asset.EmptyAsset;
+import org.jboss.shrinkwrap.api.asset.StringAsset;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
+
+import io.quarkus.test.QuarkusUnitTest;
+import io.restassured.RestAssured;
+import io.smallrye.common.annotation.NonBlocking;
+
+public class InstrumentationTest extends AbstractGraphQLTest {
+
+ @RegisterExtension
+ static QuarkusUnitTest test = new QuarkusUnitTest()
+ .withApplicationRoot((jar) -> jar
+ .addClasses(FooApi.class, Foo.class)
+ .addAsResource(new StringAsset(getPropertyAsString(configuration())), "application.properties")
+ .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml"));
+
+ @Test
+ public void testQueryDepth() {
+ String query = getPayload("{ foo { nestedFoo { nestedFoo { message}}}}");
+ RestAssured.given()
+ .body(query)
+ .contentType(MEDIATYPE_JSON)
+ .post("/graphql/")
+ .then()
+ .log().all()
+ .assertThat()
+ .body("errors[0].message", equalTo("maximum query depth exceeded 4 > 1"))
+ .body("data", nullValue());
+ }
+
+ private static Map configuration() {
+ Map m = new HashMap<>();
+ m.put("quarkus.smallrye-graphql.events.enabled", "true");
+ m.put("quarkus.smallrye-graphql.instrumentation-query-depth", "1");
+ return m;
+ }
+
+ public static class Foo {
+
+ private String message;
+
+ public Foo(String foo) {
+ this.message = foo;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ }
+
+ @GraphQLApi
+ public static class FooApi {
+
+ @Query
+ @NonBlocking
+ public Foo foo() {
+ return new Foo("foo");
+ }
+
+ public Foo nestedFoo(@Source Foo foo) {
+ return new Foo("foo");
+ }
+ }
+
+}
diff --git a/extensions/smallrye-graphql/runtime/src/main/java/io/quarkus/smallrye/graphql/runtime/SmallRyeGraphQLConfig.java b/extensions/smallrye-graphql/runtime/src/main/java/io/quarkus/smallrye/graphql/runtime/SmallRyeGraphQLConfig.java
index f5aae3013b908..fa340d09cf5a2 100644
--- a/extensions/smallrye-graphql/runtime/src/main/java/io/quarkus/smallrye/graphql/runtime/SmallRyeGraphQLConfig.java
+++ b/extensions/smallrye-graphql/runtime/src/main/java/io/quarkus/smallrye/graphql/runtime/SmallRyeGraphQLConfig.java
@@ -152,17 +152,59 @@ public class SmallRyeGraphQLConfig {
public Optional> unwrapExceptions;
/**
- * SmallRye GraphQL UI configuration
+ * Subprotocols that should be supported by the server for graphql-over-websocket use cases.
+ * Allowed subprotocols are "graphql-ws" and "graphql-transport-ws". By default, both are enabled.
*/
@ConfigItem
- @ConfigDocSection
- public SmallRyeGraphQLUIConfig ui;
+ public Optional> websocketSubprotocols;
/**
- * Subprotocols that should be supported by the server for graphql-over-websocket use cases.
- * Allowed subprotocols are "graphql-ws" and "graphql-transport-ws". By default, both are enabled.
+ * Set to true if ignored chars should be captured as AST nodes. Default to false
*/
@ConfigItem
- public Optional> websocketSubprotocols;
+ public Optional parserCaptureIgnoredChars;
+
+ /**
+ * Set to true if `graphql.language.Comment`s should be captured as AST nodes
+ */
+ @ConfigItem
+ public Optional parserCaptureLineComments;
+
+ /**
+ * Set to true true if `graphql.language.SourceLocation`s should be captured as AST nodes. Default to true
+ */
+ @ConfigItem
+ public Optional parserCaptureSourceLocation;
+ /**
+ * The maximum number of raw tokens the parser will accept, after which an exception will be thrown. Default to 15000
+ */
+ @ConfigItem
+ public Optional parserMaxTokens;
+
+ /**
+ * The maximum number of raw whitespace tokens the parser will accept, after which an exception will be thrown. Default to
+ * 200000
+ */
+ @ConfigItem
+ public Optional parserMaxWhitespaceTokens;
+
+ /**
+ * Abort a query if the total number of data fields queried exceeds the defined limit. Default to no limit
+ */
+ @ConfigItem
+ public Optional instrumentationQueryComplexity;
+
+ /**
+ * Abort a query if the total depth of the query exceeds the defined limit. Default to no limit
+ */
+ @ConfigItem
+ public Optional instrumentationQueryDepth;
+
+ /**
+ * SmallRye GraphQL UI configuration
+ */
+ @ConfigItem
+ @ConfigDocSection
+ public SmallRyeGraphQLUIConfig ui;
}
diff --git a/extensions/smallrye-graphql/runtime/src/main/java/io/quarkus/smallrye/graphql/runtime/SmallRyeGraphQLConfigMapping.java b/extensions/smallrye-graphql/runtime/src/main/java/io/quarkus/smallrye/graphql/runtime/SmallRyeGraphQLConfigMapping.java
index 2625810641aaf..3c563b548b69c 100644
--- a/extensions/smallrye-graphql/runtime/src/main/java/io/quarkus/smallrye/graphql/runtime/SmallRyeGraphQLConfigMapping.java
+++ b/extensions/smallrye-graphql/runtime/src/main/java/io/quarkus/smallrye/graphql/runtime/SmallRyeGraphQLConfigMapping.java
@@ -49,6 +49,13 @@ private static Map relocations() {
mapKey(relocations, ConfigKey.LOG_PAYLOAD, QUARKUS_LOG_PAYLOAD);
mapKey(relocations, ConfigKey.FIELD_VISIBILITY, QUARKUS_FIELD_VISIBILITY);
mapKey(relocations, ConfigKey.UNWRAP_EXCEPTIONS, QUARKUS_UNWRAP_EXCEPTIONS);
+ mapKey(relocations, ConfigKey.PARSER_CAPTURE_IGNORED_CHARS, QUARKUS_PARSER_CAPTURE_IGNORED_CHARS);
+ mapKey(relocations, ConfigKey.PARSER_CAPTURE_LINE_COMMENTS, QUARKUS_PARSER_CAPTURE_LINE_COMMENTS);
+ mapKey(relocations, ConfigKey.PARSER_CAPTURE_SOURCE_LOCATION, QUARKUS_PARSER_CAPTURE_SOURCE_LOCATION);
+ mapKey(relocations, ConfigKey.PARSER_MAX_TOKENS, QUARKUS_PARSER_MAX_TOKENS);
+ mapKey(relocations, ConfigKey.PARSER_MAX_WHITESPACE_TOKENS, QUARKUS_PARSER_MAX_WHITESPACE_TOKENS);
+ mapKey(relocations, ConfigKey.INSTRUMENTATION_QUERY_COMPLEXITY, QUARKUS_INSTRUMENTATION_QUERY_COMPLEXITY);
+ mapKey(relocations, ConfigKey.INSTRUMENTATION_QUERY_DEPTH, QUARKUS_INSTRUMENTATION_QUERY_DEPTH);
mapKey(relocations, SHOW_ERROR_MESSAGE, QUARKUS_SHOW_ERROR_MESSAGE);
mapKey(relocations, HIDE_ERROR_MESSAGE, QUARKUS_HIDE_ERROR_MESSAGE);
return Collections.unmodifiableMap(relocations);
@@ -75,5 +82,12 @@ private static void mapKey(Map map, String quarkusKey, String ot
private static final String QUARKUS_LOG_PAYLOAD = "quarkus.smallrye-graphql.log-payload";
private static final String QUARKUS_FIELD_VISIBILITY = "quarkus.smallrye-graphql.field-visibility";
private static final String QUARKUS_UNWRAP_EXCEPTIONS = "quarkus.smallrye-graphql.unwrap-exceptions";
+ private static final String QUARKUS_PARSER_CAPTURE_IGNORED_CHARS = "quarkus.smallrye-graphql.parser-capture-ignored-chars";
+ private static final String QUARKUS_PARSER_CAPTURE_LINE_COMMENTS = "quarkus.smallrye-graphql.parser-capture-line-comments";
+ private static final String QUARKUS_PARSER_CAPTURE_SOURCE_LOCATION = "quarkus.smallrye-graphql.parser-capture-source-location";
+ private static final String QUARKUS_PARSER_MAX_TOKENS = "quarkus.smallrye-graphql.parser-max-tokens";
+ private static final String QUARKUS_PARSER_MAX_WHITESPACE_TOKENS = "quarkus.smallrye-graphql.parser-max-whitespace-tokens";
+ private static final String QUARKUS_INSTRUMENTATION_QUERY_COMPLEXITY = "quarkus.smallrye-graphql.instrumentation-query-complexity";
+ private static final String QUARKUS_INSTRUMENTATION_QUERY_DEPTH = "quarkus.smallrye-graphql.instrumentation-query-depth";
}
diff --git a/jakarta/rewrite.yml b/jakarta/rewrite.yml
index c499fc4b91ce9..02b557922cf22 100644
--- a/jakarta/rewrite.yml
+++ b/jakarta/rewrite.yml
@@ -516,7 +516,7 @@ recipeList:
newValue: 6.0.0-RC4
- org.openrewrite.maven.ChangePropertyValue:
key: smallrye-graphql.version
- newValue: 2.0.0.RC6
+ newValue: 2.0.0.RC7
- org.openrewrite.maven.ChangePropertyValue:
key: smallrye-health.version
newValue: 4.0.0-RC2
diff --git a/tcks/microprofile-graphql/src/main/resources/overrides/createNewNullNamedHero/output2.json b/tcks/microprofile-graphql/src/main/resources/overrides/createNewNullNamedHero/output2.json
new file mode 100644
index 0000000000000..068ed46a76cae
--- /dev/null
+++ b/tcks/microprofile-graphql/src/main/resources/overrides/createNewNullNamedHero/output2.json
@@ -0,0 +1,14 @@
+{
+ "errors": [
+ {
+ "message": "Validation error (WrongType@[createNewHero]) : argument 'hero.name' with value 'NullValue{}' must not be null",
+ "locations": [
+ {
+ "line": 2,
+ "column": 19
+ }
+ ]
+ }
+ ],
+ "data": null
+}
\ No newline at end of file
diff --git a/tcks/microprofile-graphql/src/main/resources/overrides/createNewUnnamedHero/output2.json b/tcks/microprofile-graphql/src/main/resources/overrides/createNewUnnamedHero/output2.json
new file mode 100644
index 0000000000000..ea8331aa708a1
--- /dev/null
+++ b/tcks/microprofile-graphql/src/main/resources/overrides/createNewUnnamedHero/output2.json
@@ -0,0 +1,14 @@
+{
+ "errors": [
+ {
+ "message": "Validation error (WrongType@[createNewHero]) : argument 'hero' with value 'ObjectValue{objectFields=[ObjectField{name='realName', value=StringValue{value='John Smith'}}]}' is missing required fields '[name]'",
+ "locations": [
+ {
+ "line": 2,
+ "column": 19
+ }
+ ]
+ }
+ ],
+ "data": null
+}
\ No newline at end of file
diff --git a/tcks/microprofile-graphql/src/main/resources/overrides/invalidDataTypeValue/output3.json b/tcks/microprofile-graphql/src/main/resources/overrides/invalidDataTypeValue/output3.json
new file mode 100644
index 0000000000000..5f9b23eab9939
--- /dev/null
+++ b/tcks/microprofile-graphql/src/main/resources/overrides/invalidDataTypeValue/output3.json
@@ -0,0 +1,16 @@
+{
+ "errors": [
+ {
+ "message": "argument 'powerLevel' with value 'StringValue{value='Unlimited'}' is not a valid 'Int'",
+ "locations": [
+ {
+ "line": 2,
+ "column": 37
+ }
+ ]
+ }
+ ],
+ "data": {
+ "updateItemPowerLevel": null
+ }
+}
diff --git a/tcks/microprofile-graphql/src/main/resources/overrides/invalidEnumValue/output2.json b/tcks/microprofile-graphql/src/main/resources/overrides/invalidEnumValue/output2.json
new file mode 100644
index 0000000000000..a667fb5d6128f
--- /dev/null
+++ b/tcks/microprofile-graphql/src/main/resources/overrides/invalidEnumValue/output2.json
@@ -0,0 +1,14 @@
+{
+ "errors": [
+ {
+ "message": "Validation error (WrongType@[createNewHero]) : argument 'hero.tshirtSize' with value 'EnumValue{name='XLTall'}' is not a valid 'ShirtSize' - Expected enum literal value not in allowable values - 'EnumValue{name='XLTall'}'.",
+ "locations": [
+ {
+ "line": 3,
+ "column": 19
+ }
+ ]
+ }
+ ],
+ "data": null
+}
\ No newline at end of file
diff --git a/tcks/microprofile-graphql/src/main/resources/overrides/invalidLocalDateFormattedValue/output3.json b/tcks/microprofile-graphql/src/main/resources/overrides/invalidLocalDateFormattedValue/output3.json
new file mode 100644
index 0000000000000..4fcff2375ff9f
--- /dev/null
+++ b/tcks/microprofile-graphql/src/main/resources/overrides/invalidLocalDateFormattedValue/output3.json
@@ -0,0 +1,16 @@
+{
+ "errors": [
+ {
+ "message": "argument 'date' with value 'StringValue{value='Today'}' is not a valid 'Date'",
+ "locations": [
+ {
+ "line": 2,
+ "column": 49
+ }
+ ]
+ }
+ ],
+ "data": {
+ "checkInWithCorrectDateFormat": null
+ }
+}
diff --git a/tcks/microprofile-graphql/src/main/resources/overrides/invalidLocalDateTimeFormattedValue/output3.json b/tcks/microprofile-graphql/src/main/resources/overrides/invalidLocalDateTimeFormattedValue/output3.json
new file mode 100644
index 0000000000000..34be441fabf1d
--- /dev/null
+++ b/tcks/microprofile-graphql/src/main/resources/overrides/invalidLocalDateTimeFormattedValue/output3.json
@@ -0,0 +1,16 @@
+{
+ "errors": [
+ {
+ "message": "argument 'dateTime' with value 'StringValue{value='Today'}' is not a valid 'DateTime'",
+ "locations": [
+ {
+ "line": 2,
+ "column": 48
+ }
+ ]
+ }
+ ],
+ "data": {
+ "battleWithCorrectDateFormat": null
+ }
+}
\ No newline at end of file
diff --git a/tcks/microprofile-graphql/src/main/resources/overrides/invalidLocalDateTimeValue/output3.json b/tcks/microprofile-graphql/src/main/resources/overrides/invalidLocalDateTimeValue/output3.json
new file mode 100644
index 0000000000000..af2c0dc4eb76b
--- /dev/null
+++ b/tcks/microprofile-graphql/src/main/resources/overrides/invalidLocalDateTimeValue/output3.json
@@ -0,0 +1,16 @@
+{
+ "errors": [
+ {
+ "message": "argument 'dateTime' with value 'StringValue{value='Today'}' is not a valid 'DateTime'",
+ "locations": [
+ {
+ "line": 2,
+ "column": 27
+ }
+ ]
+ }
+ ],
+ "data": {
+ "battle": null
+ }
+}
\ No newline at end of file
diff --git a/tcks/microprofile-graphql/src/main/resources/overrides/invalidLocalDateValue/output3.json b/tcks/microprofile-graphql/src/main/resources/overrides/invalidLocalDateValue/output3.json
new file mode 100644
index 0000000000000..49fac88d88889
--- /dev/null
+++ b/tcks/microprofile-graphql/src/main/resources/overrides/invalidLocalDateValue/output3.json
@@ -0,0 +1,16 @@
+{
+ "errors": [
+ {
+ "message": "argument 'date' with value 'StringValue{value='Today'}' is not a valid 'Date'",
+ "locations": [
+ {
+ "line": 2,
+ "column": 28
+ }
+ ]
+ }
+ ],
+ "data": {
+ "checkIn": null
+ }
+}
diff --git a/tcks/microprofile-graphql/src/main/resources/overrides/invalidLocalTimeFormattedValue/output3.json b/tcks/microprofile-graphql/src/main/resources/overrides/invalidLocalTimeFormattedValue/output3.json
new file mode 100644
index 0000000000000..dbd8088308d7d
--- /dev/null
+++ b/tcks/microprofile-graphql/src/main/resources/overrides/invalidLocalTimeFormattedValue/output3.json
@@ -0,0 +1,16 @@
+{
+ "errors": [
+ {
+ "message": "argument 'time' with value 'StringValue{value='Today'}' is not a valid 'Time'",
+ "locations": [
+ {
+ "line": 2,
+ "column": 57
+ }
+ ]
+ }
+ ],
+ "data": {
+ "startPatrollingWithCorrectDateFormat": null
+ }
+}
diff --git a/tcks/microprofile-graphql/src/main/resources/overrides/invalidLocalTimeValue/output3.json b/tcks/microprofile-graphql/src/main/resources/overrides/invalidLocalTimeValue/output3.json
new file mode 100644
index 0000000000000..78d6bfd37101a
--- /dev/null
+++ b/tcks/microprofile-graphql/src/main/resources/overrides/invalidLocalTimeValue/output3.json
@@ -0,0 +1,16 @@
+{
+ "errors": [
+ {
+ "message": "argument 'time' with value 'StringValue{value='Today'}' is not a valid 'Time'",
+ "locations": [
+ {
+ "line": 2,
+ "column": 36
+ }
+ ]
+ }
+ ],
+ "data": {
+ "startPatrolling": null
+ }
+}
\ No newline at end of file
diff --git a/tcks/microprofile-graphql/src/main/resources/overrides/unknownField/output2.json b/tcks/microprofile-graphql/src/main/resources/overrides/unknownField/output2.json
new file mode 100644
index 0000000000000..6715517fca358
--- /dev/null
+++ b/tcks/microprofile-graphql/src/main/resources/overrides/unknownField/output2.json
@@ -0,0 +1,14 @@
+{
+ "errors": [
+ {
+ "message": "Validation error (FieldUndefined@[allHeroes/weaknesses]) : Field 'weaknesses' in type 'SuperHero' is undefined",
+ "locations": [
+ {
+ "line": 4,
+ "column": 5
+ }
+ ]
+ }
+ ],
+ "data": null
+}
\ No newline at end of file
diff --git a/tcks/microprofile-graphql/src/main/resources/overrides/unknownMutation/output2.json b/tcks/microprofile-graphql/src/main/resources/overrides/unknownMutation/output2.json
new file mode 100644
index 0000000000000..c63695ca06309
--- /dev/null
+++ b/tcks/microprofile-graphql/src/main/resources/overrides/unknownMutation/output2.json
@@ -0,0 +1,14 @@
+{
+ "errors": [
+ {
+ "message": "Validation error (FieldUndefined@[createNewHeroCat]) : Field 'createNewHeroCat' in type 'Mutation' is undefined",
+ "locations": [
+ {
+ "line": 2,
+ "column": 5
+ }
+ ]
+ }
+ ],
+ "data": null
+}
\ No newline at end of file
diff --git a/tcks/microprofile-graphql/src/main/resources/overrides/unknownQuery/output2.json b/tcks/microprofile-graphql/src/main/resources/overrides/unknownQuery/output2.json
new file mode 100644
index 0000000000000..474c2b5d5cc76
--- /dev/null
+++ b/tcks/microprofile-graphql/src/main/resources/overrides/unknownQuery/output2.json
@@ -0,0 +1,14 @@
+{
+ "errors": [
+ {
+ "message": "Validation error (FieldUndefined@[allHeroesWhoLikeIceCream]) : Field 'allHeroesWhoLikeIceCream' in type 'Query' is undefined",
+ "locations": [
+ {
+ "line": 2,
+ "column": 3
+ }
+ ]
+ }
+ ],
+ "data": null
+}