diff --git a/src/utilities/__tests__/buildASTSchema-test.js b/src/utilities/__tests__/buildASTSchema-test.js index ae8b0509bb..a315a08422 100644 --- a/src/utilities/__tests__/buildASTSchema-test.js +++ b/src/utilities/__tests__/buildASTSchema-test.js @@ -10,7 +10,6 @@ import { Kind } from '../../language/kinds'; import { parse } from '../../language/parser'; import { print } from '../../language/printer'; -import type { GraphQLNamedType } from '../../type/definition'; import { GraphQLSchema } from '../../type/schema'; import { validateSchema } from '../../type/validate'; import { __Schema, __EnumValue } from '../../type/introspection'; @@ -51,18 +50,17 @@ function cycleSDL(sdl: string): string { return printSchema(buildSchema(sdl)); } -function printASTNode(obj: ?{ +astNode: ?ASTNode, ... }): string { +function expectASTNode(obj: ?{ +astNode: ?ASTNode, ... }) { // istanbul ignore next (FIXME) invariant(obj?.astNode != null); - return print(obj.astNode); + return expect(print(obj.astNode)); } -function printAllASTNodes(obj: GraphQLNamedType): string { - invariant(obj.astNode != null); - return print({ - kind: Kind.DOCUMENT, - definitions: [obj.astNode, ...obj.extensionASTNodes], - }); +function expectExtensionASTNodes(obj: { + +extensionASTNodes: $ReadOnlyArray, + ... +}) { + return expect(obj.extensionASTNodes.map(print).join('\n\n')); } describe('Schema Builder', () => { @@ -714,15 +712,11 @@ describe('Schema Builder', () => { }); it('Correctly extend scalar type', () => { - const scalarSDL = dedent` + const schema = buildSchema(` scalar SomeScalar - extend scalar SomeScalar @foo - extend scalar SomeScalar @bar - `; - const schema = buildSchema(` - ${scalarSDL} + directive @foo on SCALAR directive @bar on SCALAR `); @@ -732,11 +726,16 @@ describe('Schema Builder', () => { scalar SomeScalar `); - expect(printAllASTNodes(someScalar)).to.equal(scalarSDL); + expectASTNode(someScalar).to.equal('scalar SomeScalar'); + expectExtensionASTNodes(someScalar).to.equal(dedent` + extend scalar SomeScalar @foo + + extend scalar SomeScalar @bar + `); }); it('Correctly extend object type', () => { - const objectSDL = dedent` + const schema = buildSchema(` type SomeObject implements Foo { first: String } @@ -748,9 +747,7 @@ describe('Schema Builder', () => { extend type SomeObject implements Baz { third: Float } - `; - const schema = buildSchema(` - ${objectSDL} + interface Foo interface Bar interface Baz @@ -765,11 +762,24 @@ describe('Schema Builder', () => { } `); - expect(printAllASTNodes(someObject)).to.equal(objectSDL); + expectASTNode(someObject).to.equal(dedent` + type SomeObject implements Foo { + first: String + } + `); + expectExtensionASTNodes(someObject).to.equal(dedent` + extend type SomeObject implements Bar { + second: Int + } + + extend type SomeObject implements Baz { + third: Float + } + `); }); it('Correctly extend interface type', () => { - const interfaceSDL = dedent` + const schema = buildSchema(dedent` interface SomeInterface { first: String } @@ -781,8 +791,7 @@ describe('Schema Builder', () => { extend interface SomeInterface { third: Float } - `; - const schema = buildSchema(interfaceSDL); + `); const someInterface = assertInterfaceType(schema.getType('SomeInterface')); expect(printType(someInterface)).to.equal(dedent` @@ -793,19 +802,28 @@ describe('Schema Builder', () => { } `); - expect(printAllASTNodes(someInterface)).to.equal(interfaceSDL); + expectASTNode(someInterface).to.equal(dedent` + interface SomeInterface { + first: String + } + `); + expectExtensionASTNodes(someInterface).to.equal(dedent` + extend interface SomeInterface { + second: Int + } + + extend interface SomeInterface { + third: Float + } + `); }); it('Correctly extend union type', () => { - const unionSDL = dedent` + const schema = buildSchema(` union SomeUnion = FirstType - extend union SomeUnion = SecondType - extend union SomeUnion = ThirdType - `; - const schema = buildSchema(` - ${unionSDL} + type FirstType type SecondType type ThirdType @@ -816,11 +834,16 @@ describe('Schema Builder', () => { union SomeUnion = FirstType | SecondType | ThirdType `); - expect(printAllASTNodes(someUnion)).to.equal(unionSDL); + expectASTNode(someUnion).to.equal('union SomeUnion = FirstType'); + expectExtensionASTNodes(someUnion).to.equal(dedent` + extend union SomeUnion = SecondType + + extend union SomeUnion = ThirdType + `); }); it('Correctly extend enum type', () => { - const enumSDL = dedent` + const schema = buildSchema(dedent` enum SomeEnum { FIRST } @@ -832,8 +855,7 @@ describe('Schema Builder', () => { extend enum SomeEnum { THIRD } - `; - const schema = buildSchema(enumSDL); + `); const someEnum = assertEnumType(schema.getType('SomeEnum')); expect(printType(someEnum)).to.equal(dedent` @@ -844,11 +866,24 @@ describe('Schema Builder', () => { } `); - expect(printAllASTNodes(someEnum)).to.equal(enumSDL); + expectASTNode(someEnum).to.equal(dedent` + enum SomeEnum { + FIRST + } + `); + expectExtensionASTNodes(someEnum).to.equal(dedent` + extend enum SomeEnum { + SECOND + } + + extend enum SomeEnum { + THIRD + } + `); }); it('Correctly extend input object type', () => { - const inputSDL = dedent` + const schema = buildSchema(dedent` input SomeInput { first: String } @@ -860,8 +895,7 @@ describe('Schema Builder', () => { extend input SomeInput { third: Float } - `; - const schema = buildSchema(inputSDL); + `); const someInput = assertInputObjectType(schema.getType('SomeInput')); expect(printType(someInput)).to.equal(dedent` @@ -872,7 +906,20 @@ describe('Schema Builder', () => { } `); - expect(printAllASTNodes(someInput)).to.equal(inputSDL); + expectASTNode(someInput).to.equal(dedent` + input SomeInput { + first: String + } + `); + expectExtensionASTNodes(someInput).to.equal(dedent` + extend input SomeInput { + second: Int + } + + extend input SomeInput { + third: Float + } + `); }); it('Correctly assign AST nodes', () => { @@ -932,25 +979,23 @@ describe('Schema Builder', () => { ]).to.be.deep.equal(ast.definitions); const testField = query.getFields().testField; - expect(printASTNode(testField)).to.equal( + expectASTNode(testField).to.equal( 'testField(testArg: TestInput): TestUnion', ); - expect(printASTNode(testField.args[0])).to.equal('testArg: TestInput'); - expect(printASTNode(testInput.getFields().testInputField)).to.equal( + expectASTNode(testField.args[0]).to.equal('testArg: TestInput'); + expectASTNode(testInput.getFields().testInputField).to.equal( 'testInputField: TestEnum', ); - expect(printASTNode(testEnum.getValue('TEST_VALUE'))).to.equal( - 'TEST_VALUE', - ); + expectASTNode(testEnum.getValue('TEST_VALUE')).to.equal('TEST_VALUE'); - expect(printASTNode(testInterface.getFields().interfaceField)).to.equal( + expectASTNode(testInterface.getFields().interfaceField).to.equal( 'interfaceField: String', ); - expect(printASTNode(testType.getFields().interfaceField)).to.equal( + expectASTNode(testType.getFields().interfaceField).to.equal( 'interfaceField: String', ); - expect(printASTNode(testDirective.args[0])).to.equal('arg: TestScalar'); + expectASTNode(testDirective.args[0]).to.equal('arg: TestScalar'); }); it('Root operation types with custom names', () => { diff --git a/src/utilities/__tests__/extendSchema-test.js b/src/utilities/__tests__/extendSchema-test.js index dd8b80161a..7f358ade6e 100644 --- a/src/utilities/__tests__/extendSchema-test.js +++ b/src/utilities/__tests__/extendSchema-test.js @@ -6,13 +6,11 @@ import { dedent } from '../../__testUtils__/dedent'; import { invariant } from '../../jsutils/invariant'; import type { ASTNode } from '../../language/ast'; -import { Kind } from '../../language/kinds'; import { parse } from '../../language/parser'; import { print } from '../../language/printer'; import { graphqlSync } from '../../graphql'; -import type { GraphQLNamedType } from '../../type/definition'; import { GraphQLSchema } from '../../type/schema'; import { validateSchema } from '../../type/validate'; import { assertDirective } from '../../type/directives'; @@ -37,32 +35,30 @@ import { printSchema } from '../printSchema'; import { extendSchema } from '../extendSchema'; import { buildSchema } from '../buildASTSchema'; -function printExtensionNodes(obj: ?GraphQLNamedType | GraphQLSchema): string { - invariant(obj != null); - return print({ - kind: Kind.DOCUMENT, - definitions: obj.extensionASTNodes, - }); +function expectExtensionASTNodes(obj: { + +extensionASTNodes: $ReadOnlyArray, + ... +}) { + return expect(obj.extensionASTNodes.map(print).join('\n\n')); +} + +function expectASTNode(obj: ?{ +astNode: ?ASTNode, ... }) { + // istanbul ignore next (FIXME) + invariant(obj?.astNode != null); + return expect(print(obj.astNode)); } -function printSchemaChanges( +function expectSchemaChanges( schema: GraphQLSchema, extendedSchema: GraphQLSchema, -): string { +) { const schemaDefinitions = parse(printSchema(schema)).definitions.map(print); - const ast = parse(printSchema(extendedSchema)); - return print({ - kind: Kind.DOCUMENT, - definitions: ast.definitions.filter( - (node) => !schemaDefinitions.includes(print(node)), - ), - }); -} - -function printASTNode(obj: ?{ +astNode: ?ASTNode, ... }): string { - // istanbul ignore next (FIXME) - invariant(obj?.astNode != null); - return print(obj.astNode); + return expect( + parse(printSchema(extendedSchema)) + .definitions.map(print) + .filter((def) => !schemaDefinitions.includes(def)) + .join('\n\n'), + ); } describe('extendSchema', () => { @@ -121,7 +117,7 @@ describe('extendSchema', () => { const extendedSchema = extendSchema(schema, parse(extensionSDL)); expect(validateSchema(extendedSchema)).to.deep.equal([]); - expect(printSchemaChanges(schema, extendedSchema)).to.equal(dedent` + expectSchemaChanges(schema, extendedSchema).to.equal(dedent` type SomeObject implements AnotherInterface & SomeInterface { self: SomeObject tree: [SomeObject]! @@ -196,7 +192,7 @@ describe('extendSchema', () => { const extendedSchema = extendSchema(schema, extendAST); expect(validateSchema(extendedSchema)).to.deep.equal([]); - expect(printSchemaChanges(schema, extendedSchema)).to.equal(dedent` + expectSchemaChanges(schema, extendedSchema).to.equal(dedent` enum SomeEnum { """Old value description.""" OLD_VALUE @@ -224,7 +220,7 @@ describe('extendSchema', () => { const extendedSchema = extendSchema(schema, extendAST); expect(validateSchema(extendedSchema)).to.deep.equal([]); - expect(printSchemaChanges(schema, extendedSchema)).to.equal(dedent` + expectSchemaChanges(schema, extendedSchema).to.equal(dedent` union SomeUnion = Foo | Biz | Bar `); }); @@ -239,7 +235,7 @@ describe('extendSchema', () => { const extendedSchema = extendSchema(schema, extendAST); expect(validateSchema(extendedSchema)).to.have.lengthOf.above(0); - expect(printSchemaChanges(schema, extendedSchema)).to.equal(dedent` + expectSchemaChanges(schema, extendedSchema).to.equal(dedent` union SomeUnion = SomeUnion `); }); @@ -266,7 +262,7 @@ describe('extendSchema', () => { const extendedSchema = extendSchema(schema, extendAST); expect(validateSchema(extendedSchema)).to.deep.equal([]); - expect(printSchemaChanges(schema, extendedSchema)).to.equal(dedent` + expectSchemaChanges(schema, extendedSchema).to.equal(dedent` input SomeInput { """Old field description.""" oldField: String @@ -294,10 +290,10 @@ describe('extendSchema', () => { extend scalar SomeScalar @foo `; const extendedSchema = extendSchema(schema, parse(extensionSDL)); - const someScalar = extendedSchema.getType('SomeScalar'); + const someScalar = assertScalarType(extendedSchema.getType('SomeScalar')); expect(validateSchema(extendedSchema)).to.deep.equal([]); - expect(printExtensionNodes(someScalar)).to.deep.equal(extensionSDL); + expectExtensionASTNodes(someScalar).to.equal(extensionSDL); }); it('extends scalars by adding specifiedBy directive', () => { @@ -322,7 +318,7 @@ describe('extendSchema', () => { expect(foo.specifiedByUrl).to.equal('https://example.com/foo_spec'); expect(validateSchema(extendedSchema)).to.deep.equal([]); - expect(printExtensionNodes(foo)).to.deep.equal(extensionSDL); + expectExtensionASTNodes(foo).to.equal(extensionSDL); }); it('correctly assign AST nodes to new and extended types', () => { @@ -466,47 +462,41 @@ describe('extendSchema', () => { ]); const newField = query.getFields().newField; - expect(printASTNode(newField)).to.equal( - 'newField(testArg: TestInput): TestEnum', - ); - expect(printASTNode(newField.args[0])).to.equal('testArg: TestInput'); - expect(printASTNode(query.getFields().oneMoreNewField)).to.equal( + expectASTNode(newField).to.equal('newField(testArg: TestInput): TestEnum'); + expectASTNode(newField.args[0]).to.equal('testArg: TestInput'); + expectASTNode(query.getFields().oneMoreNewField).to.equal( 'oneMoreNewField: TestUnion', ); - expect(printASTNode(someEnum.getValue('NEW_VALUE'))).to.equal('NEW_VALUE'); - expect(printASTNode(someEnum.getValue('ONE_MORE_NEW_VALUE'))).to.equal( + expectASTNode(someEnum.getValue('NEW_VALUE')).to.equal('NEW_VALUE'); + expectASTNode(someEnum.getValue('ONE_MORE_NEW_VALUE')).to.equal( 'ONE_MORE_NEW_VALUE', ); - expect(printASTNode(someInput.getFields().newField)).to.equal( - 'newField: String', - ); - expect(printASTNode(someInput.getFields().oneMoreNewField)).to.equal( + expectASTNode(someInput.getFields().newField).to.equal('newField: String'); + expectASTNode(someInput.getFields().oneMoreNewField).to.equal( 'oneMoreNewField: String', ); - expect(printASTNode(someInterface.getFields().newField)).to.equal( + expectASTNode(someInterface.getFields().newField).to.equal( 'newField: String', ); - expect(printASTNode(someInterface.getFields().oneMoreNewField)).to.equal( + expectASTNode(someInterface.getFields().oneMoreNewField).to.equal( 'oneMoreNewField: String', ); - expect(printASTNode(testInput.getFields().testInputField)).to.equal( + expectASTNode(testInput.getFields().testInputField).to.equal( 'testInputField: TestEnum', ); - expect(printASTNode(testEnum.getValue('TEST_VALUE'))).to.equal( - 'TEST_VALUE', - ); + expectASTNode(testEnum.getValue('TEST_VALUE')).to.equal('TEST_VALUE'); - expect(printASTNode(testInterface.getFields().interfaceField)).to.equal( + expectASTNode(testInterface.getFields().interfaceField).to.equal( 'interfaceField: String', ); - expect(printASTNode(testType.getFields().interfaceField)).to.equal( + expectASTNode(testType.getFields().interfaceField).to.equal( 'interfaceField: String', ); - expect(printASTNode(testDirective.args[0])).to.equal('arg: Int'); + expectASTNode(testDirective.args[0]).to.equal('arg: Int'); }); it('builds types with deprecated fields/values', () => { @@ -595,7 +585,7 @@ describe('extendSchema', () => { const extendedSchema = extendSchema(schema, parse(extensionSDL)); expect(validateSchema(extendedSchema)).to.deep.equal([]); - expect(printSchemaChanges(schema, extendedSchema)).to.equal(extensionSDL); + expectSchemaChanges(schema, extendedSchema).to.equal(extensionSDL); }); it('extends objects by adding new fields with arguments', () => { @@ -620,7 +610,7 @@ describe('extendSchema', () => { const extendedSchema = extendSchema(schema, extendAST); expect(validateSchema(extendedSchema)).to.deep.equal([]); - expect(printSchemaChanges(schema, extendedSchema)).to.equal(dedent` + expectSchemaChanges(schema, extendedSchema).to.equal(dedent` type SomeObject { newField(arg1: String, arg2: NewInputObj!): String } @@ -650,7 +640,7 @@ describe('extendSchema', () => { const extendedSchema = extendSchema(schema, extendAST); expect(validateSchema(extendedSchema)).to.deep.equal([]); - expect(printSchemaChanges(schema, extendedSchema)).to.equal(dedent` + expectSchemaChanges(schema, extendedSchema).to.equal(dedent` type SomeObject { newField(arg1: SomeEnum!): SomeEnum } @@ -677,7 +667,7 @@ describe('extendSchema', () => { const extendedSchema = extendSchema(schema, extendAST); expect(validateSchema(extendedSchema)).to.deep.equal([]); - expect(printSchemaChanges(schema, extendedSchema)).to.equal(dedent` + expectSchemaChanges(schema, extendedSchema).to.equal(dedent` type SomeObject implements SomeInterface { foo: String } @@ -724,7 +714,7 @@ describe('extendSchema', () => { const extendedSchema = extendSchema(schema, extendAST); expect(validateSchema(extendedSchema)).to.deep.equal([]); - expect(printSchemaChanges(schema, extendedSchema)).to.equal(dedent` + expectSchemaChanges(schema, extendedSchema).to.equal(dedent` type SomeObject { oldField: String newObject: NewObject @@ -765,7 +755,7 @@ describe('extendSchema', () => { const extendedSchema = extendSchema(schema, extendAST); expect(validateSchema(extendedSchema)).to.deep.equal([]); - expect(printSchemaChanges(schema, extendedSchema)).to.equal(dedent` + expectSchemaChanges(schema, extendedSchema).to.equal(dedent` type SomeObject implements OldInterface & NewInterface { oldField: String newField: String @@ -829,9 +819,7 @@ describe('extendSchema', () => { } `; const schemaWithNewTypes = extendSchema(schema, parse(newTypesSDL)); - expect(printSchemaChanges(schema, schemaWithNewTypes)).to.equal( - newTypesSDL, - ); + expectSchemaChanges(schema, schemaWithNewTypes).to.equal(newTypesSDL); const extendAST = parse(` extend scalar SomeScalar @specifiedBy(url: "http://example.com/foo_spec") @@ -867,7 +855,7 @@ describe('extendSchema', () => { const extendedSchema = extendSchema(schemaWithNewTypes, extendAST); expect(validateSchema(extendedSchema)).to.deep.equal([]); - expect(printSchemaChanges(schema, extendedSchema)).to.equal(dedent` + expectSchemaChanges(schema, extendedSchema).to.equal(dedent` scalar SomeScalar @specifiedBy(url: "http://example.com/foo_spec") type SomeObject implements SomeInterface & NewInterface & AnotherNewInterface { @@ -928,7 +916,7 @@ describe('extendSchema', () => { const extendedSchema = extendSchema(schema, extendAST); expect(validateSchema(extendedSchema)).to.deep.equal([]); - expect(printSchemaChanges(schema, extendedSchema)).to.equal(dedent` + expectSchemaChanges(schema, extendedSchema).to.equal(dedent` interface SomeInterface { oldField: String newField: String @@ -980,7 +968,7 @@ describe('extendSchema', () => { const extendedSchema = extendSchema(schema, extendAST); expect(validateSchema(extendedSchema)).to.deep.equal([]); - expect(printSchemaChanges(schema, extendedSchema)).to.equal(dedent` + expectSchemaChanges(schema, extendedSchema).to.equal(dedent` interface AnotherInterface implements SomeInterface & NewInterface { oldField: String newField: String @@ -1019,7 +1007,7 @@ describe('extendSchema', () => { const extendedSchema = extendSchema(schema, extendAST); expect(validateSchema(extendedSchema)).to.have.lengthOf.above(0); - expect(printSchemaChanges(schema, extendedSchema)).to.equal(dedent` + expectSchemaChanges(schema, extendedSchema).to.equal(dedent` interface SomeInterface { oldField: SomeInterface newField: String @@ -1050,7 +1038,7 @@ describe('extendSchema', () => { const extendedSchema = extendSchema(schema, extendAST); expect(validateSchema(extendedSchema)).to.deep.equal([]); - expect(printSchemaChanges(schema, extendedSchema)).to.equal(dedent` + expectSchemaChanges(schema, extendedSchema).to.equal(dedent` interface SomeInterface { some: SomeInterface newFieldA: Int @@ -1121,7 +1109,7 @@ describe('extendSchema', () => { const extendedSchema = extendSchema(schema, parse(extensionSDL)); expect(validateSchema(extendedSchema)).to.deep.equal([]); - expect(printSchemaChanges(schema, extendedSchema)).to.equal(extensionSDL); + expectSchemaChanges(schema, extendedSchema).to.equal(extensionSDL); }); it('Rejects invalid SDL', () => { @@ -1220,7 +1208,7 @@ describe('extendSchema', () => { const queryType = extendedSchema.getQueryType(); expect(queryType).to.include({ name: 'Foo' }); - expect(printASTNode(extendedSchema)).to.equal(extensionSDL); + expectASTNode(extendedSchema).to.equal(extensionSDL); }); it('adds new root types via schema extension', () => { @@ -1237,7 +1225,7 @@ describe('extendSchema', () => { const mutationType = extendedSchema.getMutationType(); expect(mutationType).to.include({ name: 'MutationRoot' }); - expect(printExtensionNodes(extendedSchema)).to.equal(extensionSDL); + expectExtensionASTNodes(extendedSchema).to.equal(extensionSDL); }); it('adds directive via schema extension', () => { @@ -1251,7 +1239,7 @@ describe('extendSchema', () => { `; const extendedSchema = extendSchema(schema, parse(extensionSDL)); - expect(printExtensionNodes(extendedSchema)).to.equal(extensionSDL); + expectExtensionASTNodes(extendedSchema).to.equal(extensionSDL); }); it('adds multiple new root types via schema extension', () => { @@ -1319,7 +1307,7 @@ describe('extendSchema', () => { const secondExtendAST = parse('extend schema @foo'); const extendedTwiceSchema = extendSchema(extendedSchema, secondExtendAST); - expect(printExtensionNodes(extendedTwiceSchema)).to.equal(dedent` + expectExtensionASTNodes(extendedTwiceSchema).to.equal(dedent` extend schema { mutation: Mutation }