-
-
Notifications
You must be signed in to change notification settings - Fork 99
Expand file tree
/
Copy path263-test.ts
More file actions
114 lines (99 loc) · 3.6 KB
/
263-test.ts
File metadata and controls
114 lines (99 loc) · 3.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
import { schemaComposer, graphql, ObjectTypeComposer } from 'graphql-compose';
import { composeMongoose } from '../../index';
import { mongoose } from '../../__mocks__/mongooseCommon';
const UserSchema = new mongoose.Schema({
name: { type: String, required: true },
});
interface IUser extends mongoose.Document {
name: string;
}
const PostSchema = new mongoose.Schema({
title: { type: String, required: true },
authorId: { type: mongoose.Types.ObjectId },
reviewerIds: { type: [mongoose.Types.ObjectId] },
});
interface IPost extends mongoose.Document {
title: string;
authorId?: mongoose.Types.ObjectId;
reviewerIds?: [mongoose.Types.ObjectId];
}
const UserModel = mongoose.model<IUser>('User', UserSchema);
const PostModel = mongoose.model<IPost>('Post', PostSchema);
const UserTC = composeMongoose(UserModel);
const PostTC = composeMongoose(PostModel);
if (!(UserTC instanceof ObjectTypeComposer) || !(PostTC instanceof ObjectTypeComposer)) {
throw new Error('TCs should return ObjectTypeComposers');
}
PostTC.addRelation('author', {
resolver: UserTC.mongooseResolvers.dataLoader({ lean: true }),
prepareArgs: {
_id: (s) => s.authorId,
},
projection: { authorId: true },
});
PostTC.addRelation('reviewers', {
resolver: UserTC.mongooseResolvers.dataLoaderMany({ lean: true }),
prepareArgs: {
_ids: (s) => s.reviewerIds,
},
projection: { reviewerIds: true },
});
schemaComposer.Query.addFields({
post: PostTC.mongooseResolvers.findById(),
posts: PostTC.mongooseResolvers.findMany(),
user: UserTC.mongooseResolvers.findById(),
users: UserTC.mongooseResolvers.findMany({ sort: false }),
});
const schema = schemaComposer.buildSchema();
// console.log(schemaComposer.toSDL());
beforeAll(async () => {
await UserModel.base.createConnection();
const User1 = await UserModel.create({ name: 'User1' });
const User2 = await UserModel.create({ name: 'User2' });
const User3 = await UserModel.create({ name: 'User3' });
await PostModel.create({ title: 'Post1', authorId: User1._id });
await PostModel.create({ title: 'Post2', authorId: User1._id, reviewerIds: [] });
await PostModel.create({ title: 'Post3', authorId: User1._id, reviewerIds: [User2._id] });
await PostModel.create({ title: 'Post4', authorId: User2._id, reviewerIds: [User1._id] });
await PostModel.create({ title: 'Post5', authorId: User2._id, reviewerIds: [User1._id] });
await PostModel.create({
title: 'Post6',
authorId: User3._id,
reviewerIds: [User1._id, User2._id],
});
});
afterAll(() => UserModel.base.disconnect());
describe('issue #263 - new resolvers which works via DataLoader', () => {
it('check response', async () => {
// 👀 uncomment next line if you want to see real mongoose queries
// mongoose.set('debug', true);
expect(
await graphql.graphql({
schema,
source: `query {
posts {
title
author { name }
reviewers { name }
}
}`,
contextValue: {},
})
).toEqual({
data: {
posts: [
{ title: 'Post1', author: { name: 'User1' }, reviewers: [] },
{ title: 'Post2', author: { name: 'User1' }, reviewers: [] },
{ title: 'Post3', author: { name: 'User1' }, reviewers: [{ name: 'User2' }] },
{ title: 'Post4', author: { name: 'User2' }, reviewers: [{ name: 'User1' }] },
{ title: 'Post5', author: { name: 'User2' }, reviewers: [{ name: 'User1' }] },
{
title: 'Post6',
author: { name: 'User3' },
reviewers: [{ name: 'User1' }, { name: 'User2' }],
},
],
},
});
});
});