Skip to content

Commit

Permalink
Cover empty field-selections
Browse files Browse the repository at this point in the history
  • Loading branch information
JoviDeCroock committed Oct 13, 2024
1 parent 0ea9241 commit 9a204e3
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 1 deletion.
38 changes: 37 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.js';

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

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

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

function expectErrors(queryStr: string) {
return expectValidationErrors(ScalarLeafsRule, queryStr);
Expand Down Expand Up @@ -35,6 +42,35 @@ 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: [] },
},
],
},
},
],
};
const errors = validate(testSchema, doc, [ScalarLeafsRule]);
expectJSON(errors).toDeepEqual([
{
message:
'Field "human" of type "Human" must have at least one field selected.',
},
]);
});

it('interface type missing selection', () => {
expectErrors(`
{
Expand Down
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 9a204e3

Please sign in to comment.