Skip to content

Commit ca82c30

Browse files
committed
Apply "UniqueDirectivesPerLocation" to SDL
1 parent ce1d49d commit ca82c30

File tree

3 files changed

+53
-2
lines changed

3 files changed

+53
-2
lines changed

src/validation/__tests__/UniqueDirectivesPerLocation-test.js

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,22 @@
66
*/
77

88
import { describe, it } from 'mocha';
9-
import { expectPassesRule, expectFailsRule } from './harness';
9+
import {
10+
expectPassesRule,
11+
expectFailsRule,
12+
expectSDLErrorsFromRule,
13+
} from './harness';
14+
1015
import {
1116
UniqueDirectivesPerLocation,
1217
duplicateDirectiveMessage,
1318
} from '../rules/UniqueDirectivesPerLocation';
1419

20+
const expectSDLErrors = expectSDLErrorsFromRule.bind(
21+
undefined,
22+
UniqueDirectivesPerLocation,
23+
);
24+
1525
function duplicateDirective(directiveName, l1, c1, l2, c2) {
1626
return {
1727
message: duplicateDirectiveMessage(directiveName),
@@ -132,4 +142,39 @@ describe('Validate: Directives Are Unique Per Location', () => {
132142
],
133143
);
134144
});
145+
146+
it('duplicate directives on SDL definitions', () => {
147+
expectSDLErrors(`
148+
schema @directive @directive { query: Dummy }
149+
extend schema @directive @directive
150+
151+
scalar TestScalar @directive @directive
152+
extend scalar TestScalar @directive @directive
153+
154+
type TestObject @directive @directive
155+
extend type TestObject @directive @directive
156+
157+
interface TestInterface @directive @directive
158+
extend interface TestInterface @directive @directive
159+
160+
union TestUnion @directive @directive
161+
extend union TestUnion @directive @directive
162+
163+
input TestInput @directive @directive
164+
extend input TestInput @directive @directive
165+
`).to.deep.equal([
166+
duplicateDirective('directive', 2, 14, 2, 25),
167+
duplicateDirective('directive', 3, 21, 3, 32),
168+
duplicateDirective('directive', 5, 25, 5, 36),
169+
duplicateDirective('directive', 6, 32, 6, 43),
170+
duplicateDirective('directive', 8, 23, 8, 34),
171+
duplicateDirective('directive', 9, 30, 9, 41),
172+
duplicateDirective('directive', 11, 31, 11, 42),
173+
duplicateDirective('directive', 12, 38, 12, 49),
174+
duplicateDirective('directive', 14, 23, 14, 34),
175+
duplicateDirective('directive', 15, 30, 15, 41),
176+
duplicateDirective('directive', 17, 23, 17, 34),
177+
duplicateDirective('directive', 18, 30, 18, 41),
178+
]);
179+
});
135180
});

src/validation/__tests__/harness.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
import { expect } from 'chai';
99
import { parse } from '../../language';
10-
import { validate } from '../validate';
10+
import { validate, validateSDL } from '../validate';
1111
import {
1212
GraphQLSchema,
1313
GraphQLObjectType,
@@ -448,3 +448,8 @@ export function expectPassesRuleWithSchema(schema, rule, queryString) {
448448
export function expectFailsRuleWithSchema(schema, rule, queryString, errors) {
449449
return expectInvalid(schema, rule, queryString, errors);
450450
}
451+
452+
export function expectSDLErrorsFromRule(rule, sdlString, schema) {
453+
const errors = validateSDL(parse(sdlString), schema, [rule]);
454+
return expect(errors);
455+
}

src/validation/specifiedRules.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,4 +127,5 @@ import { LoneSchemaDefinition } from './rules/LoneSchemaDefinition';
127127
// @internal
128128
export const specifiedSDLRules: $ReadOnlyArray<SDLValidationRule> = [
129129
LoneSchemaDefinition,
130+
UniqueDirectivesPerLocation,
130131
];

0 commit comments

Comments
 (0)