Skip to content

Commit ef50a71

Browse files
author
Daniel Treacy
committed
Add more tests and fix bugs
1 parent 5dadecc commit ef50a71

4 files changed

Lines changed: 360 additions & 13 deletions

File tree

src/main/java/graphql/schema/SchemaTransformer.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@ public TraversalControl leave(TraverserContext<GraphQLSchemaElement> context) {
163163
public TraversalControl backRef(TraverserContext<GraphQLSchemaElement> context) {
164164
NodeZipper<GraphQLSchemaElement> zipper = zipperByOriginalNode.get(context.thisNode());
165165
breadcrumbsByZipper.get(zipper).add(context.getBreadcrumbs());
166+
visitor.visitBackRef(context);
166167
return TraversalControl.CONTINUE;
167168
}
168169
};

src/main/java/graphql/schema/transform/FieldVisibilitySchemaTransformation.java

Lines changed: 45 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55

66
import graphql.PublicApi;
77
import graphql.schema.GraphQLFieldDefinition;
8+
import graphql.schema.GraphQLInputObjectField;
89
import graphql.schema.GraphQLInterfaceType;
10+
import graphql.schema.GraphQLNamedSchemaElement;
911
import graphql.schema.GraphQLObjectType;
1012
import graphql.schema.GraphQLSchema;
1113
import graphql.schema.GraphQLSchemaElement;
@@ -84,7 +86,10 @@ private FieldVisibilityVisitor(VisibleFieldPredicate visibilityPredicate,
8486
@Override
8587
public TraversalControl visitGraphQLInterfaceType(GraphQLInterfaceType node,
8688
TraverserContext<GraphQLSchemaElement> context) {
87-
observedTypes.add(node);
89+
if (context.getBreadcrumbs().stream()
90+
.noneMatch(crumb -> crumb.getLocation().getName().equalsIgnoreCase("addTypes"))) {
91+
observedTypes.add(node);
92+
}
8893

8994
return TraversalControl.CONTINUE;
9095
}
@@ -94,23 +99,49 @@ public TraversalControl visitGraphQLObjectType(GraphQLObjectType node,
9499
TraverserContext<GraphQLSchemaElement> context) {
95100

96101
if (context.getBreadcrumbs().stream()
97-
.anyMatch(crumb -> crumb.getLocation().getName().equalsIgnoreCase("addTypes"))) {
98-
return TraversalControl.ABORT;
102+
.noneMatch(crumb -> crumb.getLocation().getName().equalsIgnoreCase("addTypes"))) {
103+
observedTypes.add(node);
99104
}
100105

101-
observedTypes.add(node);
102-
103106
return TraversalControl.CONTINUE;
104107
}
105108

106109
@Override
107110
public TraversalControl visitGraphQLFieldDefinition(GraphQLFieldDefinition definition,
108111
TraverserContext<GraphQLSchemaElement> context) {
112+
return visitField(definition, context);
113+
}
114+
115+
@Override
116+
public TraversalControl visitGraphQLInputObjectField(GraphQLInputObjectField definition,
117+
TraverserContext<GraphQLSchemaElement> context) {
118+
return visitField(definition, context);
119+
}
120+
121+
@Override
122+
public TraversalControl visitBackRef(TraverserContext<GraphQLSchemaElement> context) {
123+
if (context.thisNode() instanceof GraphQLInterfaceType || context.thisNode() instanceof GraphQLObjectType) {
124+
if (context.getBreadcrumbs().stream()
125+
.noneMatch(crumb -> crumb.getLocation().getName().equalsIgnoreCase("addTypes"))) {
126+
observedTypes.add((GraphQLType) context.thisNode());
127+
}
128+
}
129+
return TraversalControl.CONTINUE;
130+
}
131+
132+
private TraversalControl visitField(GraphQLNamedSchemaElement element,
133+
TraverserContext<GraphQLSchemaElement> context) {
134+
109135
VisibleFieldPredicateEnvironment environment = new VisibleFieldPredicateEnvironmentImpl(
110-
definition, context.getParentNode());
136+
element, context.getParentNode());
111137
if (!visibilityPredicate.isVisible(environment)) {
112138
deleteNode(context);
113-
removedTypes.add(definition.getType());
139+
140+
if (element instanceof GraphQLFieldDefinition) {
141+
removedTypes.add(((GraphQLFieldDefinition) element).getType());
142+
} else if (element instanceof GraphQLInputObjectField) {
143+
removedTypes.add(((GraphQLInputObjectField) element).getType());
144+
}
114145
}
115146

116147
return TraversalControl.CONTINUE;
@@ -131,10 +162,17 @@ private TypeVisibilityVisitor(Set<String> protectedTypeNames,
131162
this.removedTypes = removedTypes;
132163
}
133164

165+
@Override
166+
public TraversalControl visitGraphQLInterfaceType(GraphQLInterfaceType node,
167+
TraverserContext<GraphQLSchemaElement> context) {
168+
return super.visitGraphQLInterfaceType(node, context);
169+
}
170+
134171
@Override
135172
public TraversalControl visitGraphQLObjectType(GraphQLObjectType node,
136173
TraverserContext<GraphQLSchemaElement> context) {
137174
if (!observedTypes.contains(node) &&
175+
node.getInterfaces().stream().noneMatch(observedTypes::contains) &&
138176
node.getInterfaces().stream().anyMatch(removedTypes::contains) &&
139177
!ScalarInfo.isStandardScalar(node.getName()) &&
140178
!protectedTypeNames.contains(node.getName())) {

src/main/java/graphql/schema/transform/VisibleFieldPredicateEnvironment.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package graphql.schema.transform;
22

33
import graphql.PublicApi;
4-
import graphql.schema.GraphQLFieldDefinition;
4+
import graphql.schema.GraphQLNamedSchemaElement;
55
import graphql.schema.GraphQLSchemaElement;
66

77
/**
@@ -10,7 +10,7 @@
1010
@PublicApi
1111
public interface VisibleFieldPredicateEnvironment {
1212

13-
GraphQLFieldDefinition getFieldDefinition();
13+
GraphQLNamedSchemaElement getFieldDefinition();
1414

1515
/**
1616
* Get the field's immediate parent node.
@@ -21,17 +21,17 @@ public interface VisibleFieldPredicateEnvironment {
2121

2222
class VisibleFieldPredicateEnvironmentImpl implements VisibleFieldPredicateEnvironment {
2323

24-
private final GraphQLFieldDefinition fieldDefinition;
24+
private final GraphQLNamedSchemaElement fieldDefinition;
2525
private final GraphQLSchemaElement parentElement;
2626

27-
public VisibleFieldPredicateEnvironmentImpl(GraphQLFieldDefinition fieldDefinition,
27+
public VisibleFieldPredicateEnvironmentImpl(GraphQLNamedSchemaElement fieldDefinition,
2828
GraphQLSchemaElement parentElement) {
2929
this.fieldDefinition = fieldDefinition;
3030
this.parentElement = parentElement;
3131
}
3232

3333
@Override
34-
public GraphQLFieldDefinition getFieldDefinition() {
34+
public GraphQLNamedSchemaElement getFieldDefinition() {
3535
return fieldDefinition;
3636
}
3737

0 commit comments

Comments
 (0)