| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent 2f200f8 commit 3b03d75
9 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -3,11 +3,11 @@ import GraphqlCommon; | |||
| 3 | 3 | ||
| 4 | 4 | operationDefinition: | |
| 5 | 5 | selectionSet | | |
| 6 | - operationType name? variableDefinitions? directives? selectionSet; | ||
| 6 | + description? operationType name? variableDefinitions? directives? selectionSet; | ||
| 7 | 7 | ||
| 8 | 8 | variableDefinitions : '(' variableDefinition+ ')'; | |
| 9 | 9 | ||
| 10 | - variableDefinition : variable ':' type defaultValue? directives?; | ||
| 10 | + variableDefinition : description? variable ':' type defaultValue? directives?; | ||
| 11 | 11 | ||
| 12 | 12 | ||
| 13 | 13 | selectionSet : '{' selection+ '}'; | |
@@ -27,7 +27,7 @@ fragmentSpread : '...' fragmentName directives?; | |||
| 27 | 27 | ||
| 28 | 28 | inlineFragment : '...' typeCondition? directives? selectionSet; | |
| 29 | 29 | ||
| 30 | - fragmentDefinition : FRAGMENT fragmentName typeCondition directives? selectionSet; | ||
| 30 | + fragmentDefinition : description? FRAGMENT fragmentName typeCondition directives? selectionSet; | ||
| 31 | 31 | ||
| 32 | 32 | ||
| 33 | 33 | typeCondition : ON_KEYWORD typeName; | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -249,8 +249,13 @@ private static boolean hasDescription(Node<?> node) { | |||
| 249 | 249 | return false; | |
| 250 | 250 | } | |
| 251 | 251 | ||
| 252 | + private static boolean hasDescription(List<? extends Node<?>> nodes) { | ||
| 253 | + return nodes.stream().anyMatch(AstPrinter::hasDescription); | ||
| 254 | + } | ||
| 255 | + | ||
| 252 | 256 | private NodePrinter<FragmentDefinition> fragmentDefinition() { | |
| 253 | 257 | return (out, node) -> { | |
| 258 | + description(out, node); | ||
| 254 | 259 | out.append("fragment "); | |
| 255 | 260 | out.append(node.getName()); | |
| 256 | 261 | out.append(" on "); | |
@@ -367,24 +372,17 @@ private NodePrinter<OperationDefinition> operationDefinition() { | |||
| 367 | 372 | String name = node.getName(); | |
| 368 | 373 | // Anonymous queries with no directives or variable definitions can use | |
| 369 | 374 | // the query short form. | |
| 370 | - if (isEmpty(name) && isEmpty(node.getDirectives()) && isEmpty(node.getVariableDefinitions()) | ||
| 371 | - && node.getOperation() == OperationDefinition.Operation.QUERY) { | ||
| 375 | + if (canUseQueryShortForm(node)) { | ||
| 372 | 376 | node(out, node.getSelectionSet()); | |
| 373 | 377 | } else { | |
| 378 | + description(out, node); | ||
| 374 | 379 | OperationDefinition.Operation op = node.getOperation(); | |
| 375 | 380 | out.append(op.toString().toLowerCase()); | |
| 376 | 381 | if (!isEmpty(name)) { | |
| 377 | 382 | out.append(' '); | |
| 378 | 383 | out.append(name); | |
| 379 | 384 | } | |
| 380 | - if (!isEmpty(node.getVariableDefinitions())) { | ||
| 381 | - if (isEmpty(name)) { | ||
| 382 | - out.append(' '); | ||
| 383 | - } | ||
| 384 | - out.append('('); | ||
| 385 | - join(out, node.getVariableDefinitions(), argSep); | ||
| 386 | - out.append(')'); | ||
| 387 | - } | ||
| 385 | + variableDefinitions(out, node, argSep); | ||
| 388 | 386 | if (!isEmpty(node.getDirectives())) { | |
| 389 | 387 | out.append(' '); | |
| 390 | 388 | directives(out, node.getDirectives()); | |
@@ -397,6 +395,34 @@ private NodePrinter<OperationDefinition> operationDefinition() { | |||
| 397 | 395 | }; | |
| 398 | 396 | } | |
| 399 | 397 | ||
| 398 | + private boolean canUseQueryShortForm(OperationDefinition node) { | ||
| 399 | + return (compactMode || !hasDescription(node)) | ||
| 400 | + && isEmpty(node.getName()) | ||
| 401 | + && isEmpty(node.getDirectives()) | ||
| 402 | + && isEmpty(node.getVariableDefinitions()) | ||
| 403 | + && node.getOperation() == OperationDefinition.Operation.QUERY; | ||
| 404 | + } | ||
| 405 | + | ||
| 406 | + private void variableDefinitions(StringBuilder out, OperationDefinition node, String argSep) { | ||
| 407 | + if (isEmpty(node.getVariableDefinitions())) { | ||
| 408 | + return; | ||
| 409 | + } | ||
| 410 | + if (isEmpty(node.getName())) { | ||
| 411 | + out.append(' '); | ||
| 412 | + } | ||
| 413 | + if (!compactMode && hasDescription(node.getVariableDefinitions())) { | ||
| 414 | + int offset = out.length(); | ||
| 415 | + out.append("(\n"); | ||
| 416 | + join(out, node.getVariableDefinitions(), "\n"); | ||
| 417 | + indent(out, offset); | ||
| 418 | + out.append("\n)"); | ||
| 419 | + return; | ||
| 420 | + } | ||
| 421 | + out.append('('); | ||
| 422 | + join(out, node.getVariableDefinitions(), argSep); | ||
| 423 | + out.append(')'); | ||
| 424 | + } | ||
| 425 | + | ||
| 400 | 426 | private NodePrinter<OperationTypeDefinition> operationTypeDefinition() { | |
| 401 | 427 | String nameTypeSep = compactMode ? ":" : ": "; | |
| 402 | 428 | return (out, node) -> { | |
@@ -546,6 +572,7 @@ private NodePrinter<VariableDefinition> variableDefinition() { | |||
| 546 | 572 | String nameTypeSep = compactMode ? ":" : ": "; | |
| 547 | 573 | String defaultValueEquals = compactMode ? "=" : " = "; | |
| 548 | 574 | return (out, node) -> { | |
| 575 | + description(out, node); | ||
| 549 | 576 | out.append('$'); | |
| 550 | 577 | out.append(node.getName()); | |
| 551 | 578 | out.append(nameTypeSep); | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -27,7 +27,7 @@ | |||
| 27 | 27 | */ | |
| 28 | 28 | @PublicApi | |
| 29 | 29 | @NullMarked | |
| 30 | - public class FragmentDefinition extends AbstractNode<FragmentDefinition> implements Definition<FragmentDefinition>, SelectionSetContainer<FragmentDefinition>, DirectivesContainer<FragmentDefinition>, NamedNode<FragmentDefinition> { | ||
| 30 | + public class FragmentDefinition extends AbstractDescribedNode<FragmentDefinition> implements Definition<FragmentDefinition>, SelectionSetContainer<FragmentDefinition>, DirectivesContainer<FragmentDefinition>, NamedNode<FragmentDefinition> { | ||
| 31 | 31 | ||
| 32 | 32 | private final String name; | |
| 33 | 33 | private final TypeName typeCondition; | |
@@ -43,11 +43,12 @@ protected FragmentDefinition(String name, | |||
| 43 | 43 | TypeName typeCondition, | |
| 44 | 44 | List<Directive> directives, | |
| 45 | 45 | SelectionSet selectionSet, | |
| 46 | + @Nullable Description description, | ||
| 46 | 47 | @Nullable SourceLocation sourceLocation, | |
| 47 | 48 | List<Comment> comments, | |
| 48 | 49 | IgnoredChars ignoredChars, | |
| 49 | 50 | Map<String, String> additionalData) { | |
| 50 | - super(sourceLocation, comments, ignoredChars, additionalData); | ||
| 51 | + super(sourceLocation, comments, ignoredChars, additionalData, description); | ||
| 51 | 52 | this.name = name; | |
| 52 | 53 | this.typeCondition = typeCondition; | |
| 53 | 54 | this.directives = NodeUtil.DirectivesHolder.of(directives); | |
@@ -136,6 +137,7 @@ public FragmentDefinition deepCopy() { | |||
| 136 | 137 | assertNotNull(deepCopy(typeCondition)), | |
| 137 | 138 | assertNotNull(deepCopy(directives.getDirectives())), | |
| 138 | 139 | assertNotNull(deepCopy(selectionSet)), | |
| 140 | + description, | ||
| 139 | 141 | getSourceLocation(), | |
| 140 | 142 | getComments(), | |
| 141 | 143 | getIgnoredChars(), | |
@@ -174,6 +176,7 @@ public static final class Builder implements NodeDirectivesBuilder { | |||
| 174 | 176 | ||
| 175 | 177 | private String name; | |
| 176 | 178 | private TypeName typeCondition; | |
| 179 | + private Description description; | ||
| 177 | 180 | private ImmutableList<Directive> directives = emptyList(); | |
| 178 | 181 | private SelectionSet selectionSet; | |
| 179 | 182 | private IgnoredChars ignoredChars = IgnoredChars.EMPTY; | |
@@ -187,6 +190,7 @@ private Builder(FragmentDefinition existing) { | |||
| 187 | 190 | this.comments = ImmutableList.copyOf(existing.getComments()); | |
| 188 | 191 | this.name = existing.getName(); | |
| 189 | 192 | this.typeCondition = existing.getTypeCondition(); | |
| 193 | + this.description = existing.getDescription(); | ||
| 190 | 194 | this.directives = ImmutableList.copyOf(existing.getDirectives()); | |
| 191 | 195 | this.selectionSet = existing.getSelectionSet(); | |
| 192 | 196 | this.ignoredChars = existing.getIgnoredChars(); | |
@@ -214,6 +218,11 @@ public Builder typeCondition(TypeName typeCondition) { | |||
| 214 | 218 | return this; | |
| 215 | 219 | } | |
| 216 | 220 | ||
| 221 | + public Builder description(Description description) { | ||
| 222 | + this.description = description; | ||
| 223 | + return this; | ||
| 224 | + } | ||
| 225 | + | ||
| 217 | 226 | @Override | |
| 218 | 227 | public Builder directives(List<Directive> directives) { | |
| 219 | 228 | this.directives = ImmutableList.copyOf(directives); | |
@@ -247,7 +256,7 @@ public Builder additionalData(String key, String value) { | |||
| 247 | 256 | ||
| 248 | 257 | ||
| 249 | 258 | public FragmentDefinition build() { | |
| 250 | - return new FragmentDefinition(assertNotNull(name), assertNotNull(typeCondition), directives, assertNotNull(selectionSet), sourceLocation, comments, ignoredChars, additionalData); | ||
| 259 | + return new FragmentDefinition(assertNotNull(name), assertNotNull(typeCondition), directives, assertNotNull(selectionSet), description, sourceLocation, comments, ignoredChars, additionalData); | ||
| 251 | 260 | } | |
| 252 | 261 | } | |
| 253 | 262 | } | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -26,7 +26,7 @@ | |||
| 26 | 26 | ||
| 27 | 27 | @PublicApi | |
| 28 | 28 | @NullMarked | |
| 29 | - public class OperationDefinition extends AbstractNode<OperationDefinition> implements Definition<OperationDefinition>, SelectionSetContainer<OperationDefinition>, DirectivesContainer<OperationDefinition>, NamedNode<OperationDefinition> { | ||
| 29 | + public class OperationDefinition extends AbstractDescribedNode<OperationDefinition> implements Definition<OperationDefinition>, SelectionSetContainer<OperationDefinition>, DirectivesContainer<OperationDefinition>, NamedNode<OperationDefinition> { | ||
| 30 | 30 | ||
| 31 | 31 | public enum Operation { | |
| 32 | 32 | QUERY, MUTATION, SUBSCRIPTION | |
@@ -49,11 +49,12 @@ protected OperationDefinition(@Nullable String name, | |||
| 49 | 49 | List<VariableDefinition> variableDefinitions, | |
| 50 | 50 | List<Directive> directives, | |
| 51 | 51 | SelectionSet selectionSet, | |
| 52 | + @Nullable Description description, | ||
| 52 | 53 | @Nullable SourceLocation sourceLocation, | |
| 53 | 54 | List<Comment> comments, | |
| 54 | 55 | IgnoredChars ignoredChars, | |
| 55 | 56 | Map<String, String> additionalData) { | |
| 56 | - super(sourceLocation, comments, ignoredChars, additionalData); | ||
| 57 | + super(sourceLocation, comments, ignoredChars, additionalData, description); | ||
| 57 | 58 | this.name = name; | |
| 58 | 59 | this.operation = operation; | |
| 59 | 60 | this.variableDefinitions = ImmutableList.copyOf(variableDefinitions); | |
@@ -147,6 +148,7 @@ public OperationDefinition deepCopy() { | |||
| 147 | 148 | assertNotNull(deepCopy(variableDefinitions), "variableDefinitions deepCopy should not return null"), | |
| 148 | 149 | assertNotNull(deepCopy(directives.getDirectives()), "directives deepCopy should not return null"), | |
| 149 | 150 | assertNotNull(deepCopy(selectionSet), "selectionSet deepCopy should not return null"), | |
| 151 | + description, | ||
| 150 | 152 | getSourceLocation(), | |
| 151 | 153 | getComments(), | |
| 152 | 154 | getIgnoredChars(), | |
@@ -185,6 +187,7 @@ public static final class Builder implements NodeDirectivesBuilder { | |||
| 185 | 187 | private ImmutableList<Comment> comments = emptyList(); | |
| 186 | 188 | private String name; | |
| 187 | 189 | private Operation operation = Operation.QUERY; | |
| 190 | + private Description description; | ||
| 188 | 191 | private ImmutableList<VariableDefinition> variableDefinitions = emptyList(); | |
| 189 | 192 | private ImmutableList<Directive> directives = emptyList(); | |
| 190 | 193 | private SelectionSet selectionSet; | |
@@ -199,6 +202,7 @@ private Builder(OperationDefinition existing) { | |||
| 199 | 202 | this.comments = ImmutableList.copyOf(existing.getComments()); | |
| 200 | 203 | this.name = existing.getName(); | |
| 201 | 204 | this.operation = existing.getOperation(); | |
| 205 | + this.description = existing.getDescription(); | ||
| 202 | 206 | this.variableDefinitions = ImmutableList.copyOf(existing.getVariableDefinitions()); | |
| 203 | 207 | this.directives = ImmutableList.copyOf(existing.getDirectives()); | |
| 204 | 208 | this.selectionSet = existing.getSelectionSet(); | |
@@ -227,6 +231,11 @@ public Builder operation(Operation operation) { | |||
| 227 | 231 | return this; | |
| 228 | 232 | } | |
| 229 | 233 | ||
| 234 | + public Builder description(Description description) { | ||
| 235 | + this.description = description; | ||
| 236 | + return this; | ||
| 237 | + } | ||
| 238 | + | ||
| 230 | 239 | public Builder variableDefinitions(List<VariableDefinition> variableDefinitions) { | |
| 231 | 240 | this.variableDefinitions = ImmutableList.copyOf(variableDefinitions); | |
| 232 | 241 | return this; | |
@@ -275,6 +284,7 @@ public OperationDefinition build() { | |||
| 275 | 284 | variableDefinitions, | |
| 276 | 285 | directives, | |
| 277 | 286 | selectionSet, | |
| 287 | + description, | ||
| 278 | 288 | sourceLocation, | |
| 279 | 289 | comments, | |
| 280 | 290 | ignoredChars, | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -21,7 +21,7 @@ | |||
| 21 | 21 | import static graphql.language.NodeChildrenContainer.newNodeChildrenContainer; | |
| 22 | 22 | ||
| 23 | 23 | @PublicApi | |
| 24 | - public class VariableDefinition extends AbstractNode<VariableDefinition> implements DirectivesContainer<VariableDefinition>, NamedNode<VariableDefinition> { | ||
| 24 | + public class VariableDefinition extends AbstractDescribedNode<VariableDefinition> implements DirectivesContainer<VariableDefinition>, NamedNode<VariableDefinition> { | ||
| 25 | 25 | ||
| 26 | 26 | private final String name; | |
| 27 | 27 | private final Type type; | |
@@ -37,11 +37,12 @@ protected VariableDefinition(String name, | |||
| 37 | 37 | Type type, | |
| 38 | 38 | Value defaultValue, | |
| 39 | 39 | List<Directive> directives, | |
| 40 | + Description description, | ||
| 40 | 41 | SourceLocation sourceLocation, | |
| 41 | 42 | List<Comment> comments, | |
| 42 | 43 | IgnoredChars ignoredChars, | |
| 43 | 44 | Map<String, String> additionalData) { | |
| 44 | - super(sourceLocation, comments, ignoredChars, additionalData); | ||
| 45 | + super(sourceLocation, comments, ignoredChars, additionalData, description); | ||
| 45 | 46 | this.name = name; | |
| 46 | 47 | this.type = type; | |
| 47 | 48 | this.defaultValue = defaultValue; | |
@@ -58,7 +59,7 @@ protected VariableDefinition(String name, | |||
| 58 | 59 | public VariableDefinition(String name, | |
| 59 | 60 | Type type, | |
| 60 | 61 | Value defaultValue) { | |
| 61 | - this(name, type, defaultValue, emptyList(), null, emptyList(), IgnoredChars.EMPTY, emptyMap()); | ||
| 62 | + this(name, type, defaultValue, emptyList(), null, null, emptyList(), IgnoredChars.EMPTY, emptyMap()); | ||
| 62 | 63 | } | |
| 63 | 64 | ||
| 64 | 65 | /** | |
@@ -69,7 +70,7 @@ public VariableDefinition(String name, | |||
| 69 | 70 | */ | |
| 70 | 71 | public VariableDefinition(String name, | |
| 71 | 72 | Type type) { | |
| 72 | - this(name, type, null, emptyList(), null, emptyList(), IgnoredChars.EMPTY, emptyMap()); | ||
| 73 | + this(name, type, null, emptyList(), null, null, emptyList(), IgnoredChars.EMPTY, emptyMap()); | ||
| 73 | 74 | } | |
| 74 | 75 | ||
| 75 | 76 | public Value getDefaultValue() { | |
@@ -154,6 +155,7 @@ public VariableDefinition deepCopy() { | |||
| 154 | 155 | deepCopy(type), | |
| 155 | 156 | deepCopy(defaultValue), | |
| 156 | 157 | deepCopy(directives.getDirectives()), | |
| 158 | + description, | ||
| 157 | 159 | getSourceLocation(), | |
| 158 | 160 | getComments(), | |
| 159 | 161 | getIgnoredChars(), | |
@@ -204,6 +206,7 @@ public static final class Builder implements NodeDirectivesBuilder { | |||
| 204 | 206 | private ImmutableList<Comment> comments = emptyList(); | |
| 205 | 207 | private Type type; | |
| 206 | 208 | private Value defaultValue; | |
| 209 | + private Description description; | ||
| 207 | 210 | private ImmutableList<Directive> directives = emptyList(); | |
| 208 | 211 | private IgnoredChars ignoredChars = IgnoredChars.EMPTY; | |
| 209 | 212 | private Map<String, String> additionalData = new LinkedHashMap<>(); | |
@@ -217,6 +220,7 @@ private Builder(VariableDefinition existing) { | |||
| 217 | 220 | this.name = existing.getName(); | |
| 218 | 221 | this.type = existing.getType(); | |
| 219 | 222 | this.defaultValue = existing.getDefaultValue(); | |
| 223 | + this.description = existing.getDescription(); | ||
| 220 | 224 | this.directives = ImmutableList.copyOf(existing.getDirectives()); | |
| 221 | 225 | this.ignoredChars = existing.getIgnoredChars(); | |
| 222 | 226 | this.additionalData = new LinkedHashMap<>(existing.getAdditionalData()); | |
@@ -247,6 +251,11 @@ public Builder defaultValue(Value defaultValue) { | |||
| 247 | 251 | return this; | |
| 248 | 252 | } | |
| 249 | 253 | ||
| 254 | + public Builder description(Description description) { | ||
| 255 | + this.description = description; | ||
| 256 | + return this; | ||
| 257 | + } | ||
| 258 | + | ||
| 250 | 259 | @Override | |
| 251 | 260 | public Builder directives(List<Directive> directives) { | |
| 252 | 261 | this.directives = ImmutableList.copyOf(directives); | |
@@ -279,6 +288,7 @@ public VariableDefinition build() { | |||
| 279 | 288 | type, | |
| 280 | 289 | defaultValue, | |
| 281 | 290 | directives, | |
| 291 | + description, | ||
| 282 | 292 | sourceLocation, | |
| 283 | 293 | comments, | |
| 284 | 294 | ignoredChars, | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -142,6 +142,7 @@ protected OperationDefinition createOperationDefinition(GraphqlParser.OperationD | |||
| 142 | 142 | if (ctx.name() != null) { | |
| 143 | 143 | operationDefinition.name(ctx.name().getText()); | |
| 144 | 144 | } | |
| 145 | + operationDefinition.description(newDescription(ctx.description())); | ||
| 145 | 146 | operationDefinition.variableDefinitions(createVariableDefinitions(ctx.variableDefinitions())); | |
| 146 | 147 | operationDefinition.selectionSet(createSelectionSet(ctx.selectionSet())); | |
| 147 | 148 | operationDefinition.directives(createDirectives(ctx.directives())); | |
@@ -178,6 +179,7 @@ protected List<VariableDefinition> createVariableDefinitions(GraphqlParser.Varia | |||
| 178 | 179 | protected VariableDefinition createVariableDefinition(GraphqlParser.VariableDefinitionContext ctx) { | |
| 179 | 180 | VariableDefinition.Builder variableDefinition = VariableDefinition.newVariableDefinition(); | |
| 180 | 181 | addCommonData(variableDefinition, ctx); | |
| 182 | + variableDefinition.description(newDescription(ctx.description())); | ||
| 181 | 183 | variableDefinition.name(ctx.variable().name().getText()); | |
| 182 | 184 | if (ctx.defaultValue() != null) { | |
| 183 | 185 | Value value = createValue(ctx.defaultValue().value()); | |
@@ -192,6 +194,7 @@ protected VariableDefinition createVariableDefinition(GraphqlParser.VariableDefi | |||
| 192 | 194 | protected FragmentDefinition createFragmentDefinition(GraphqlParser.FragmentDefinitionContext ctx) { | |
| 193 | 195 | FragmentDefinition.Builder fragmentDefinition = FragmentDefinition.newFragmentDefinition(); | |
| 194 | 196 | addCommonData(fragmentDefinition, ctx); | |
| 197 | + fragmentDefinition.description(newDescription(ctx.description())); | ||
| 195 | 198 | fragmentDefinition.name(ctx.fragmentName().getText()); | |
| 196 | 199 | fragmentDefinition.typeCondition(TypeName.newTypeName().name(ctx.typeCondition().typeName().getText()).build()); | |
| 197 | 200 | fragmentDefinition.directives(createDirectives(ctx.directives())); | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -59,6 +59,33 @@ class ParseAndValidateTest extends Specification { | |||
| 59 | 59 | errors.isEmpty() | |
| 60 | 60 | } | |
| 61 | 61 | ||
| 62 | + def "executable descriptions do not affect validation"() { | ||
| 63 | + def input = ExecutionInput.newExecutionInput(''' | ||
| 64 | + "Fetches a hero" | ||
| 65 | + query HeroName( | ||
| 66 | + "The target episode" | ||
| 67 | + $episode: Episode = JEDI | ||
| 68 | + ) { | ||
| 69 | + hero(episode: $episode) { | ||
| 70 | + ...heroFields | ||
| 71 | + } | ||
| 72 | + } | ||
| 73 | + | ||
| 74 | + "Reusable hero fields" | ||
| 75 | + fragment heroFields on Character { | ||
| 76 | + name | ||
| 77 | + } | ||
| 78 | + ''').build() | ||
| 79 | + def result = ParseAndValidate.parse(input) | ||
| 80 | + | ||
| 81 | + when: | ||
| 82 | + def errors = ParseAndValidate.validate(StarWarsSchema.starWarsSchema, result.getDocument(), input.getLocale()) | ||
| 83 | + | ||
| 84 | + then: | ||
| 85 | + !result.isFailure() | ||
| 86 | + errors.isEmpty() | ||
| 87 | + } | ||
| 88 | + | ||
| 62 | 89 | def "will validate documents with actual problems"() { | |
| 63 | 90 | ||
| 64 | 91 | def input = ExecutionInput.newExecutionInput("query { hero }").variables([var1: 1]).build() | |
| Back | FazBrowse Home | New Git URL |
0 commit comments