Skip to content

Commit

Permalink
feat(InterfaceTypeComposer): add getResolveType and `setResolveType…
Browse files Browse the repository at this point in the history
…` methods
  • Loading branch information
nodkz committed Feb 4, 2019
1 parent be7c4c0 commit 426f4d4
Show file tree
Hide file tree
Showing 3 changed files with 69 additions and 1 deletion.
6 changes: 6 additions & 0 deletions src/InterfaceTypeComposer.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,12 @@ export class InterfaceTypeComposer<TSource = any, TContext = any> {
// ResolveType methods
// -----------------------------------------------

public getResolveType(): GraphQLTypeResolver<any, TContext> | null | void;

public setResolveType(
fn: GraphQLTypeResolver<any, TContext> | null | void,
): this;

public hasTypeResolver(
type: TypeComposer<any, TContext> | GraphQLObjectType,
): boolean;
Expand Down
11 changes: 10 additions & 1 deletion src/InterfaceTypeComposer.js
Original file line number Diff line number Diff line change
Expand Up @@ -486,6 +486,15 @@ export class InterfaceTypeComposer<TContext> {
// ResolveType methods
// -----------------------------------------------

getResolveType(): ?GraphQLTypeResolver<any, TContext> {
return (this.gqType.resolveType: any);
}

setResolveType(fn: ?GraphQLTypeResolver<any, TContext>): InterfaceTypeComposer<TContext> {
this.gqType.resolveType = fn;
return this;
}

hasTypeResolver(type: TypeComposer<TContext> | GraphQLObjectType): boolean {
const typeResolversMap = this.getTypeResolvers();
return typeResolversMap.has(type);
Expand Down Expand Up @@ -570,7 +579,7 @@ export class InterfaceTypeComposer<TContext> {
};
}

this.gqType.resolveType = resolveType;
this.setResolveType(resolveType);
return this;
}

Expand Down
53 changes: 53 additions & 0 deletions src/__tests__/InterfaceTypeComposer-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import {
GraphQLFloat,
GraphQLBoolean,
GraphQLInterfaceType,
graphql,
} from '../graphql';
import { InterfaceTypeComposer, schemaComposer, TypeComposer } from '..';
import { graphqlVersion } from '../utils/graphqlVersion';
Expand Down Expand Up @@ -631,5 +632,57 @@ describe('InterfaceTypeComposer', () => {
iftc.removeTypeResolver(PersonTC);
expect(iftc.hasTypeResolver(PersonTC)).toBeFalsy();
});

describe('check native resolveType methods', () => {
it('check methods setResolveType() getResolveType()', () => {
const iftc1 = schemaComposer.createInterfaceTC(`interface F { f: Int }`);
const resolveType = () => 'A';
expect(iftc1.getResolveType()).toBeUndefined();
iftc1.setResolveType(resolveType);
expect(iftc1.getResolveType()).toBe(resolveType);
});

it('integration test', async () => {
const iftc1 = schemaComposer.createInterfaceTC(`interface F { f: Int }`);
const aTC = schemaComposer.createTC('type A implements F { a: Int, f: Int }');
const bTC = schemaComposer.createTC('type B implements F { b: Int, f: Int }');
const resolveType = value => {
if (value) {
if (value.a) return 'A';
else if (value.b) return 'B';
}
return null;
};

iftc1.setResolveType(resolveType);
schemaComposer.addSchemaMustHaveType(aTC);
schemaComposer.addSchemaMustHaveType(bTC);
schemaComposer.Query.addFields({
check: {
type: '[F]',
resolve: () => [{ f: 'A', a: 1 }, { f: 'B', b: 2 }, { f: 'C', c: 3 }],
},
});
const res = await graphql(
schemaComposer.buildSchema(),
`
query {
check {
__typename
... on A {
a
}
... on B {
b
}
}
}
`
);
expect(res.data).toEqual({
check: [{ __typename: 'A', a: 1 }, { __typename: 'B', b: 2 }, null],
});
});
});
});
});

0 comments on commit 426f4d4

Please sign in to comment.