Skip to content

Commit f2c23cc

Browse files
committed
Add Messages API
1 parent 55c8339 commit f2c23cc

File tree

10 files changed

+559
-83
lines changed

10 files changed

+559
-83
lines changed

__tests__/message.spec.js

Lines changed: 338 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,338 @@
1+
const {
2+
messageDeleteResult,
3+
pinMessageResult,
4+
unpinMessageResult,
5+
messageAnnouncementResult,
6+
removeAnnouncementResult,
7+
} = require("../graphql/variables/resultMessages");
8+
const {
9+
authenticationError,
10+
noAuthorizationError,
11+
} = require("../graphql/variables/errorMessages");
12+
const app = require("../app").app;
13+
const supertest = require("supertest");
14+
const request = supertest(app);
15+
const mongoose = require("mongoose");
16+
const Organization = require("../models/organization");
17+
const User = require("../models/user");
18+
const Category = require("../models/category");
19+
const Topic = require("../models/topic");
20+
const Message = require("../models/message");
21+
const server = require("../app").server;
22+
const jwt = require("jsonwebtoken");
23+
24+
let connection,
25+
organizationResponse,
26+
firstUserSignupResponse,
27+
firstUserLoginResponse,
28+
firstUserToken,
29+
categoryResponse,
30+
topicResponse,
31+
messageId;
32+
33+
beforeAll(async (done) => {
34+
connection = await server.listen(process.env.PORT);
35+
console.log(`Test: listening on ${process.env.PORT}`);
36+
await Organization.deleteMany({});
37+
await User.deleteMany({});
38+
await Category.deleteMany({});
39+
await Topic.deleteMany({});
40+
await Message.deleteMany({});
41+
organizationResponse = await request
42+
.post("/graphql")
43+
.send({
44+
query: `mutation{ createOrganization(organizationInput: {
45+
name: "Test Organization"
46+
description: {
47+
shortDescription: "Lorem Ipsum"
48+
}
49+
contactInfo: {
50+
email: "test@email.com"
51+
website: "www.website.com"
52+
}
53+
}) {
54+
result
55+
}}`,
56+
})
57+
.set("Accept", "application/json");
58+
firstUserSignupResponse = await request
59+
.post("/graphql")
60+
.send({
61+
query: `mutation{ createUser(userInput: {
62+
name: {
63+
firstName: "TestUser"
64+
lastName: "1"
65+
}
66+
email: "abc1@email.com"
67+
password: "password"
68+
info: {
69+
about: {
70+
shortDescription: "Lorem Ipsum"
71+
}
72+
}
73+
}) {
74+
_id
75+
name {
76+
firstName
77+
lastName
78+
}
79+
email
80+
phone
81+
isAdmin
82+
}}`,
83+
})
84+
.set("Accept", "application/json");
85+
firstUserLoginResponse = await request
86+
.post("/graphql")
87+
.send({
88+
query: `{ login(
89+
email: "abc1@email.com"
90+
password: "password"
91+
) {
92+
name {
93+
firstName
94+
lastName
95+
}
96+
token
97+
} }`,
98+
})
99+
.set("Accept", "application/json");
100+
firstUserToken = firstUserLoginResponse.body.data.login.token;
101+
categoryResponse = await request
102+
.post("/graphql")
103+
.send({
104+
query: `mutation{ createCategory(
105+
categoryInput: {
106+
name: "Test Category"
107+
description: "Lorem Ipsum"
108+
}
109+
) {
110+
_id
111+
name
112+
description
113+
createdBy
114+
}}`,
115+
})
116+
.set("Accept", "application/json")
117+
.set("Authorization", `Bearer ${firstUserToken}`);
118+
topicResponse = await request
119+
.post("/graphql")
120+
.send({
121+
query: `mutation{ createTopic(
122+
topicInput: {
123+
name: "Test Topic"
124+
description: "Lorem Ipsum"
125+
parentCategory: "${categoryResponse.body.data.createCategory._id}"
126+
}
127+
) {
128+
_id
129+
name
130+
description
131+
createdBy
132+
parentCategory
133+
}}`,
134+
})
135+
.set("Accept", "application/json")
136+
.set("Authorization", `Bearer ${firstUserToken}`);
137+
await done();
138+
});
139+
140+
afterAll(async () => {
141+
await connection.close();
142+
await mongoose.connection.close();
143+
});
144+
145+
test("should not create a new message when user logged out", async () => {
146+
const response = await request
147+
.post("/graphql")
148+
.send({
149+
query: `mutation{ createMessage(
150+
messageInput: {
151+
description: "Lorem Ipsum"
152+
parentTopic: "${topicResponse.body.data.createTopic._id}"
153+
}
154+
) {
155+
_id
156+
}}`,
157+
})
158+
.set("Accept", "application/json");
159+
expect(response.type).toBe("application/json");
160+
expect(response.status).toBe(500);
161+
expect(response.body.errors[0].message).toBe(authenticationError);
162+
});
163+
164+
test("should create a new message when user logged in", async () => {
165+
const response = await request
166+
.post("/graphql")
167+
.send({
168+
query: `mutation{ createMessage(
169+
messageInput: {
170+
description: "Lorem Ipsum"
171+
parentTopic: "${topicResponse.body.data.createTopic._id}"
172+
}
173+
) {
174+
_id
175+
description
176+
parentTopic
177+
}}`,
178+
})
179+
.set("Accept", "application/json")
180+
.set("Authorization", `Bearer ${firstUserToken}`);
181+
expect(response.type).toBe("application/json");
182+
expect(response.status).toBe(200);
183+
messageId = response.body.data.createMessage._id;
184+
expect(response.body.data.createMessage.description).toBe("Lorem Ipsum");
185+
expect(response.body.data.createMessage.parentTopic).toEqual(
186+
topicResponse.body.data.createTopic._id
187+
);
188+
const topic = await Topic.findById(topicResponse.body.data.createTopic._id).lean();
189+
expect(topic.chats.length).toBe(1);
190+
});
191+
192+
test("should update a message with creator access", async () => {
193+
const response = await request
194+
.post("/graphql")
195+
.send({
196+
query: `mutation{ updateMessage(
197+
messageInput: {
198+
_id: "${messageId}"
199+
description: "Updated Lorem Ipsum"
200+
}
201+
) {
202+
description
203+
}}`,
204+
})
205+
.set("Accept", "application/json")
206+
.set("Authorization", `Bearer ${firstUserToken}`);
207+
expect(response.type).toBe("application/json");
208+
expect(response.status).toBe(200);
209+
expect(response.body.data.updateMessage.description).toBe("Updated Lorem Ipsum");
210+
});
211+
212+
test("should delete a message with admin/moderator/creator access", async () => {
213+
const response = await request
214+
.post("/graphql")
215+
.send({
216+
query: `mutation{ deleteMessage(
217+
messageFindInput: {
218+
_id: "${messageId}"
219+
}
220+
) {
221+
result
222+
}}`,
223+
})
224+
.set("Accept", "application/json")
225+
.set("Authorization", `Bearer ${firstUserToken}`);
226+
expect(response.type).toBe("application/json");
227+
expect(response.status).toBe(200);
228+
expect(response.body.data.deleteMessage.result).toBe(messageDeleteResult);
229+
const topic = await Topic.findById(
230+
topicResponse.body.data.createTopic._id
231+
).lean();
232+
expect(topic.chats.length).toBe(0);
233+
});
234+
235+
test("should pin a message with admin/moderator/creator access", async () => {
236+
const messageCreationResponse = await request
237+
.post("/graphql")
238+
.send({
239+
query: `mutation{ createMessage(
240+
messageInput: {
241+
description: "Lorem Ipsum"
242+
parentTopic: "${topicResponse.body.data.createTopic._id}"
243+
}
244+
) {
245+
_id
246+
description
247+
parentTopic
248+
}}`,
249+
})
250+
.set("Accept", "application/json")
251+
.set("Authorization", `Bearer ${firstUserToken}`);
252+
messageId = messageCreationResponse.body.data.createMessage._id;
253+
const response = await request
254+
.post("/graphql")
255+
.send({
256+
query: `mutation{ pinMessage(
257+
messageFindInput: {
258+
_id: "${messageId}"
259+
}
260+
) {
261+
result
262+
}}`,
263+
})
264+
.set("Accept", "application/json")
265+
.set("Authorization", `Bearer ${firstUserToken}`);
266+
expect(response.type).toBe("application/json");
267+
expect(response.status).toBe(200);
268+
expect(response.body.data.pinMessage.result).toBe(pinMessageResult);
269+
const message = await Message.findById(
270+
messageId
271+
).lean();
272+
expect(message.isPinned).toBe(true);
273+
});
274+
275+
test("should unpin a message with admin/moderator/creator access", async () => {
276+
const response = await request
277+
.post("/graphql")
278+
.send({
279+
query: `mutation{ unpinMessage(
280+
messageFindInput: {
281+
_id: "${messageId}"
282+
}
283+
) {
284+
result
285+
}}`,
286+
})
287+
.set("Accept", "application/json")
288+
.set("Authorization", `Bearer ${firstUserToken}`);
289+
expect(response.type).toBe("application/json");
290+
expect(response.status).toBe(200);
291+
expect(response.body.data.unpinMessage.result).toBe(unpinMessageResult);
292+
const message = await Message.findById(messageId).lean();
293+
expect(message.isPinned).toBe(false);
294+
});
295+
296+
test("should announce a message with admin/moderator access", async () => {
297+
const response = await request
298+
.post("/graphql")
299+
.send({
300+
query: `mutation{ announceMessage(
301+
messageFindInput: {
302+
_id: "${messageId}"
303+
}
304+
) {
305+
result
306+
}}`,
307+
})
308+
.set("Accept", "application/json")
309+
.set("Authorization", `Bearer ${firstUserToken}`);
310+
expect(response.type).toBe("application/json");
311+
expect(response.status).toBe(200);
312+
expect(response.body.data.announceMessage.result).toBe(messageAnnouncementResult);
313+
const message = await Message.findById(messageId).lean();
314+
expect(message.isAnnounced).toBe(true);
315+
});
316+
317+
test("should remove message from announcement with admin/moderator access", async () => {
318+
const response = await request
319+
.post("/graphql")
320+
.send({
321+
query: `mutation{ removeAnnouncement(
322+
messageFindInput: {
323+
_id: "${messageId}"
324+
}
325+
) {
326+
result
327+
}}`,
328+
})
329+
.set("Accept", "application/json")
330+
.set("Authorization", `Bearer ${firstUserToken}`);
331+
expect(response.type).toBe("application/json");
332+
expect(response.status).toBe(200);
333+
expect(response.body.data.removeAnnouncement.result).toBe(
334+
removeAnnouncementResult
335+
);
336+
const message = await Message.findById(messageId).lean();
337+
expect(message.isAnnounced).toBe(false);
338+
});

0 commit comments

Comments
 (0)