diff --git a/src/Utils/FindBreakingChanges.php b/src/Utils/FindBreakingChanges.php index 4077b1d..8f5a906 100644 --- a/src/Utils/FindBreakingChanges.php +++ b/src/Utils/FindBreakingChanges.php @@ -317,7 +317,7 @@ class FindBreakingChanges if (!$isSafe) { $oldFieldTypeString = self::isNamedType($oldFieldType) ? $oldFieldType->name : $oldFieldType; $newFieldTypeString = self::isNamedType($newfieldType) ? $newfieldType->name : $newfieldType; - $breakingFieldChanges[] = ['type' => self::BREAKING_CHANGE_FIELD_CHANGED, 'description' => "${typeName}->${fieldName} changed type from ${oldFieldTypeString} to ${newFieldTypeString}"]; + $breakingFieldChanges[] = ['type' => self::BREAKING_CHANGE_FIELD_CHANGED, 'description' => "${typeName}->${fieldName} changed type from ${oldFieldTypeString} to ${newFieldTypeString}."]; } } } diff --git a/tests/Utils/FindBreakingChangesTest.php b/tests/Utils/FindBreakingChangesTest.php index 34334c9..ac792f4 100644 --- a/tests/Utils/FindBreakingChangesTest.php +++ b/tests/Utils/FindBreakingChangesTest.php @@ -5,6 +5,7 @@ namespace GraphQL\Tests\Utils; +use GraphQL\Type\Definition\InputObjectType; use GraphQL\Type\Definition\InterfaceType; use GraphQL\Type\Definition\ObjectType; use GraphQL\Type\Definition\Type; @@ -258,4 +259,173 @@ class FindBreakingChangesTest extends \PHPUnit_Framework_TestCase $this->assertEquals($expectedFieldChanges, FindBreakingChanges::findFieldsThatChangedType($oldSchema, $newSchema)); } + + public function testShouldDetectInputFieldChanges() + { + $oldInputType = new InputObjectType([ + 'name' => 'InputType1', + 'fields' => [ + 'field1' => [ + 'type' => Type::string(), + ], + 'field2' => [ + 'type' => Type::boolean(), + ], + 'field3' => [ + 'type' => Type::listOf(Type::string()) + ], + 'field4' => [ + 'type' => Type::nonNull(Type::string()), + ], + 'field5' => [ + 'type' => Type::string(), + ], + 'field6' => [ + 'type' => Type::listOf(Type::int()) + ], + 'field7' => [ + 'type' => Type::nonNull(Type::listOf(Type::int())) + ], + 'field8' => [ + 'type' => Type::int(), + ], + 'field9' => [ + 'type' => Type::listOf(Type::int()) + ], + 'field10' => [ + 'type' => Type::listOf(Type::nonNull(Type::int())) + ], + 'field11' => [ + 'type' => Type::listOf(Type::int()) + ], + 'field12' => [ + 'type' => Type::listOf(Type::listOf(Type::int())) + ], + 'field13' => [ + 'type' => Type::nonNull(Type::int()) + ], + 'field14' => [ + 'type' => Type::listOf(Type::nonNull(Type::listOf(Type::int()))) + ], + 'field15' => [ + 'type' => Type::listOf(Type::nonNull(Type::listOf(Type::int()))) + ] + ] + ]); + + $newInputType = new InputObjectType([ + 'name' => 'InputType1', + 'fields' => [ + 'field1' => [ + 'type' => Type::int(), + ], + 'field3' => [ + 'type' => Type::string() + ], + 'field4' => [ + 'type' => Type::string() + ], + 'field5' => [ + 'type' => Type::nonNull(Type::string()) + ], + 'field6' => [ + 'type' => Type::nonNull(Type::listOf(Type::int())) + ], + 'field7' => [ + 'type' => Type::listOf(Type::int()) + ], + 'field8' => [ + 'type' => Type::nonNull(Type::listOf(Type::int())) + ], + 'field9' => [ + 'type' => Type::listOf(Type::nonNull(Type::int())) + ], + 'field10' => [ + 'type' => Type::listOf(Type::int()) + ], + 'field11' => [ + 'type' => Type::listOf(Type::listOf(Type::int())) + ], + 'field12' => [ + 'type' => Type::listOf(Type::int()) + ], + 'field13' => [ + 'type' => Type::nonNull(Type::listOf(Type::int())) + ], + 'field14' => [ + 'type' => Type::listOf(Type::listOf(Type::int())) + ], + 'field15' => [ + 'type' => Type::listOf(Type::nonNull(Type::listOf(Type::nonNull(Type::int())))) + ] + ] + ]); + + $oldSchema = new Schema([ + 'query' => new ObjectType([ + 'name' => 'root', + 'fields' => [ + 'type1' => $oldInputType + ] + ]) + ]); + + $newSchema = new Schema([ + 'query' => new ObjectType([ + 'name' => 'root', + 'fields' => [ + 'type1' => $newInputType + ] + ]) + ]); + + $expectedFieldChanges = [ + [ + 'type' => FindBreakingChanges::BREAKING_CHANGE_FIELD_CHANGED, + 'description' => 'InputType1->field1 changed type from String to Int.', + ], + [ + 'type' => FindBreakingChanges::BREAKING_CHANGE_FIELD_REMOVED, + 'description' => 'InputType1->field2 was removed.', + ], + [ + 'type' => FindBreakingChanges::BREAKING_CHANGE_FIELD_CHANGED, + 'description' => 'InputType1->field3 changed type from [String] to String.', + ], + [ + 'type' => FindBreakingChanges::BREAKING_CHANGE_FIELD_CHANGED, + 'description' => 'InputType1->field5 changed type from String to String!.', + ], + [ + 'type' => FindBreakingChanges::BREAKING_CHANGE_FIELD_CHANGED, + 'description' => 'InputType1->field6 changed type from [Int] to [Int]!.', + ], + [ + 'type' => FindBreakingChanges::BREAKING_CHANGE_FIELD_CHANGED, + 'description' => 'InputType1->field8 changed type from Int to [Int]!.', + ], + [ + 'type' => FindBreakingChanges::BREAKING_CHANGE_FIELD_CHANGED, + 'description' => 'InputType1->field9 changed type from [Int] to [Int!].', + ], + [ + 'type' => FindBreakingChanges::BREAKING_CHANGE_FIELD_CHANGED, + 'description' => 'InputType1->field11 changed type from [Int] to [[Int]].', + ], + [ + 'type' => FindBreakingChanges::BREAKING_CHANGE_FIELD_CHANGED, + 'description' => 'InputType1->field12 changed type from [[Int]] to [Int].', + ], + [ + 'type' => FindBreakingChanges::BREAKING_CHANGE_FIELD_CHANGED, + 'description' => 'InputType1->field13 changed type from Int! to [Int]!.', + ], + [ + 'type' => FindBreakingChanges::BREAKING_CHANGE_FIELD_CHANGED, + 'description' => 'InputType1->field15 changed type from [[Int]!] to [[Int!]!].', + ], + ]; + + $this->assertEquals($expectedFieldChanges, FindBreakingChanges::findFieldsThatChangedType($oldSchema, $newSchema)); + } } \ No newline at end of file