@@ -1221,7 +1221,7 @@ describe('Execute: Handles basic execution tasks', () => {
12211221 expect ( possibleTypes ) . to . deep . equal ( [ fooObject ] ) ;
12221222 } ) ;
12231223
1224- it ( 'bubbles null up to nearest nullable parent ', ( ) => {
1224+ describe ( 'deals with ! and ? ', ( ) => {
12251225 const schema = new GraphQLSchema ( {
12261226 query : new GraphQLObjectType ( {
12271227 name : 'Query' ,
@@ -1245,130 +1245,173 @@ describe('Execute: Handles basic execution tasks', () => {
12451245 } ) ,
12461246 } ) ;
12471247
1248- const plainDocument = parse ( `
1249- query {
1250- food {
1251- name
1252- calories
1248+ it ( 'smoketest' , ( ) => {
1249+ const plainDocument = parse ( `
1250+ query {
1251+ food {
1252+ name
1253+ calories
1254+ }
12531255 }
1254- }
1255- ` ) ;
1256- const plainResult = executeSync ( { schema, document : plainDocument } ) ;
1256+ ` ) ;
1257+ const plainResult = executeSync ( { schema, document : plainDocument } ) ;
12571258
1258- expect ( plainResult ) . to . deep . equal ( {
1259- data : { food : { name : null , calories : 10 } } ,
1259+ expect ( plainResult ) . to . deep . equal ( {
1260+ data : { food : { name : null , calories : 10 } } ,
1261+ } ) ;
12601262 } ) ;
12611263
1262- const singleNonNullOnNullValueDocument = parse ( `
1263- query {
1264- food {
1265- name!
1266- calories
1264+ it ( 'null bubbles up when field that returns null is required' , ( ) => {
1265+ const singleNonNullOnNullValueDocument = parse ( `
1266+ query {
1267+ food {
1268+ name!
1269+ calories
1270+ }
12671271 }
1268- }
1269- ` ) ;
1270- const singleNonNullOnNullValueResult = executeSync ( {
1271- schema ,
1272- document : singleNonNullOnNullValueDocument ,
1273- } ) ;
1274-
1275- expect ( singleNonNullOnNullValueResult ) . to . deep . equal ( {
1276- data : { food : null } ,
1277- errors : [
1278- {
1279- locations : [ { column : 11 , line : 4 } ] ,
1280- message : 'Cannot return null for non-nullable field Food. name.' ,
1281- path : [ 'food' , 'name' ] ,
1282- } ,
1283- ] ,
1272+ ` ) ;
1273+ const singleNonNullOnNullValueResult = executeSync ( {
1274+ schema ,
1275+ document : singleNonNullOnNullValueDocument ,
1276+ } ) ;
1277+
1278+ expect ( singleNonNullOnNullValueResult ) . to . deep . equal ( {
1279+ data : { food : null } ,
1280+ errors : [
1281+ {
1282+ locations : [ { column : 13 , line : 4 } ] ,
1283+ message : 'Cannot return null for non-nullable field Food.name.' ,
1284+ path : [ 'food' , ' name' ] ,
1285+ } ,
1286+ ] ,
1287+ } ) ;
12841288 } ) ;
12851289
1286- const bothNonNullOnNullValueDocument = parse ( `
1287- query {
1288- food {
1289- name!
1290- calories!
1290+ it ( 'null bubbles up when field that returns null and field that does not are both required' , ( ) => {
1291+ const bothNonNullOnNullValueDocument = parse ( `
1292+ query {
1293+ food {
1294+ name!
1295+ calories!
1296+ }
12911297 }
1292- }
1293- ` ) ;
1294- const bothNonNullOnNullValueResult = executeSync ( {
1295- schema,
1296- document : bothNonNullOnNullValueDocument ,
1297- } ) ;
1298-
1299- expect ( bothNonNullOnNullValueResult ) . to . deep . equal ( {
1300- data : { food : null } ,
1301- errors : [
1302- {
1303- locations : [ { column : 11 , line : 4 } ] ,
1304- message : 'Cannot return null for non-nullable field Food.name.' ,
1305- path : [ 'food' , 'name' ] ,
1306- } ,
1307- ] ,
1308- } ) ;
1309-
1310- const singleNonNullOnNonNullValueDocument = parse ( `
1311- query {
1312- food {
1313- calories!
1298+ ` ) ;
1299+ const bothNonNullOnNullValueResult = executeSync ( {
1300+ schema,
1301+ document : bothNonNullOnNullValueDocument ,
1302+ } ) ;
1303+
1304+ expect ( bothNonNullOnNullValueResult ) . to . deep . equal ( {
1305+ data : { food : null } ,
1306+ errors : [
1307+ {
1308+ locations : [ { column : 13 , line : 4 } ] ,
1309+ message : 'Cannot return null for non-nullable field Food.name.' ,
1310+ path : [ 'food' , 'name' ] ,
1311+ } ,
1312+ ] ,
1313+ } ) ;
1314+ } ) ;
1315+
1316+ it ( 'null bubbles up when field that returns null is required' , ( ) => {
1317+ const singleNonNullOnNonNullValueDocument = parse ( `
1318+ query {
1319+ food {
1320+ calories!
1321+ }
13141322 }
1315- }
1316- ` ) ;
1317- const singleNonNullOnNonNullValueResult = executeSync ( {
1318- schema,
1319- document : singleNonNullOnNonNullValueDocument ,
1320- } ) ;
1321-
1322- expect ( singleNonNullOnNonNullValueResult ) . to . deep . equal ( {
1323- data : { food : { calories : 10 } } ,
1324- } ) ;
1325-
1326- const nonNullAliasOnNullValueDocument = parse ( `
1327- query {
1328- food {
1329- theNameOfTheFood: name!
1323+ ` ) ;
1324+ const singleNonNullOnNonNullValueResult = executeSync ( {
1325+ schema,
1326+ document : singleNonNullOnNonNullValueDocument ,
1327+ } ) ;
1328+
1329+ expect ( singleNonNullOnNonNullValueResult ) . to . deep . equal ( {
1330+ data : { food : { calories : 10 } } ,
1331+ } ) ;
1332+ } ) ;
1333+
1334+ it ( 'null bubbles up when field that returns null is aliased and required' , ( ) => {
1335+ const nonNullAliasOnNullValueDocument = parse ( `
1336+ query {
1337+ food {
1338+ theNameOfTheFood: name!
1339+ }
13301340 }
1331- }
1332- ` ) ;
1333- const nonNullAliasOnNullValueResult = executeSync ( {
1334- schema,
1335- document : nonNullAliasOnNullValueDocument ,
1341+ ` ) ;
1342+ const nonNullAliasOnNullValueResult = executeSync ( {
1343+ schema,
1344+ document : nonNullAliasOnNullValueDocument ,
1345+ } ) ;
1346+
1347+ expect ( nonNullAliasOnNullValueResult ) . to . deep . equal ( {
1348+ data : { food : null } ,
1349+ errors : [
1350+ {
1351+ locations : [ { column : 13 , line : 4 } ] ,
1352+ message : 'Cannot return null for non-nullable field Food.name.' ,
1353+ path : [ 'food' , 'theNameOfTheFood' ] ,
1354+ } ,
1355+ ] ,
1356+ } ) ;
13361357 } ) ;
13371358
1338- expect ( nonNullAliasOnNullValueResult ) . to . deep . equal ( {
1339- data : { food : null } ,
1340- errors : [
1341- {
1342- locations : [ { column : 11 , line : 4 } ] ,
1343- message : 'Cannot return null for non-nullable field Food.name.' ,
1344- path : [ 'food' , 'theNameOfTheFood' ] ,
1345- } ,
1346- ] ,
1359+ it ( 'null bubbles up when field that returns null is required and inside an inline fragment' , ( ) => {
1360+ const nonNullInFragmentDocument = parse ( `
1361+ query {
1362+ food {
1363+ ... on Food {
1364+ name!
1365+ }
1366+ }
1367+ }
1368+ ` ) ;
1369+ const nonNullInFragmentResult = executeSync ( {
1370+ schema,
1371+ document : nonNullInFragmentDocument ,
1372+ } ) ;
1373+
1374+ expect ( nonNullInFragmentResult ) . to . deep . equal ( {
1375+ data : { food : null } ,
1376+ errors : [
1377+ {
1378+ locations : [ { column : 15 , line : 5 } ] ,
1379+ message : 'Cannot return null for non-nullable field Food.name.' ,
1380+ path : [ 'food' , 'name' ] ,
1381+ } ,
1382+ ] ,
1383+ } ) ;
13471384 } ) ;
13481385
1349- const nonNullInFragmentDocument = parse ( `
1350- query {
1351- food {
1352- ... on Food {
1386+ it ( 'null bubbles up when field that returns null is required, but other aliased value is unaffected' , ( ) => {
1387+ const aliasedNullAndNonNull = parse ( `
1388+ query {
1389+ nonNullable: food {
13531390 name!
1391+ calories!
13541392 }
1355- }
1356- }
1357- ` ) ;
1358- const nonNullInFragmentResult = executeSync ( {
1359- schema,
1360- document : nonNullInFragmentDocument ,
1361- } ) ;
13621393
1363- expect ( nonNullInFragmentResult ) . to . deep . equal ( {
1364- data : { food : null } ,
1365- errors : [
1366- {
1367- locations : [ { column : 13 , line : 5 } ] ,
1368- message : 'Cannot return null for non-nullable field Food.name.' ,
1369- path : [ 'food' , 'name' ] ,
1370- } ,
1371- ] ,
1394+ nullable: food {
1395+ name
1396+ calories!
1397+ }
1398+ }
1399+ ` ) ;
1400+ const aliasedNullAndNonNullResult = executeSync ( {
1401+ schema,
1402+ document : aliasedNullAndNonNull ,
1403+ } ) ;
1404+
1405+ expect ( aliasedNullAndNonNullResult ) . to . deep . equal ( {
1406+ data : { nonNullable : null , nullable : { calories : 10 , name : null } } ,
1407+ errors : [
1408+ {
1409+ locations : [ { column : 13 , line : 4 } ] ,
1410+ message : 'Cannot return null for non-nullable field Food.name.' ,
1411+ path : [ 'nonNullable' , 'name' ] ,
1412+ } ,
1413+ ] ,
1414+ } ) ;
13721415 } ) ;
13731416 } ) ;
13741417} ) ;
0 commit comments