Skip to content

Commit

Permalink
Address empty selection-set
Browse files Browse the repository at this point in the history
  • Loading branch information
JoviDeCroock committed Nov 8, 2024
1 parent 423e72d commit fbf8a54
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 1 deletion.
42 changes: 41 additions & 1 deletion src/validation/__tests__/ScalarLeafsRule-test.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,15 @@
import { describe, it } from 'mocha';

import { expectJSON } from '../../__testUtils__/expectJSON';

import type { DocumentNode } from '../../language/ast';
import { OperationTypeNode } from '../../language/ast';
import { Kind } from '../../language/kinds';

import { ScalarLeafsRule } from '../rules/ScalarLeafsRule';
import { validate } from '../validate';

import { expectValidationErrors } from './harness';
import { expectValidationErrors, testSchema } from './harness';

function expectErrors(queryStr: string) {
return expectValidationErrors(ScalarLeafsRule, queryStr);
Expand Down Expand Up @@ -126,4 +133,37 @@ describe('Validate: Scalar leafs', () => {
},
]);
});

it('object type having only one selection', () => {
const doc: DocumentNode = {
kind: Kind.DOCUMENT,
definitions: [
{
kind: Kind.OPERATION_DEFINITION,
operation: OperationTypeNode.QUERY,
selectionSet: {
kind: Kind.SELECTION_SET,
selections: [
{
kind: Kind.FIELD,
name: { kind: Kind.NAME, value: 'human' },
selectionSet: { kind: Kind.SELECTION_SET, selections: [] },
},
],
},
},
],
};

// We can't leverage expectErrors since it doesn't support passing in the
// documentNode directly. We have to do this because this is technically
// an invalid document.
const errors = validate(testSchema, doc, [ScalarLeafsRule]);
expectJSON(errors).toDeepEqual([
{
message:
'Field "human" of type "Human" must have at least one field selected.',
},
]);
});
});
9 changes: 9 additions & 0 deletions src/validation/rules/ScalarLeafsRule.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,15 @@ export function ScalarLeafsRule(context: ValidationContext): ASTVisitor {
{ nodes: node },
),
);
} else if (selectionSet.selections.length === 0) {
const fieldName = node.name.value;
const typeStr = inspect(type);
context.reportError(
new GraphQLError(
`Field "${fieldName}" of type "${typeStr}" must have at least one field selected.`,
{ nodes: node },
),
);
}
}
},
Expand Down

0 comments on commit fbf8a54

Please sign in to comment.