Skip to content

Commit

Permalink
feat(UnionTypeComposer): add getResolveType and setResolveType me…
Browse files Browse the repository at this point in the history
…thods
  • Loading branch information
nodkz committed Feb 4, 2019
1 parent 426f4d4 commit 68bb865
Show file tree
Hide file tree
Showing 3 changed files with 68 additions and 1 deletion.
6 changes: 6 additions & 0 deletions src/UnionTypeComposer.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,12 @@ export class UnionTypeComposer<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/UnionTypeComposer.js
Original file line number Diff line number Diff line change
Expand Up @@ -243,6 +243,15 @@ export class UnionTypeComposer<TContext> {
// ResolveType methods
// -----------------------------------------------

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

setResolveType(fn: ?GraphQLTypeResolver<any, TContext>): UnionTypeComposer<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 @@ -328,7 +337,7 @@ export class UnionTypeComposer<TContext> {
};
}

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

Expand Down
52 changes: 52 additions & 0 deletions src/__tests__/UnionTypeComposer-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -395,5 +395,57 @@ describe('UnionTypeComposer', () => {
utc.removeTypeResolver(PersonTC);
expect(utc.hasTypeResolver(PersonTC)).toBeFalsy();
});

describe('check native resolveType methods', () => {
it('check methods setResolveType() getResolveType()', () => {
const utc1 = schemaComposer.createUnionTC(`union U = A | B`);
const resolveType = () => 'A';
expect(utc1.getResolveType()).toBeUndefined();
utc1.setResolveType(resolveType);
expect(utc1.getResolveType()).toBe(resolveType);
});

it('integration test', async () => {
const aTC = schemaComposer.createTC('type A { a: Int }');
const bTC = schemaComposer.createTC('type B { b: Int }');
const utc1 = schemaComposer.createUnionTC(`union U = A | B`);
const resolveType = value => {
if (value) {
if (value.a) return 'A';
else if (value.b) return 'B';
}
return null;
};

utc1.setResolveType(resolveType);
schemaComposer.addSchemaMustHaveType(aTC);
schemaComposer.addSchemaMustHaveType(bTC);
schemaComposer.Query.addFields({
check: {
type: '[U]',
resolve: () => [{ a: 1 }, { b: 2 }, { 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 68bb865

Please sign in to comment.