Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Mocking: Interfaces and Unions #34

Closed
helfer opened this issue Apr 17, 2016 · 3 comments
Closed

Mocking: Interfaces and Unions #34

helfer opened this issue Apr 17, 2016 · 3 comments
Labels
help wanted Extra attention is needed

Comments

@helfer
Copy link
Contributor

helfer commented Apr 17, 2016

Interfaces and unions are currently not mocked, I believe. The straightforward solution is to randomly pick an implementing type each time a field returns a Union or Interface, and then mock that type.

@helfer
Copy link
Contributor Author

helfer commented Apr 17, 2016

Actually, it's a bit trickier than that, because unions and interfaces need to define the resolveType. Because mocking of objects is deferred to scalars when there is no default type, mocking unions isn't that straight forward. The best I can offer for now is that people define the mock for the union type themselves. Making it work out of the box will take a bit more work.

@helfer helfer mentioned this issue Apr 17, 2016
@helfer
Copy link
Contributor Author

helfer commented May 4, 2016

Currently I have default mocks for unions. To have default mocks for interfaces, all you'd need to do is look through all the types in the schema and find the ones that implement this interface, then do the same as for the unions. Anyone want to try making a PR?

@helfer helfer added the help wanted Extra attention is needed label May 4, 2016
@helfer
Copy link
Contributor Author

helfer commented May 24, 2016

Unions are now implemented and also work in apolloServer. The last remaining bit is interfaces, which could be done by creating mock data in the same fashion as for unions and defining __resolveType on the Interface. However, to know all implementing types of an interface, we have to first look up all types in the Schema and find the ones that implement the interface.

The code in mocking could go here, right after mocking for Union types: https://github.com/apollostack/graphql-tools/blob/98313587d6f11f924c027d36b71ee91e96a62a1b/src/mock.js#L138

In order to figure out all the types that implement an interface, the following function in GraphQL-JS can be used: https://github.com/graphql/graphql-js/blob/359ec769ebfcb2c1ef15ea74abb412d0c4c9131e/src/type/schema.js#L170

schema.getPossibleTypes(interfaceOrUnionType)

The code in mocks currently uses some one-letter variables (o, a, c, r) that just get passed around, so it's not obvious what they do. These are actually the arguments to a resolve function, so the r value can be used to get access to the schema: const schema = r.schema. Maybe r should be renamed toinfo`.

So the following should be enough to get mocks for Interface types:

return { typename: getRandomElement(info.schema.getPossibleTypes(fieldType)) };

Then of course it needs a test, but that test can be just like the one for UnionType. When testing, don't forget to explicitly pass the implementing types of the interface expliticly to the schema, because otherwise the GraphQL schema will not be aware of them.

@Slava Slava self-assigned this May 25, 2016
@Slava Slava mentioned this issue May 26, 2016
@helfer helfer closed this as completed May 29, 2016
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
help wanted Extra attention is needed
Projects
None yet
Development

No branches or pull requests

2 participants