From 04dbcfc534ec54059203c05e39d42b3dc6601065 Mon Sep 17 00:00:00 2001 From: isaackhlam <97761927+isaackhlam@users.noreply.github.com> Date: Thu, 30 Jun 2022 10:41:41 +0800 Subject: [PATCH 1/8] Add failing test Add failing test --- packages/stitch/tests/subschemasMerge.test.ts | 123 ++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 packages/stitch/tests/subschemasMerge.test.ts diff --git a/packages/stitch/tests/subschemasMerge.test.ts b/packages/stitch/tests/subschemasMerge.test.ts new file mode 100644 index 00000000000..74305fff669 --- /dev/null +++ b/packages/stitch/tests/subschemasMerge.test.ts @@ -0,0 +1,123 @@ +import { makeExecutableSchema } from '@graphql-tools/schema'; +import { stitchSchemas } from '../src/stitchSchemas.js'; +import { graphql } from 'graphql'; +import { assertSome } from '@graphql-tools/utils'; + +describe('Mutation of stitched schema merge', () => { + test('operation should be mutation', async () => { + const sub0Schema = makeExecutableSchema({ + typeDefs: /* GraphQL */ ` + type Query { + placeholder: Placeholder + } + type Placeholder { + id: ID! + } + type Mutation { + zeroUser(id: ID): User + } + type User { + id: ID! + zeroValue: String + user: User! + } + `, + resolvers: { + Mutation: { + zeroUser: (o, { id }) => ({ id }), + }, + User: { + zeroValue: (p, a, c, i) => `0: User: ${i.operation.operation}`, + user: ({ id }) => ({ id }), + }, + }, + }); + + const sub1Schema = makeExecutableSchema({ + typeDefs: /* GraphQL */ ` + type Query { + placeholder: Placeholder + } + type Placeholder { + id: ID! + } + type Mutation { + oneUser(id: ID): User + } + type User { + id: ID! + oneValue: String + user: User! + } + `, + resolvers: { + Mutation: { + oneUser: (o, { id }) => ({ id }), + }, + User: { + oneValue: (p, a, c, i) => `1: User: ${i.operation.operation}`, + user: ({ id }) => ({ id }), + }, + }, + }); + const mergedSchema = stitchSchemas({ + subschemas: [ + { + schema: sub1Schema, + merge: { + User: { + fieldName: 'oneUser', + selectionSet: '{ id }', + args: o => ({ id: o.id }), + }, + }, + }, + { + schema: sub0Schema, + merge: { + User: { + fieldName: 'zeroUser', + selectionSet: '{ id }', + args: o => ({ id: o.id }), + }, + }, + }, + ], + mergeTypes: true, // << default in v7 + }); + const { data } = await graphql({ + schema: mergedSchema, + source: /* GraphQL */ ` + mutation { + # or oneUser, which zeroValue becomes null + zeroUser(id: 1) { + __typename + id + zeroValue + oneValue + user { + __typename + id + zeroValue + oneValue + } + } + } + `, + }); + assertSome(data); + const userData: any = data['zeroUser']; + expect(userData).toEqual({ + __typename: 'User', + id: '1', + oneValue: '1: User: mutation', + zeroValue: '0: User: mutation', + user: { + __typename: 'User', + id: '1', + oneValue: '1: User: mutation', + zeroValue: '0: User: mutation', + }, + }); + }); +}); From dd01a6527a3e091459354116a80e83dd0e659371 Mon Sep 17 00:00:00 2001 From: isaackhlam <97761927+isaackhlam@users.noreply.github.com> Date: Thu, 30 Jun 2022 11:34:42 +0800 Subject: [PATCH 2/8] Fix operetion type --- packages/stitch/src/createMergedTypeResolver.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/stitch/src/createMergedTypeResolver.ts b/packages/stitch/src/createMergedTypeResolver.ts index 351934fb5ab..0293ea5a3f4 100644 --- a/packages/stitch/src/createMergedTypeResolver.ts +++ b/packages/stitch/src/createMergedTypeResolver.ts @@ -19,7 +19,7 @@ export function createMergedTypeResolver = ) { return batchDelegateToSchema({ schema: subschema, - operation: 'query' as OperationTypeNode, + operation: info.operation.operation as OperationTypeNode, fieldName, returnType: new GraphQLList(type), key, @@ -45,7 +45,7 @@ export function createMergedTypeResolver = ) { return delegateToSchema({ schema: subschema, - operation: 'query' as OperationTypeNode, + operation: info.operation.operation as OperationTypeNode, fieldName, returnType: type, args: args(originalResult), From 8667941164a33999daf55e3c713da30c35a053b7 Mon Sep 17 00:00:00 2001 From: isaackhlam <97761927+isaackhlam@users.noreply.github.com> Date: Thu, 30 Jun 2022 12:16:23 +0800 Subject: [PATCH 3/8] suppress unused var checking --- packages/stitch/tests/subschemasMerge.test.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/stitch/tests/subschemasMerge.test.ts b/packages/stitch/tests/subschemasMerge.test.ts index 74305fff669..948da12772c 100644 --- a/packages/stitch/tests/subschemasMerge.test.ts +++ b/packages/stitch/tests/subschemasMerge.test.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ import { makeExecutableSchema } from '@graphql-tools/schema'; import { stitchSchemas } from '../src/stitchSchemas.js'; import { graphql } from 'graphql'; From 4670c141c35ba5f50fa17d7e9b76152036cd1ec1 Mon Sep 17 00:00:00 2001 From: isaackhlam <97761927+isaackhlam@users.noreply.github.com> Date: Thu, 30 Jun 2022 12:34:08 +0800 Subject: [PATCH 4/8] Ignore ts-build lint error --- packages/stitch/tests/subschemasMerge.test.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/stitch/tests/subschemasMerge.test.ts b/packages/stitch/tests/subschemasMerge.test.ts index 948da12772c..a09631988ee 100644 --- a/packages/stitch/tests/subschemasMerge.test.ts +++ b/packages/stitch/tests/subschemasMerge.test.ts @@ -25,9 +25,11 @@ describe('Mutation of stitched schema merge', () => { `, resolvers: { Mutation: { + // @ts-ignore zeroUser: (o, { id }) => ({ id }), }, User: { + // @ts-ignore zeroValue: (p, a, c, i) => `0: User: ${i.operation.operation}`, user: ({ id }) => ({ id }), }, @@ -53,9 +55,11 @@ describe('Mutation of stitched schema merge', () => { `, resolvers: { Mutation: { + // @ts-ignore oneUser: (o, { id }) => ({ id }), }, User: { + // @ts-ignore oneValue: (p, a, c, i) => `1: User: ${i.operation.operation}`, user: ({ id }) => ({ id }), }, From 1a12208679f2d7d9e3c366edf15f85711e2fa6a2 Mon Sep 17 00:00:00 2001 From: isaackhlam <97761927+isaackhlam@users.noreply.github.com> Date: Thu, 30 Jun 2022 12:47:18 +0800 Subject: [PATCH 5/8] fix unused var --- packages/stitch/tests/subschemasMerge.test.ts | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/packages/stitch/tests/subschemasMerge.test.ts b/packages/stitch/tests/subschemasMerge.test.ts index a09631988ee..2a385ac6a45 100644 --- a/packages/stitch/tests/subschemasMerge.test.ts +++ b/packages/stitch/tests/subschemasMerge.test.ts @@ -1,4 +1,3 @@ -/* eslint-disable @typescript-eslint/no-unused-vars */ import { makeExecutableSchema } from '@graphql-tools/schema'; import { stitchSchemas } from '../src/stitchSchemas.js'; import { graphql } from 'graphql'; @@ -25,12 +24,10 @@ describe('Mutation of stitched schema merge', () => { `, resolvers: { Mutation: { - // @ts-ignore - zeroUser: (o, { id }) => ({ id }), + zeroUser: ({} = {}, { id }) => ({ id }), }, User: { - // @ts-ignore - zeroValue: (p, a, c, i) => `0: User: ${i.operation.operation}`, + zeroValue: ({} = {}, {} = {}, {} = {}, i) => `0: User: ${i.operation.operation}`, user: ({ id }) => ({ id }), }, }, @@ -55,12 +52,10 @@ describe('Mutation of stitched schema merge', () => { `, resolvers: { Mutation: { - // @ts-ignore - oneUser: (o, { id }) => ({ id }), + oneUser: ({} = {}, { id }) => ({ id }), }, User: { - // @ts-ignore - oneValue: (p, a, c, i) => `1: User: ${i.operation.operation}`, + oneValue: ({} = {}, {} = {}, {} = {}, i) => `1: User: ${i.operation.operation}`, user: ({ id }) => ({ id }), }, }, From e3069ef2989e469984ad2f9889a5bf054858004d Mon Sep 17 00:00:00 2001 From: isaackhlam <97761927+isaackhlam@users.noreply.github.com> Date: Thu, 30 Jun 2022 12:55:18 +0800 Subject: [PATCH 6/8] Fix empty object pattern --- packages/stitch/tests/subschemasMerge.test.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/stitch/tests/subschemasMerge.test.ts b/packages/stitch/tests/subschemasMerge.test.ts index 2a385ac6a45..0405b6ecdf2 100644 --- a/packages/stitch/tests/subschemasMerge.test.ts +++ b/packages/stitch/tests/subschemasMerge.test.ts @@ -24,10 +24,10 @@ describe('Mutation of stitched schema merge', () => { `, resolvers: { Mutation: { - zeroUser: ({} = {}, { id }) => ({ id }), + zeroUser: (_p, { id }) => ({ id }), }, User: { - zeroValue: ({} = {}, {} = {}, {} = {}, i) => `0: User: ${i.operation.operation}`, + zeroValue: (_p, _a, _c, i) => `0: User: ${i.operation.operation}`, user: ({ id }) => ({ id }), }, }, @@ -52,10 +52,10 @@ describe('Mutation of stitched schema merge', () => { `, resolvers: { Mutation: { - oneUser: ({} = {}, { id }) => ({ id }), + oneUser: (_p, { id }) => ({ id }), }, User: { - oneValue: ({} = {}, {} = {}, {} = {}, i) => `1: User: ${i.operation.operation}`, + oneValue: (_p, _a, _c, i) => `1: User: ${i.operation.operation}`, user: ({ id }) => ({ id }), }, }, From 427c2241128f7db0c21bfd2a1db4dfb3e524192b Mon Sep 17 00:00:00 2001 From: isaackhlam <97761927+isaackhlam@users.noreply.github.com> Date: Sat, 2 Jul 2022 17:34:47 +0800 Subject: [PATCH 7/8] update test --- packages/stitch/tests/subschemasMerge.test.ts | 127 +++++++++++++++++- 1 file changed, 126 insertions(+), 1 deletion(-) diff --git a/packages/stitch/tests/subschemasMerge.test.ts b/packages/stitch/tests/subschemasMerge.test.ts index 0405b6ecdf2..db4bacbbe81 100644 --- a/packages/stitch/tests/subschemasMerge.test.ts +++ b/packages/stitch/tests/subschemasMerge.test.ts @@ -4,7 +4,7 @@ import { graphql } from 'graphql'; import { assertSome } from '@graphql-tools/utils'; describe('Mutation of stitched schema merge', () => { - test('operation should be mutation', async () => { + test('Has Mutation.*User, not Query.*User', async () => { const sub0Schema = makeExecutableSchema({ typeDefs: /* GraphQL */ ` type Query { @@ -120,4 +120,129 @@ describe('Mutation of stitched schema merge', () => { }, }); }); + + test('Added Query.*User to both server', async () => { + const sub0Schema = makeExecutableSchema({ + typeDefs: /* GraphQL */ ` + type Query { + placeholder: Placeholder + zeroUser(id: ID): User + } + type Placeholder { + id: ID! + } + type Mutation { + zeroUser(id: ID): User + } + type User { + id: ID! + zeroValue: String + user: User! + } + `, + resolvers: { + Query: { + zeroUser: (_p, { id }) => ({ id }), + }, + Mutation: { + zeroUser: (_p, { id }) => ({ id }), + }, + User: { + zeroValue: (_p, _a, _c, i) => `0: User: ${i.operation.operation}`, + user: ({ id }) => ({ id }), + }, + }, + }); + + const sub1Schema = makeExecutableSchema({ + typeDefs: /* GraphQL */ ` + type Query { + placeholder: Placeholder + oneUser(id: ID): User + } + type Placeholder { + id: ID! + } + type Mutation { + oneUser(id: ID): User + } + type User { + id: ID! + oneValue: String + user: User! + } + `, + resolvers: { + Query: { + oneUser: (_p, { id }) => ({ id }), + }, + Mutation: { + oneUser: (_p, { id }) => ({ id }), + }, + User: { + oneValue: (_p, _a, _c, i) => `1: User: ${i.operation.operation}`, + user: ({ id }) => ({ id }), + }, + }, + }); + const mergedSchema = stitchSchemas({ + subschemas: [ + { + schema: sub1Schema, + merge: { + User: { + fieldName: 'oneUser', + selectionSet: '{ id }', + args: o => ({ id: o.id }), + }, + }, + }, + { + schema: sub0Schema, + merge: { + User: { + fieldName: 'zeroUser', + selectionSet: '{ id }', + args: o => ({ id: o.id }), + }, + }, + }, + ], + mergeTypes: true, // << default in v7 + }); + const { data } = await graphql({ + schema: mergedSchema, + source: /* GraphQL */ ` + mutation { + # or oneUser, which zeroValue becomes null + zeroUser(id: 1) { + __typename + id + zeroValue + oneValue + user { + __typename + id + zeroValue + oneValue + } + } + } + `, + }); + assertSome(data); + const userData: any = data['zeroUser']; + expect(userData).toEqual({ + __typename: 'User', + id: '1', + oneValue: '1: User: mutation', + zeroValue: '0: User: mutation', + user: { + __typename: 'User', + id: '1', + oneValue: '1: User: mutation', + zeroValue: '0: User: mutation', + }, + }); + }); }); From b491287589f1befc79187e20e31141cdcca98930 Mon Sep 17 00:00:00 2001 From: kftse Date: Mon, 4 Jul 2022 13:41:18 +0800 Subject: [PATCH 8/8] rename tests --- .../{subschemasMerge.test.ts => stitchMutationSchema.ts} | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) rename packages/stitch/tests/{subschemasMerge.test.ts => stitchMutationSchema.ts} (96%) diff --git a/packages/stitch/tests/subschemasMerge.test.ts b/packages/stitch/tests/stitchMutationSchema.ts similarity index 96% rename from packages/stitch/tests/subschemasMerge.test.ts rename to packages/stitch/tests/stitchMutationSchema.ts index db4bacbbe81..7c9da973e6d 100644 --- a/packages/stitch/tests/subschemasMerge.test.ts +++ b/packages/stitch/tests/stitchMutationSchema.ts @@ -3,8 +3,8 @@ import { stitchSchemas } from '../src/stitchSchemas.js'; import { graphql } from 'graphql'; import { assertSome } from '@graphql-tools/utils'; -describe('Mutation of stitched schema merge', () => { - test('Has Mutation.*User, not Query.*User', async () => { +describe('Mutations executed as mutation on stitched schema', () => { + test('Mutation executed when only mutation type is available', async () => { const sub0Schema = makeExecutableSchema({ typeDefs: /* GraphQL */ ` type Query { @@ -121,7 +121,7 @@ describe('Mutation of stitched schema merge', () => { }); }); - test('Added Query.*User to both server', async () => { + test('Mutation executed when both mutation and query are available', async () => { const sub0Schema = makeExecutableSchema({ typeDefs: /* GraphQL */ ` type Query {