Skip to content

Commit cf9c208

Browse files
committed
Handle enum value rename
1 parent 94f924f commit cf9c208

4 files changed

Lines changed: 95 additions & 4 deletions

File tree

src/main/java/graphql/schema/diffing/ana/EditOperationAnalyzer.java

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@
88
import graphql.schema.diffing.Mapping;
99
import graphql.schema.diffing.SchemaGraph;
1010
import graphql.schema.diffing.Vertex;
11-
import graphql.schema.diffing.ana.SchemaDifference.AppliedDirectiveArgumentRename;
12-
import graphql.schema.diffing.ana.SchemaDifference.AppliedDirectiveObjectLocation;
1311
import graphql.schema.idl.ScalarInfo;
1412

1513
import java.util.LinkedHashMap;
@@ -19,6 +17,7 @@
1917
import static graphql.Assert.assertTrue;
2018
import static graphql.schema.diffing.ana.SchemaDifference.AppliedDirectiveAddition;
2119
import static graphql.schema.diffing.ana.SchemaDifference.AppliedDirectiveArgumentDeletion;
20+
import static graphql.schema.diffing.ana.SchemaDifference.AppliedDirectiveArgumentRename;
2221
import static graphql.schema.diffing.ana.SchemaDifference.AppliedDirectiveArgumentValueModification;
2322
import static graphql.schema.diffing.ana.SchemaDifference.AppliedDirectiveDeletion;
2423
import static graphql.schema.diffing.ana.SchemaDifference.AppliedDirectiveDirectiveArgumentLocation;
@@ -31,6 +30,7 @@
3130
import static graphql.schema.diffing.ana.SchemaDifference.AppliedDirectiveInterfaceLocation;
3231
import static graphql.schema.diffing.ana.SchemaDifference.AppliedDirectiveObjectFieldArgumentLocation;
3332
import static graphql.schema.diffing.ana.SchemaDifference.AppliedDirectiveObjectFieldLocation;
33+
import static graphql.schema.diffing.ana.SchemaDifference.AppliedDirectiveObjectLocation;
3434
import static graphql.schema.diffing.ana.SchemaDifference.AppliedDirectiveScalarLocation;
3535
import static graphql.schema.diffing.ana.SchemaDifference.AppliedDirectiveUnionLocation;
3636
import static graphql.schema.diffing.ana.SchemaDifference.DirectiveAddition;
@@ -48,6 +48,7 @@
4848
import static graphql.schema.diffing.ana.SchemaDifference.EnumModification;
4949
import static graphql.schema.diffing.ana.SchemaDifference.EnumValueAddition;
5050
import static graphql.schema.diffing.ana.SchemaDifference.EnumValueDeletion;
51+
import static graphql.schema.diffing.ana.SchemaDifference.EnumValueRenamed;
5152
import static graphql.schema.diffing.ana.SchemaDifference.InputObjectAddition;
5253
import static graphql.schema.diffing.ana.SchemaDifference.InputObjectDeletion;
5354
import static graphql.schema.diffing.ana.SchemaDifference.InputObjectDifference;
@@ -336,11 +337,9 @@ private void appliedDirectiveArgumentChanged(EditOperation editOperation) {
336337
if (nameChanged) {
337338
AppliedDirectiveArgumentRename argumentRename = new AppliedDirectiveArgumentRename(location, oldArgumentName, newArgumentName);
338339
getObjectModification(object.getName()).getDetails().add(argumentRename);
339-
340340
}
341341
}
342342
}
343-
344343
}
345344

346345
private void appliedDirectiveAdded(EditOperation editOperation) {
@@ -616,6 +615,11 @@ private void handleEnumValuesChanges(List<EditOperation> editOperations, Mapping
616615
handleEnumValueDeleted(editOperation);
617616
}
618617
break;
618+
case CHANGE_VERTEX:
619+
if (editOperation.getSourceVertex().isOfType(SchemaGraph.ENUM_VALUE) && editOperation.getTargetVertex().isOfType(SchemaGraph.ENUM_VALUE)) {
620+
handleEnumValueChanged(editOperation);
621+
}
622+
break;
619623
}
620624
}
621625
}
@@ -724,6 +728,13 @@ private void handleEnumValueDeleted(EditOperation editOperation) {
724728
enumModification.getDetails().add(new EnumValueDeletion(value.getName()));
725729
}
726730

731+
private void handleEnumValueChanged(EditOperation editOperation) {
732+
Vertex enumVertex = newSchemaGraph.getEnumForEnumValue(editOperation.getTargetVertex());
733+
EnumModification enumModification = getEnumModification(enumVertex.getName());
734+
String oldName = editOperation.getSourceVertex().getName();
735+
String newName = editOperation.getTargetVertex().getName();
736+
enumModification.getDetails().add(new EnumValueRenamed(oldName, newName));
737+
}
727738

728739
private void fieldChanged(EditOperation editOperation) {
729740
Vertex field = editOperation.getTargetVertex();

src/main/java/graphql/schema/diffing/ana/SchemaDifference.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -954,6 +954,24 @@ public String getName() {
954954
}
955955
}
956956

957+
class EnumValueRenamed implements EnumModificationDetail {
958+
private final String oldName;
959+
private final String newName;
960+
961+
public EnumValueRenamed(String oldName, String newName) {
962+
this.oldName = oldName;
963+
this.newName = newName;
964+
}
965+
966+
public String getOldName() {
967+
return oldName;
968+
}
969+
970+
public String getNewName() {
971+
return newName;
972+
}
973+
}
974+
957975
class EnumValueAddition implements EnumModificationDetail {
958976
private final String name;
959977

src/test/groovy/graphql/schema/diffing/SchemaDiffingTest.groovy

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1083,6 +1083,34 @@ class SchemaDiffingTest extends Specification {
10831083
operations.size() == 2
10841084
}
10851085

1086+
def "rename enum value"() {
1087+
given:
1088+
def schema1 = schema("""
1089+
type Query {
1090+
foo: Foo
1091+
}
1092+
enum Foo {
1093+
V1
1094+
V2
1095+
}
1096+
""")
1097+
def schema2 = schema("""
1098+
type Query {
1099+
foo: Foo
1100+
}
1101+
enum Foo {
1102+
V1
1103+
V3
1104+
}
1105+
""")
1106+
1107+
when:
1108+
def operations = new SchemaDiffing().diffGraphQLSchema(schema1, schema2)
1109+
1110+
then:
1111+
operations.size() == 1
1112+
}
1113+
10861114
def "arguments in directives changed"() {
10871115
given:
10881116
def schema1 = schema('''

src/test/groovy/graphql/schema/diffing/ana/EditOperationAnalyzerTest.groovy

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import static graphql.schema.diffing.ana.SchemaDifference.EnumDeletion
1717
import static graphql.schema.diffing.ana.SchemaDifference.EnumModification
1818
import static graphql.schema.diffing.ana.SchemaDifference.EnumValueAddition
1919
import static graphql.schema.diffing.ana.SchemaDifference.EnumValueDeletion
20+
import static graphql.schema.diffing.ana.SchemaDifference.EnumValueRenamed
2021
import static graphql.schema.diffing.ana.SchemaDifference.InputObjectAddition
2122
import static graphql.schema.diffing.ana.SchemaDifference.InputObjectDeletion
2223
import static graphql.schema.diffing.ana.SchemaDifference.InputObjectFieldAddition
@@ -1149,6 +1150,39 @@ class EditOperationAnalyzerTest extends Specification {
11491150
enumModification.getDetails(EnumValueDeletion)[0].name == "B"
11501151
}
11511152

1153+
def "enum value added and removed"() {
1154+
given:
1155+
def oldSdl = '''
1156+
type Query {
1157+
e: MyEnum
1158+
}
1159+
enum MyEnum {
1160+
A
1161+
B
1162+
}
1163+
'''
1164+
def newSdl = '''
1165+
type Query {
1166+
e: MyEnum
1167+
}
1168+
enum MyEnum {
1169+
A
1170+
C
1171+
}
1172+
'''
1173+
when:
1174+
def changes = calcDiff(oldSdl, newSdl)
1175+
then:
1176+
changes.enumDifferences["MyEnum"] instanceof EnumModification
1177+
1178+
def enumModification = changes.enumDifferences["MyEnum"] as EnumModification
1179+
enumModification.getDetails().size() == 1
1180+
1181+
def rename = enumModification.getDetails(EnumValueRenamed)[0]
1182+
rename.oldName == "B"
1183+
rename.newName == "C"
1184+
}
1185+
11521186
def "scalar added"() {
11531187
given:
11541188
def oldSdl = '''

0 commit comments

Comments
 (0)