Skip to content

Commit 306c730

Browse files
committed
cleaned up execution tests
1 parent c6c196d commit 306c730

File tree

2 files changed

+243
-110
lines changed

2 files changed

+243
-110
lines changed

src/execution/__tests__/executor-test.ts

Lines changed: 151 additions & 108 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)