diff --git a/src/main/java/graphql/schema/diffing/ana/EditOperationAnalyzer.java b/src/main/java/graphql/schema/diffing/ana/EditOperationAnalyzer.java index 2b1e11868d..7915fd5b35 100644 --- a/src/main/java/graphql/schema/diffing/ana/EditOperationAnalyzer.java +++ b/src/main/java/graphql/schema/diffing/ana/EditOperationAnalyzer.java @@ -8,8 +8,6 @@ import graphql.schema.diffing.Mapping; import graphql.schema.diffing.SchemaGraph; import graphql.schema.diffing.Vertex; -import graphql.schema.diffing.ana.SchemaDifference.AppliedDirectiveArgumentRename; -import graphql.schema.diffing.ana.SchemaDifference.AppliedDirectiveObjectLocation; import graphql.schema.idl.ScalarInfo; import java.util.LinkedHashMap; @@ -19,6 +17,7 @@ import static graphql.Assert.assertTrue; import static graphql.schema.diffing.ana.SchemaDifference.AppliedDirectiveAddition; import static graphql.schema.diffing.ana.SchemaDifference.AppliedDirectiveArgumentDeletion; +import static graphql.schema.diffing.ana.SchemaDifference.AppliedDirectiveArgumentRename; import static graphql.schema.diffing.ana.SchemaDifference.AppliedDirectiveArgumentValueModification; import static graphql.schema.diffing.ana.SchemaDifference.AppliedDirectiveDeletion; import static graphql.schema.diffing.ana.SchemaDifference.AppliedDirectiveDirectiveArgumentLocation; @@ -31,6 +30,7 @@ import static graphql.schema.diffing.ana.SchemaDifference.AppliedDirectiveInterfaceLocation; import static graphql.schema.diffing.ana.SchemaDifference.AppliedDirectiveObjectFieldArgumentLocation; import static graphql.schema.diffing.ana.SchemaDifference.AppliedDirectiveObjectFieldLocation; +import static graphql.schema.diffing.ana.SchemaDifference.AppliedDirectiveObjectLocation; import static graphql.schema.diffing.ana.SchemaDifference.AppliedDirectiveScalarLocation; import static graphql.schema.diffing.ana.SchemaDifference.AppliedDirectiveUnionLocation; import static graphql.schema.diffing.ana.SchemaDifference.DirectiveAddition; @@ -48,6 +48,7 @@ import static graphql.schema.diffing.ana.SchemaDifference.EnumModification; import static graphql.schema.diffing.ana.SchemaDifference.EnumValueAddition; import static graphql.schema.diffing.ana.SchemaDifference.EnumValueDeletion; +import static graphql.schema.diffing.ana.SchemaDifference.EnumValueRenamed; import static graphql.schema.diffing.ana.SchemaDifference.InputObjectAddition; import static graphql.schema.diffing.ana.SchemaDifference.InputObjectDeletion; import static graphql.schema.diffing.ana.SchemaDifference.InputObjectDifference; @@ -336,11 +337,9 @@ private void appliedDirectiveArgumentChanged(EditOperation editOperation) { if (nameChanged) { AppliedDirectiveArgumentRename argumentRename = new AppliedDirectiveArgumentRename(location, oldArgumentName, newArgumentName); getObjectModification(object.getName()).getDetails().add(argumentRename); - } } } - } private void appliedDirectiveAdded(EditOperation editOperation) { @@ -616,6 +615,11 @@ private void handleEnumValuesChanges(List editOperations, Mapping handleEnumValueDeleted(editOperation); } break; + case CHANGE_VERTEX: + if (editOperation.getSourceVertex().isOfType(SchemaGraph.ENUM_VALUE) && editOperation.getTargetVertex().isOfType(SchemaGraph.ENUM_VALUE)) { + handleEnumValueChanged(editOperation); + } + break; } } } @@ -724,6 +728,13 @@ private void handleEnumValueDeleted(EditOperation editOperation) { enumModification.getDetails().add(new EnumValueDeletion(value.getName())); } + private void handleEnumValueChanged(EditOperation editOperation) { + Vertex enumVertex = newSchemaGraph.getEnumForEnumValue(editOperation.getTargetVertex()); + EnumModification enumModification = getEnumModification(enumVertex.getName()); + String oldName = editOperation.getSourceVertex().getName(); + String newName = editOperation.getTargetVertex().getName(); + enumModification.getDetails().add(new EnumValueRenamed(oldName, newName)); + } private void fieldChanged(EditOperation editOperation) { Vertex field = editOperation.getTargetVertex(); diff --git a/src/main/java/graphql/schema/diffing/ana/SchemaDifference.java b/src/main/java/graphql/schema/diffing/ana/SchemaDifference.java index dc43f16c2d..8d809269cd 100644 --- a/src/main/java/graphql/schema/diffing/ana/SchemaDifference.java +++ b/src/main/java/graphql/schema/diffing/ana/SchemaDifference.java @@ -954,6 +954,24 @@ public String getName() { } } + class EnumValueRenamed implements EnumModificationDetail { + private final String oldName; + private final String newName; + + public EnumValueRenamed(String oldName, String newName) { + this.oldName = oldName; + this.newName = newName; + } + + public String getOldName() { + return oldName; + } + + public String getNewName() { + return newName; + } + } + class EnumValueAddition implements EnumModificationDetail { private final String name; diff --git a/src/test/groovy/graphql/schema/diffing/SchemaDiffingTest.groovy b/src/test/groovy/graphql/schema/diffing/SchemaDiffingTest.groovy index 8f55d7bc12..e9d5bf5202 100644 --- a/src/test/groovy/graphql/schema/diffing/SchemaDiffingTest.groovy +++ b/src/test/groovy/graphql/schema/diffing/SchemaDiffingTest.groovy @@ -1083,6 +1083,34 @@ class SchemaDiffingTest extends Specification { operations.size() == 2 } + def "rename enum value"() { + given: + def schema1 = schema(""" + type Query { + foo: Foo + } + enum Foo { + V1 + V2 + } + """) + def schema2 = schema(""" + type Query { + foo: Foo + } + enum Foo { + V1 + V3 + } + """) + + when: + def operations = new SchemaDiffing().diffGraphQLSchema(schema1, schema2) + + then: + operations.size() == 1 + } + def "arguments in directives changed"() { given: def schema1 = schema(''' diff --git a/src/test/groovy/graphql/schema/diffing/ana/EditOperationAnalyzerTest.groovy b/src/test/groovy/graphql/schema/diffing/ana/EditOperationAnalyzerTest.groovy index 2a5b223212..d73e4f1db1 100644 --- a/src/test/groovy/graphql/schema/diffing/ana/EditOperationAnalyzerTest.groovy +++ b/src/test/groovy/graphql/schema/diffing/ana/EditOperationAnalyzerTest.groovy @@ -17,6 +17,7 @@ import static graphql.schema.diffing.ana.SchemaDifference.EnumDeletion import static graphql.schema.diffing.ana.SchemaDifference.EnumModification import static graphql.schema.diffing.ana.SchemaDifference.EnumValueAddition import static graphql.schema.diffing.ana.SchemaDifference.EnumValueDeletion +import static graphql.schema.diffing.ana.SchemaDifference.EnumValueRenamed import static graphql.schema.diffing.ana.SchemaDifference.InputObjectAddition import static graphql.schema.diffing.ana.SchemaDifference.InputObjectDeletion import static graphql.schema.diffing.ana.SchemaDifference.InputObjectFieldAddition @@ -1149,6 +1150,39 @@ class EditOperationAnalyzerTest extends Specification { enumModification.getDetails(EnumValueDeletion)[0].name == "B" } + def "enum value added and removed"() { + given: + def oldSdl = ''' + type Query { + e: MyEnum + } + enum MyEnum { + A + B + } + ''' + def newSdl = ''' + type Query { + e: MyEnum + } + enum MyEnum { + A + C + } + ''' + when: + def changes = calcDiff(oldSdl, newSdl) + then: + changes.enumDifferences["MyEnum"] instanceof EnumModification + + def enumModification = changes.enumDifferences["MyEnum"] as EnumModification + enumModification.getDetails().size() == 1 + + def rename = enumModification.getDetails(EnumValueRenamed)[0] + rename.oldName == "B" + rename.newName == "C" + } + def "scalar added"() { given: def oldSdl = '''