Skip to content

Commit

Permalink
Add more tests to addSubschema (#4493)
Browse files Browse the repository at this point in the history
  • Loading branch information
ardatan committed Sep 14, 2022
1 parent 68357bf commit cb6fa8c
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 24 deletions.
5 changes: 5 additions & 0 deletions .changeset/sixty-worms-tell.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@graphql-mesh/runtime': patch
---

Refactor useSubschema
16 changes: 5 additions & 11 deletions packages/runtime/src/useSubschema.ts
Original file line number Diff line number Diff line change
@@ -1,19 +1,12 @@
import { applyRequestTransforms, applyResultTransforms } from '@graphql-mesh/utils';
import {
createDefaultExecutor,
DelegationContext,
SubschemaConfig,
applySchemaTransforms,
Subschema,
} from '@graphql-tools/delegate';
import { createDefaultExecutor, DelegationContext, applySchemaTransforms, Subschema } from '@graphql-tools/delegate';
import { ExecutionRequest, getOperationASTFromRequest, isAsyncIterable } from '@graphql-tools/utils';
import { isIntrospectionOperation, mapAsyncIterator, Plugin, TypedExecutionArgs } from '@envelop/core';
import { introspectionFromSchema } from 'graphql';
import { createBatchingExecutor } from '@graphql-tools/batch-execute';

function getExecuteFn(subschema: SubschemaConfig) {
function getExecuteFn(subschema: Subschema) {
return async function subschemaExecute(args: TypedExecutionArgs<any>): Promise<any> {
const transformationContext: Record<string, any> = {};
const originalRequest: ExecutionRequest = {
document: args.document,
variables: args.variableValues as any,
Expand All @@ -37,9 +30,9 @@ function getExecuteFn(subschema: SubschemaConfig) {
context: args.contextValue,
rootValue: args.rootValue,
transforms: subschema.transforms,
transformedSchema: args.schema,
transformedSchema: subschema.transformedSchema,
skipTypeMerging: true,
returnType: {} as any, // Might not work
returnType: args.schema.getRootType(operationAST.operation),
};
let executor = subschema.executor;
if (executor == null) {
Expand All @@ -48,6 +41,7 @@ function getExecuteFn(subschema: SubschemaConfig) {
if (subschema.batch) {
executor = createBatchingExecutor(executor);
}
const transformationContext: Record<string, any> = {};
const transformedRequest = applyRequestTransforms(
originalRequest,
delegationContext,
Expand Down
50 changes: 37 additions & 13 deletions packages/runtime/test/useSubschema.test.ts
Original file line number Diff line number Diff line change
@@ -1,21 +1,31 @@
import { envelop } from '@envelop/core';
import { Subschema } from '@graphql-tools/delegate';
import { makeExecutableSchema } from '@graphql-tools/schema';
import { RenameRootFields } from '@graphql-tools/wrap';
import { RenameRootFields, TransformEnumValues } from '@graphql-tools/wrap';
import { buildClientSchema, ExecutionResult, getIntrospectionQuery, IntrospectionQuery, printSchema } from 'graphql';
import { useSubschema } from '../src/useSubschema';

describe('useSubschema', () => {
const sdl = /* GraphQL */ `
type Query {
foo: String
foo(baz: Baz!): String
}
enum Baz {
B
C
D
}
`;
const schema = makeExecutableSchema({
typeDefs: sdl,
resolvers: {
Query: {
foo: () => 'bar',
foo: (_, { baz }) => baz,
},
Baz: {
B: 'b',
C: 'c',
D: 'd',
},
},
});
Expand All @@ -29,6 +39,13 @@ describe('useSubschema', () => {
}
return name;
}),
new TransformEnumValues((typeName, externalValue, enumValueConfig) => [
`A_${externalValue}`,
{
...enumValueConfig,
value: `A_${externalValue}`,
},
]),
],
})
);
Expand All @@ -47,28 +64,35 @@ describe('useSubschema', () => {
})) as any as ExecutionResult<IntrospectionQuery>;
const introspectedSchema = buildClientSchema(result.data);
const printedIntrospectedSdl = printSchema(introspectedSchema);
expect(printedIntrospectedSdl).toContain(
/* GraphQL */ `
type Query {
bar: String
}
`.trim()
);
expect(printedIntrospectedSdl).toMatchInlineSnapshot(`
"type Query {
bar(baz: Baz!): String
}
enum Baz {
A_B
A_C
A_D
}"
`);
});
it('should handle requests and responses correctly', async () => {
const { schema, parse, validate, execute, contextFactory } = getEnveloped();
const document = parse(/* GraphQL */ `
query Test {
bar
query Test($baz: Baz!) {
bar(baz: $baz)
}
`);
const errors = validate(schema, document);
expect(errors).toHaveLength(0);
const result = (await execute({
schema,
document,
variableValues: {
baz: 'A_B',
},
contextValue: await contextFactory(),
})) as any as ExecutionResult<IntrospectionQuery>;
expect(result.data).toEqual({ bar: 'bar' });
expect(result.data).toEqual({ bar: 'b' });
});
});

0 comments on commit cb6fa8c

Please sign in to comment.