1717class FindBreakingChangesTest extends \PHPUnit_Framework_TestCase
1818{
1919
20+ private $ queryType ;
21+
2022 public function setUp ()
2123 {
2224 $ this ->queryType = new ObjectType ([
@@ -1017,4 +1019,213 @@ public function testDetectsRemovalOfInterfaces()
10171019 ],
10181020 FindBreakingChanges::findInterfacesRemovedFromObjectTypes ($ oldSchema , $ newSchema )[0 ]);
10191021 }
1022+
1023+ public function testDetectsAllBreakingChanges ()
1024+ {
1025+ $ typeThatGetsRemoved = new ObjectType ([
1026+ 'name ' => 'TypeThatGetsRemoved ' ,
1027+ 'fields ' => [
1028+ 'field1 ' => Type::string ()
1029+ ]
1030+ ]);
1031+
1032+ $ argThatChanges = new ObjectType ([
1033+ 'name ' => 'ArgThatChanges ' ,
1034+ 'fields ' => [
1035+ 'field1 ' => [
1036+ 'type ' => Type::string (),
1037+ 'args ' => [
1038+ 'id ' => Type::int ()
1039+ ]
1040+ ]
1041+ ]
1042+ ]);
1043+
1044+ $ argChanged = new ObjectType ([
1045+ 'name ' => 'ArgThatChanges ' ,
1046+ 'fields ' => [
1047+ 'field1 ' => [
1048+ 'type ' => Type::string (),
1049+ 'args ' => [
1050+ 'id ' => Type::string ()
1051+ ]
1052+ ]
1053+ ]
1054+ ]);
1055+
1056+ $ typeThatChangesTypeOld = new ObjectType ([
1057+ 'name ' => 'TypeThatChangesType ' ,
1058+ 'fields ' => [
1059+ 'field1 ' => Type::string ()
1060+ ]
1061+ ]);
1062+
1063+ $ typeThatChangesTypeNew = new InterfaceType ([
1064+ 'name ' => 'TypeThatChangesType ' ,
1065+ 'fields ' => [
1066+ 'field1 ' => Type::string ()
1067+ ]
1068+ ]);
1069+
1070+ $ typeThatHasBreakingFieldChangesOld = new InterfaceType ([
1071+ 'name ' => 'TypeThatHasBreakingFieldChanges ' ,
1072+ 'fields ' => [
1073+ 'field1 ' => Type::string (),
1074+ 'field2 ' => Type::string ()
1075+ ]
1076+ ]);
1077+
1078+ $ typeThatHasBreakingFieldChangesNew = new InterfaceType ([
1079+ 'name ' => 'TypeThatHasBreakingFieldChanges ' ,
1080+ 'fields ' => [
1081+ 'field2 ' => Type::boolean ()
1082+ ]
1083+ ]);
1084+
1085+ $ typeInUnion1 = new ObjectType ([
1086+ 'name ' => 'TypeInUnion1 ' ,
1087+ 'fields ' => [
1088+ 'field1 ' => Type::string ()
1089+ ]
1090+ ]);
1091+
1092+ $ typeInUnion2 = new ObjectType ([
1093+ 'name ' => 'TypeInUnion2 ' ,
1094+ 'fields ' => [
1095+ 'field1 ' => Type::string ()
1096+ ]
1097+ ]);
1098+
1099+ $ unionTypeThatLosesATypeOld = new UnionType ([
1100+ 'name ' => 'UnionTypeThatLosesAType ' ,
1101+ 'types ' => [$ typeInUnion1 , $ typeInUnion2 ],
1102+ 'resolveType ' => function () {
1103+ }
1104+ ]);
1105+
1106+ $ unionTypeThatLosesATypeNew = new UnionType ([
1107+ 'name ' => 'UnionTypeThatLosesAType ' ,
1108+ 'types ' => [$ typeInUnion1 ],
1109+ 'resolveType ' => function () {
1110+ }
1111+ ]);
1112+
1113+ $ enumTypeThatLosesAValueOld = new EnumType ([
1114+ 'name ' => 'EnumTypeThatLosesAValue ' ,
1115+ 'values ' => [
1116+ 'VALUE0 ' => 0 ,
1117+ 'VALUE1 ' => 1 ,
1118+ 'VALUE2 ' => 2
1119+ ]
1120+ ]);
1121+
1122+ $ enumTypeThatLosesAValueNew = new EnumType ([
1123+ 'name ' => 'EnumTypeThatLosesAValue ' ,
1124+ 'values ' => [
1125+ 'VALUE1 ' => 1 ,
1126+ 'VALUE2 ' => 2
1127+ ]
1128+ ]);
1129+
1130+ $ interface1 = new InterfaceType ([
1131+ 'name ' => 'Interface1 ' ,
1132+ 'fields ' => [
1133+ 'field1 ' => Type::string ()
1134+ ],
1135+ 'resolveType ' => function () {
1136+ }
1137+ ]);
1138+
1139+ $ typeThatLosesInterfaceOld = new ObjectType ([
1140+ 'name ' => 'TypeThatLosesInterface1 ' ,
1141+ 'interfaces ' => [$ interface1 ],
1142+ 'fields ' => [
1143+ 'field1 ' => Type::string ()
1144+ ]
1145+ ]);
1146+
1147+ $ typeThatLosesInterfaceNew = new ObjectType ([
1148+ 'name ' => 'TypeThatLosesInterface1 ' ,
1149+ 'fields ' => [
1150+ 'field1 ' => Type::string ()
1151+ ]
1152+ ]);
1153+
1154+ $ oldSchema = new Schema ([
1155+ 'query ' => $ this ->queryType ,
1156+ 'types ' =>
1157+ [
1158+ 'TypeThatGetsRemoved ' => $ typeThatGetsRemoved ,
1159+ 'TypeThatChangesType ' => $ typeThatChangesTypeOld ,
1160+ 'TypeThatHasBreakingFieldChanges ' => $ typeThatHasBreakingFieldChangesOld ,
1161+ 'UnionTypeThatLosesAType ' => $ unionTypeThatLosesATypeOld ,
1162+ 'EnumTypeThatLosesAValue ' => $ enumTypeThatLosesAValueOld ,
1163+ 'ArgThatChanges ' => $ argThatChanges ,
1164+ 'TypeThatLosesInterface ' => $ typeThatLosesInterfaceOld
1165+ ]
1166+ ]);
1167+
1168+ $ newSchema = new Schema ([
1169+ 'query ' => $ this ->queryType ,
1170+ 'types ' =>
1171+ [
1172+ 'TypeThatChangesType ' => $ typeThatChangesTypeNew ,
1173+ 'TypeThatHasBreakingFieldChanges ' => $ typeThatHasBreakingFieldChangesNew ,
1174+ 'UnionTypeThatLosesAType ' => $ unionTypeThatLosesATypeNew ,
1175+ 'EnumTypeThatLosesAValue ' => $ enumTypeThatLosesAValueNew ,
1176+ 'ArgThatChanges ' => $ argChanged ,
1177+ 'TypeThatLosesInterface ' => $ typeThatLosesInterfaceNew ,
1178+ 'Interface1 ' => $ interface1
1179+ ]
1180+ ]);
1181+
1182+ $ expectedBreakingChanges = [
1183+ [
1184+ 'type ' => FindBreakingChanges::BREAKING_CHANGE_TYPE_REMOVED ,
1185+ 'description ' => 'TypeThatGetsRemoved was removed. ' ,
1186+ ],
1187+ [
1188+ 'type ' => FindBreakingChanges::BREAKING_CHANGE_TYPE_REMOVED ,
1189+ 'description ' => 'TypeInUnion2 was removed. ' ,
1190+ ],
1191+ /*
1192+ // NB the below assertion is included in the graphql-js tests, but it makes no sense.
1193+ // Seriously, look for what `int` type was supposed to be removed between the two schemas. There is none.
1194+ // I honestly think it's a bug in the js implementation and was put into the test just to make it pass.
1195+ [
1196+ 'type' => FindBreakingChanges::BREAKING_CHANGE_TYPE_REMOVED,
1197+ 'description' => 'Int was removed.'
1198+ ],*/
1199+ [
1200+ 'type ' => FindBreakingChanges::BREAKING_CHANGE_TYPE_CHANGED ,
1201+ 'description ' => 'TypeThatChangesType changed from an Object type to an Interface type. ' ,
1202+ ],
1203+ [
1204+ 'type ' => FindBreakingChanges::BREAKING_CHANGE_FIELD_REMOVED ,
1205+ 'description ' => 'TypeThatHasBreakingFieldChanges->field1 was removed. ' ,
1206+ ],
1207+ [
1208+ 'type ' => FindBreakingChanges::BREAKING_CHANGE_FIELD_CHANGED ,
1209+ 'description ' => 'TypeThatHasBreakingFieldChanges->field2 changed type from String to Boolean. ' ,
1210+ ],
1211+ [
1212+ 'type ' => FindBreakingChanges::BREAKING_CHANGE_TYPE_REMOVED_FROM_UNION ,
1213+ 'description ' => 'TypeInUnion2 was removed from union type UnionTypeThatLosesAType. ' ,
1214+ ],
1215+ [
1216+ 'type ' => FindBreakingChanges::BREAKING_CHANGE_VALUE_REMOVED_FROM_ENUM ,
1217+ 'description ' => 'VALUE0 was removed from enum type EnumTypeThatLosesAValue. ' ,
1218+ ],
1219+ [
1220+ 'type ' => FindBreakingChanges::BREAKING_CHANGE_ARG_CHANGED ,
1221+ 'description ' => 'ArgThatChanges->field1 arg id has changed type from Int to String. ' ,
1222+ ],
1223+ [
1224+ 'type ' => FindBreakingChanges::BREAKING_CHANGE_INTERFACE_REMOVED_FROM_OBJECT ,
1225+ 'description ' => 'TypeThatLosesInterface1 no longer implements interface Interface1. ' ,
1226+ ]
1227+ ];
1228+
1229+ $ this ->assertEquals ($ expectedBreakingChanges , FindBreakingChanges::findBreakingChanges ($ oldSchema , $ newSchema ));
1230+ }
10201231}
0 commit comments