@@ -1221,7 +1221,7 @@ describe('Execute: Handles basic execution tasks', () => {
1221
1221
expect ( possibleTypes ) . to . deep . equal ( [ fooObject ] ) ;
1222
1222
} ) ;
1223
1223
1224
- it ( 'bubbles null up to nearest nullable parent ', ( ) => {
1224
+ describe ( 'deals with ! and ? ', ( ) => {
1225
1225
const schema = new GraphQLSchema ( {
1226
1226
query : new GraphQLObjectType ( {
1227
1227
name : 'Query' ,
@@ -1245,130 +1245,173 @@ describe('Execute: Handles basic execution tasks', () => {
1245
1245
} ) ,
1246
1246
} ) ;
1247
1247
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
+ }
1253
1255
}
1254
- }
1255
- ` ) ;
1256
- const plainResult = executeSync ( { schema, document : plainDocument } ) ;
1256
+ ` ) ;
1257
+ const plainResult = executeSync ( { schema, document : plainDocument } ) ;
1257
1258
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
+ } ) ;
1260
1262
} ) ;
1261
1263
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
+ }
1267
1271
}
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
+ } ) ;
1284
1288
} ) ;
1285
1289
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
+ }
1291
1297
}
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
+ }
1314
1322
}
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
+ }
1330
1340
}
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
+ } ) ;
1336
1357
} ) ;
1337
1358
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
+ } ) ;
1347
1384
} ) ;
1348
1385
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 {
1353
1390
name!
1391
+ calories!
1354
1392
}
1355
- }
1356
- }
1357
- ` ) ;
1358
- const nonNullInFragmentResult = executeSync ( {
1359
- schema,
1360
- document : nonNullInFragmentDocument ,
1361
- } ) ;
1362
1393
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
+ } ) ;
1372
1415
} ) ;
1373
1416
} ) ;
1374
1417
} ) ;
0 commit comments