Skip to content

Commit 4c543b3

Browse files
committed
Fix Tests
1 parent 08e214f commit 4c543b3

File tree

3 files changed

+58
-66
lines changed

3 files changed

+58
-66
lines changed

src/introspection/getSchemaFromData.js

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -171,19 +171,20 @@ export default data => {
171171
* extend type Post { User: User }
172172
* extend type User { Posts: [Post] }
173173
*/
174-
const schemaExtension = Object.values(typesByName)
175-
.reduce((ext, type) => {
176-
Object.keys(type.getFields())
177-
.filter(isRelationshipField)
178-
.map(fieldName => {
179-
const relType = getRelatedType(fieldName);
180-
const rel = pluralize(type.toString());
181-
ext.push(`extend type ${type} { ${relType}: ${relType} }`);
182-
ext.push(`extend type ${relType} { ${rel}: [${type}] }`);
183-
});
184-
return ext;
185-
}, [])
186-
.join('\n');
174+
const schemaExtension = Object.values(typesByName).reduce((ext, type) => {
175+
Object.keys(type.getFields())
176+
.filter(isRelationshipField)
177+
.map(fieldName => {
178+
const relType = getRelatedType(fieldName);
179+
const rel = pluralize(type.toString());
180+
ext += `
181+
extend type ${type} { ${relType}: ${relType} }
182+
extend type ${relType} { ${rel}: [${type}] }`;
183+
});
184+
return ext;
185+
}, '');
187186

188-
return extendSchema(schema, parse(schemaExtension));
187+
return schemaExtension
188+
? extendSchema(schema, parse(schemaExtension))
189+
: schema;
189190
};

src/introspection/getSchemaFromData.spec.js

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import {
22
GraphQLBoolean,
33
GraphQLID,
44
GraphQLInt,
5+
GraphQLList,
56
GraphQLNonNull,
67
GraphQLObjectType,
78
GraphQLString,
@@ -37,21 +38,22 @@ const data = {
3738

3839
const UserType = new GraphQLObjectType({
3940
name: 'User',
40-
fields: {
41+
fields: () => ({
4142
id: { type: new GraphQLNonNull(GraphQLID) },
4243
name: { type: new GraphQLNonNull(GraphQLString) },
43-
},
44+
Posts: { type: new GraphQLList(PostType) },
45+
}),
4446
});
4547

4648
const PostType = new GraphQLObjectType({
4749
name: 'Post',
48-
fields: {
50+
fields: () => ({
4951
id: { type: new GraphQLNonNull(GraphQLID) },
5052
title: { type: new GraphQLNonNull(GraphQLString) },
5153
views: { type: new GraphQLNonNull(GraphQLInt) },
5254
user_id: { type: new GraphQLNonNull(GraphQLID) },
5355
User: { type: UserType },
54-
},
56+
}),
5557
});
5658

5759
/*
@@ -312,7 +314,7 @@ test('creates three mutation fields per data type', () => {
312314

313315
test('pluralizes and capitalizes correctly', () => {
314316
const data = {
315-
foot: [{ id: 1, size: 42 }, { id: 2, size: 39 }],
317+
feet: [{ id: 1, size: 42 }, { id: 2, size: 39 }],
316318
categories: [{ id: 1, name: 'foo' }],
317319
};
318320
const queries = getSchemaFromData(data).getQueryType().getFields();

src/resolver/Entity/index.js

Lines changed: 36 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -15,79 +15,68 @@ import { isRelationshipField } from '../../relationships';
1515
*
1616
* {
1717
* posts: [
18-
* { id: 1, title: 'foo', user_id: 123 }
18+
* { id: 1, title: 'Hello, world', user_id: 123 }
1919
* ],
2020
* users: [
2121
* { id: 123, name: 'John Doe' }
2222
* ]
23+
* comments: [
24+
* { id: 4646, post_id: 1, body: 'Nice post!' }
25+
* ]
2326
* }
2427
*
25-
* There is one relationship field here, posts.user_id.
26-
* The generated GraphQL schema is:
28+
* There are two relationship fields here, posts.user_id and comments.post_id.
29+
* The generated GraphQL schema for posts is:
2730
*
2831
* type Post {
2932
* id: ID!
3033
* title: String
3134
* user_id: ID
3235
* User: User
33-
* }
34-
* type User {
35-
* id: ID!
36-
* name: String
37-
* Posts: [Post]
36+
* Comments: [Comment]
3837
* }
3938
*
40-
* This method generates resolvers for Post.User and User.Posts
39+
* When called for the posts entity, this method generates resolvers
40+
* for Post.User and Post.Comments
4141
*
42-
* @param {String} key The entity key in the data map, e.g. "posts"
42+
* @param {String} entityName The entity key in the data map, e.g. "posts"
4343
* @param {Object} data The entire data map, e.g. { posts: [], users: [] }
4444
*
4545
* @return {Object} resolvers, e.g.
4646
*
4747
* {
4848
* Post: {
49-
* User: (post) => users.find(user => user.id == post.user_id)
49+
* User: (post) => users.find(user => user.id == post.user_id),
50+
* Comments: (post) => comments.filter(comment => comment.post_id = post.id),
5051
* },
5152
* }
52-
*
53-
* when called with the "posts" key, and
54-
*
55-
* {
56-
* User: {
57-
* Posts: (user) => posts.filter(post => post.user_id == user.id)
58-
* }
59-
* }
60-
*
61-
* when called with the "users" key
6253
*/
63-
export default (key, data) => {
64-
const manyToOneResolvers = Object.keys(getFieldsFromEntities(data[key]))
65-
.filter(isRelationshipField)
66-
.reduce(
67-
(resolvers, fieldName) => ({
68-
...resolvers,
69-
[getRelatedType(fieldName)]: entity =>
70-
data[getRelatedKey(fieldName)].find(
71-
relatedRecord => relatedRecord.id == entity[fieldName],
72-
),
73-
}),
74-
{},
75-
);
76-
const relatedField = getReverseRelatedField(key); // 'posts' => 'post_id'
54+
export default (entityName, data) => {
55+
const entityFields = Object.keys(getFieldsFromEntities(data[entityName]));
56+
const manyToOneResolvers = entityFields.filter(isRelationshipField).reduce(
57+
(resolvers, fieldName) => ({
58+
...resolvers,
59+
[getRelatedType(fieldName)]: entity =>
60+
data[getRelatedKey(fieldName)].find(
61+
relatedRecord => relatedRecord.id == entity[fieldName],
62+
),
63+
}),
64+
{},
65+
);
66+
const relatedField = getReverseRelatedField(entityName); // 'posts' => 'post_id'
7767
const hasReverseRelationship = entityName =>
7868
getFieldsFromEntities(data[entityName]).hasOwnProperty(relatedField);
79-
const oneToManyResolvers = Object.keys(data)
80-
.filter(hasReverseRelationship)
81-
.reduce(
82-
(resolvers, entityName) => ({
83-
...resolvers,
84-
[getRelationshipFromKey(entityName)]: entity =>
85-
data[entityName].filter(
86-
record => record[relatedField] == entity.id,
87-
),
88-
}),
89-
{},
90-
);
69+
const entities = Object.keys(data);
70+
const oneToManyResolvers = entities.filter(hasReverseRelationship).reduce(
71+
(resolvers, entityName) => ({
72+
...resolvers,
73+
[getRelationshipFromKey(entityName)]: entity =>
74+
data[entityName].filter(
75+
record => record[relatedField] == entity.id,
76+
),
77+
}),
78+
{},
79+
);
9180

9281
return {
9382
...manyToOneResolvers,

0 commit comments

Comments
 (0)