From db2a3de7517c4e3ca63da0b76009d040a39b760a Mon Sep 17 00:00:00 2001 From: Ed J Date: Sun, 24 Dec 2017 22:58:26 +0000 Subject: [PATCH 1/2] DRY with lists tests --- src/execution/__tests__/lists-test.js | 461 +++++--------------------- 1 file changed, 74 insertions(+), 387 deletions(-) diff --git a/src/execution/__tests__/lists-test.js b/src/execution/__tests__/lists-test.js index 05e077bf0f..d2fd51769c 100644 --- a/src/execution/__tests__/lists-test.js +++ b/src/execution/__tests__/lists-test.js @@ -114,441 +114,128 @@ describe('Execute: Accepts any iterable as list value', () => { }); describe('Execute: Handles list nullability', () => { - describe('[T]', () => { - const type = GraphQLList(GraphQLInt); - + function allChecks(type, expected) { describe('Array', () => { - it( - 'Contains values', - check(type, [1, 2], { data: { nest: { test: [1, 2] } } }), - ); - - it( - 'Contains null', - check(type, [1, null, 2], { data: { nest: { test: [1, null, 2] } } }), - ); - - it('Returns null', check(type, null, { data: { nest: { test: null } } })); + it('Contains values', check(type, [1, 2], expected.containsValues)); + it('Contains null', check(type, [1, null, 2], expected.containsNull)); + it('Returns null', check(type, null, expected.returnsNull)); }); describe('Promise>', () => { it( 'Contains values', - check(type, resolved([1, 2]), { data: { nest: { test: [1, 2] } } }), + check(type, resolved([1, 2]), expected.containsValues), ); it( 'Contains null', - check(type, resolved([1, null, 2]), { - data: { nest: { test: [1, null, 2] } }, - }), + check(type, resolved([1, null, 2]), expected.containsNull), ); - it( - 'Returns null', - check(type, resolved(null), { data: { nest: { test: null } } }), - ); + it('Returns null', check(type, resolved(null), expected.returnsNull)); it( 'Rejected', - check(type, () => rejected(new Error('bad')), { - data: { nest: { test: null } }, - errors: [ - { - message: 'bad', - locations: [{ line: 1, column: 10 }], - path: ['nest', 'test'], - }, - ], - }), + check(type, () => rejected(new Error('bad')), expected.rejected), ); }); describe('Array>', () => { it( 'Contains values', - check(type, [resolved(1), resolved(2)], { - data: { nest: { test: [1, 2] } }, - }), + check(type, [resolved(1), resolved(2)], expected.containsValues), ); it( 'Contains null', - check(type, [resolved(1), resolved(null), resolved(2)], { - data: { nest: { test: [1, null, 2] } }, - }), - ); - - it( - 'Contains reject', check( type, - () => [resolved(1), rejected(new Error('bad')), resolved(2)], - { - data: { nest: { test: [1, null, 2] } }, - errors: [ - { - message: 'bad', - locations: [{ line: 1, column: 10 }], - path: ['nest', 'test', 1], - }, - ], - }, + [resolved(1), resolved(null), resolved(2)], + expected.containsNull, ), ); - }); - }); - - describe('[T]!', () => { - const type = GraphQLNonNull(GraphQLList(GraphQLInt)); - - describe('Array', () => { - it( - 'Contains values', - check(type, [1, 2], { data: { nest: { test: [1, 2] } } }), - ); - - it( - 'Contains null', - check(type, [1, null, 2], { data: { nest: { test: [1, null, 2] } } }), - ); - - it( - 'Returns null', - check(type, null, { - data: { nest: null }, - errors: [ - { - message: - 'Cannot return null for non-nullable field DataType.test.', - locations: [{ line: 1, column: 10 }], - path: ['nest', 'test'], - }, - ], - }), - ); - }); - - describe('Promise>', () => { - it( - 'Contains values', - check(type, resolved([1, 2]), { data: { nest: { test: [1, 2] } } }), - ); - - it( - 'Contains null', - check(type, resolved([1, null, 2]), { - data: { nest: { test: [1, null, 2] } }, - }), - ); - - it( - 'Returns null', - check(type, resolved(null), { - data: { nest: null }, - errors: [ - { - message: - 'Cannot return null for non-nullable field DataType.test.', - locations: [{ line: 1, column: 10 }], - path: ['nest', 'test'], - }, - ], - }), - ); - - it( - 'Rejected', - check(type, () => rejected(new Error('bad')), { - data: { nest: null }, - errors: [ - { - message: 'bad', - locations: [{ line: 1, column: 10 }], - path: ['nest', 'test'], - }, - ], - }), - ); - }); - - describe('Array>', () => { - it( - 'Contains values', - check(type, [resolved(1), resolved(2)], { - data: { nest: { test: [1, 2] } }, - }), - ); - - it( - 'Contains null', - check(type, [resolved(1), resolved(null), resolved(2)], { - data: { nest: { test: [1, null, 2] } }, - }), - ); it( 'Contains reject', check( type, () => [resolved(1), rejected(new Error('bad')), resolved(2)], - { - data: { nest: { test: [1, null, 2] } }, - errors: [ - { - message: 'bad', - locations: [{ line: 1, column: 10 }], - path: ['nest', 'test', 1], - }, - ], - }, + expected.containsReject, ), ); }); - }); - - describe('[T!]', () => { - const type = GraphQLList(GraphQLNonNull(GraphQLInt)); + } - describe('Array', () => { - it( - 'Contains values', - check(type, [1, 2], { data: { nest: { test: [1, 2] } } }), - ); + const dataOk = { nest: { test: [1, 2] } }; + const dataOkWithNull = { nest: { test: [1, null, 2] } }; + const dataNull = { nest: null }; + const dataNull1 = { nest: { test: null } }; + const errorsBad = [ + { + message: 'bad', + locations: [{ line: 1, column: 10 }], + path: ['nest', 'test'], + }, + ]; + const errorsBad1 = [ + { + message: 'bad', + locations: [{ line: 1, column: 10 }], + path: ['nest', 'test', 1], + }, + ]; + const errorsNonNull = [ + { + message: 'Cannot return null for non-nullable field DataType.test.', + locations: [{ line: 1, column: 10 }], + path: ['nest', 'test'], + }, + ]; + const errorsNonNull1 = [ + { + message: 'Cannot return null for non-nullable field DataType.test.', + locations: [{ line: 1, column: 10 }], + path: ['nest', 'test', 1], + }, + ]; - it( - 'Contains null', - check(type, [1, null, 2], { - data: { nest: { test: null } }, - errors: [ - { - message: - 'Cannot return null for non-nullable field DataType.test.', - locations: [{ line: 1, column: 10 }], - path: ['nest', 'test', 1], - }, - ], - }), - ); - - it('Returns null', check(type, null, { data: { nest: { test: null } } })); + describe('[T]', () => { + allChecks(GraphQLList(GraphQLInt), { + containsValues: { data: dataOk }, + containsNull: { data: dataOkWithNull }, + returnsNull: { data: dataNull1 }, + rejected: { data: dataNull1, errors: errorsBad }, + containsReject: { data: dataOkWithNull, errors: errorsBad1 }, }); + }); - describe('Promise>', () => { - it( - 'Contains values', - check(type, resolved([1, 2]), { data: { nest: { test: [1, 2] } } }), - ); - - it( - 'Contains null', - check(type, resolved([1, null, 2]), { - data: { nest: { test: null } }, - errors: [ - { - message: - 'Cannot return null for non-nullable field DataType.test.', - locations: [{ line: 1, column: 10 }], - path: ['nest', 'test', 1], - }, - ], - }), - ); - - it( - 'Returns null', - check(type, resolved(null), { data: { nest: { test: null } } }), - ); - - it( - 'Rejected', - check(type, () => rejected(new Error('bad')), { - data: { nest: { test: null } }, - errors: [ - { - message: 'bad', - locations: [{ line: 1, column: 10 }], - path: ['nest', 'test'], - }, - ], - }), - ); + describe('[T]!', () => { + allChecks(GraphQLNonNull(GraphQLList(GraphQLInt)), { + containsValues: { data: dataOk }, + containsNull: { data: dataOkWithNull }, + returnsNull: { data: dataNull, errors: errorsNonNull }, + rejected: { data: dataNull, errors: errorsBad }, + containsReject: { data: dataOkWithNull, errors: errorsBad1 }, }); + }); - describe('Array>', () => { - it( - 'Contains values', - check(type, [resolved(1), resolved(2)], { - data: { nest: { test: [1, 2] } }, - }), - ); - - it( - 'Contains null', - check(type, [resolved(1), resolved(null), resolved(2)], { - data: { nest: { test: null } }, - errors: [ - { - message: - 'Cannot return null for non-nullable field DataType.test.', - locations: [{ line: 1, column: 10 }], - path: ['nest', 'test', 1], - }, - ], - }), - ); - - it( - 'Contains reject', - check( - type, - () => [resolved(1), rejected(new Error('bad')), resolved(2)], - { - data: { nest: { test: null } }, - errors: [ - { - message: 'bad', - locations: [{ line: 1, column: 10 }], - path: ['nest', 'test', 1], - }, - ], - }, - ), - ); + describe('[T!]', () => { + allChecks(GraphQLList(GraphQLNonNull(GraphQLInt)), { + containsValues: { data: dataOk }, + containsNull: { data: dataNull1, errors: errorsNonNull1 }, + returnsNull: { data: dataNull1 }, + rejected: { data: dataNull1, errors: errorsBad }, + containsReject: { data: dataNull1, errors: errorsBad1 }, }); }); describe('[T!]!', () => { - const type = GraphQLNonNull(GraphQLList(GraphQLNonNull(GraphQLInt))); - - describe('Array', () => { - it( - 'Contains values', - check(type, [1, 2], { data: { nest: { test: [1, 2] } } }), - ); - - it( - 'Contains null', - check(type, [1, null, 2], { - data: { nest: null }, - errors: [ - { - message: - 'Cannot return null for non-nullable field DataType.test.', - locations: [{ line: 1, column: 10 }], - path: ['nest', 'test', 1], - }, - ], - }), - ); - - it( - 'Returns null', - check(type, null, { - data: { nest: null }, - errors: [ - { - message: - 'Cannot return null for non-nullable field DataType.test.', - locations: [{ line: 1, column: 10 }], - path: ['nest', 'test'], - }, - ], - }), - ); - }); - - describe('Promise>', () => { - it( - 'Contains values', - check(type, resolved([1, 2]), { data: { nest: { test: [1, 2] } } }), - ); - - it( - 'Contains null', - check(type, resolved([1, null, 2]), { - data: { nest: null }, - errors: [ - { - message: - 'Cannot return null for non-nullable field DataType.test.', - locations: [{ line: 1, column: 10 }], - path: ['nest', 'test', 1], - }, - ], - }), - ); - - it( - 'Returns null', - check(type, resolved(null), { - data: { nest: null }, - errors: [ - { - message: - 'Cannot return null for non-nullable field DataType.test.', - locations: [{ line: 1, column: 10 }], - path: ['nest', 'test'], - }, - ], - }), - ); - - it( - 'Rejected', - check(type, () => rejected(new Error('bad')), { - data: { nest: null }, - errors: [ - { - message: 'bad', - locations: [{ line: 1, column: 10 }], - path: ['nest', 'test'], - }, - ], - }), - ); - }); - - describe('Array>', () => { - it( - 'Contains values', - check(type, [resolved(1), resolved(2)], { - data: { nest: { test: [1, 2] } }, - }), - ); - - it( - 'Contains null', - check(type, [resolved(1), resolved(null), resolved(2)], { - data: { nest: null }, - errors: [ - { - message: - 'Cannot return null for non-nullable field DataType.test.', - locations: [{ line: 1, column: 10 }], - path: ['nest', 'test', 1], - }, - ], - }), - ); - - it( - 'Contains reject', - check( - type, - () => [resolved(1), rejected(new Error('bad')), resolved(2)], - { - data: { nest: null }, - errors: [ - { - message: 'bad', - locations: [{ line: 1, column: 10 }], - path: ['nest', 'test', 1], - }, - ], - }, - ), - ); + allChecks(GraphQLNonNull(GraphQLList(GraphQLNonNull(GraphQLInt))), { + containsValues: { data: dataOk }, + containsNull: { data: dataNull, errors: errorsNonNull1 }, + returnsNull: { data: dataNull, errors: errorsNonNull }, + rejected: { data: dataNull, errors: errorsBad }, + containsReject: { data: dataNull, errors: errorsBad1 }, }); }); }); From 4e7d9f87e1883eae93db95e2d0e467a90d83da2f Mon Sep 17 00:00:00 2001 From: Ed J Date: Sat, 17 Feb 2018 05:30:33 +0000 Subject: [PATCH 2/2] legibility tweaks --- src/execution/__tests__/lists-test.js | 42 ++++++++++++++++++--------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/src/execution/__tests__/lists-test.js b/src/execution/__tests__/lists-test.js index d2fd51769c..a987f4bc74 100644 --- a/src/execution/__tests__/lists-test.js +++ b/src/execution/__tests__/lists-test.js @@ -169,15 +169,19 @@ describe('Execute: Handles list nullability', () => { const dataOk = { nest: { test: [1, 2] } }; const dataOkWithNull = { nest: { test: [1, null, 2] } }; const dataNull = { nest: null }; - const dataNull1 = { nest: { test: null } }; - const errorsBad = [ + const dataNullDeep = { nest: { test: null } }; + /* + In these errors, the variable name including "1" means the error + relates to the 1-th (i.e. second) item in the return value. + */ + const errorsReject = [ { message: 'bad', locations: [{ line: 1, column: 10 }], path: ['nest', 'test'], }, ]; - const errorsBad1 = [ + const errorsReject1 = [ { message: 'bad', locations: [{ line: 1, column: 10 }], @@ -199,13 +203,23 @@ describe('Execute: Handles list nullability', () => { }, ]; + /* + The first arg to allChecks is a type. + The second arg is an object which describes the "expected" return + values when a field with that type's resolver behaves as follows: + containsValues: returns [1, 2] + containsNull: returns [1, null, 2] + returnsNull: returns null + rejected: is a rejecting promise + containsReject: returns an array that includes a rejecting promise + */ describe('[T]', () => { allChecks(GraphQLList(GraphQLInt), { containsValues: { data: dataOk }, containsNull: { data: dataOkWithNull }, - returnsNull: { data: dataNull1 }, - rejected: { data: dataNull1, errors: errorsBad }, - containsReject: { data: dataOkWithNull, errors: errorsBad1 }, + returnsNull: { data: dataNullDeep }, + rejected: { data: dataNullDeep, errors: errorsReject }, + containsReject: { data: dataOkWithNull, errors: errorsReject1 }, }); }); @@ -214,18 +228,18 @@ describe('Execute: Handles list nullability', () => { containsValues: { data: dataOk }, containsNull: { data: dataOkWithNull }, returnsNull: { data: dataNull, errors: errorsNonNull }, - rejected: { data: dataNull, errors: errorsBad }, - containsReject: { data: dataOkWithNull, errors: errorsBad1 }, + rejected: { data: dataNull, errors: errorsReject }, + containsReject: { data: dataOkWithNull, errors: errorsReject1 }, }); }); describe('[T!]', () => { allChecks(GraphQLList(GraphQLNonNull(GraphQLInt)), { containsValues: { data: dataOk }, - containsNull: { data: dataNull1, errors: errorsNonNull1 }, - returnsNull: { data: dataNull1 }, - rejected: { data: dataNull1, errors: errorsBad }, - containsReject: { data: dataNull1, errors: errorsBad1 }, + containsNull: { data: dataNullDeep, errors: errorsNonNull1 }, + returnsNull: { data: dataNullDeep }, + rejected: { data: dataNullDeep, errors: errorsReject }, + containsReject: { data: dataNullDeep, errors: errorsReject1 }, }); }); @@ -234,8 +248,8 @@ describe('Execute: Handles list nullability', () => { containsValues: { data: dataOk }, containsNull: { data: dataNull, errors: errorsNonNull1 }, returnsNull: { data: dataNull, errors: errorsNonNull }, - rejected: { data: dataNull, errors: errorsBad }, - containsReject: { data: dataNull, errors: errorsBad1 }, + rejected: { data: dataNull, errors: errorsReject }, + containsReject: { data: dataNull, errors: errorsReject1 }, }); }); });