Skip to content

Commit e09ed36

Browse files
committed
feat:added tests for controller
1 parent ae1bb30 commit e09ed36

File tree

1 file changed

+292
-0
lines changed

1 file changed

+292
-0
lines changed
Lines changed: 292 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,292 @@
1+
import addUser from "../utils/addUser";
2+
import chai from "chai";
3+
const { expect } = chai;
4+
import userDataFixture from "../fixtures/user/user";
5+
import sinon from "sinon";
6+
import chaiHttp from "chai-http";
7+
import cleanDb from "../utils/cleanDb";
8+
import { CreateOnboardingExtensionBody } from "../../types/onboardingExtension";
9+
import { REQUEST_ALREADY_PENDING, REQUEST_STATE, REQUEST_TYPE } from "../../constants/requests";
10+
const { generateToken } = require("../../test/utils/generateBotToken");
11+
import app from "../../server";
12+
import { createUserStatusWithState } from "../../utils/userStatus";
13+
const firestore = require("../../utils/firestore");
14+
const userStatusModel = firestore.collection("usersStatus");
15+
import * as requestsQuery from "../../models/requests"
16+
import { userState } from "../../constants/userStatus";
17+
const { CLOUDFLARE_WORKER, BAD_TOKEN } = require("../../constants/bot");
18+
const userData = userDataFixture();
19+
chai.use(chaiHttp);
20+
21+
describe("/requests Onboarding Extension", () => {
22+
describe("POST /requests", () => {
23+
let testUserId: string;
24+
const testUserDiscordId = "654321";
25+
const testSuperUserDiscordId = "123456";
26+
const extensionRequest = {
27+
state: REQUEST_STATE.APPROVED,
28+
type: REQUEST_TYPE.ONBOARDING,
29+
requestNumber: 1
30+
};
31+
const postEndpoint = "/requests";
32+
const botToken = generateToken({name: CLOUDFLARE_WORKER})
33+
const body: CreateOnboardingExtensionBody = {
34+
type: REQUEST_TYPE.ONBOARDING,
35+
numberOfDays: 5,
36+
reason: "This is the reason",
37+
requestedBy: testUserDiscordId,
38+
userId: testUserDiscordId,
39+
};
40+
41+
beforeEach(async () => {
42+
await addUser({...userData[4], discordId: testSuperUserDiscordId});
43+
testUserId = await addUser({...userData[6], discordId: testUserDiscordId, discordJoinedAt: "2023-04-06T01:47:34.488000+00:00"});
44+
})
45+
afterEach(async ()=>{
46+
sinon.restore();
47+
await cleanDb();
48+
})
49+
50+
it("should return Feature not implemented when dev is not true", (done) => {
51+
chai.request(app)
52+
.post(`${postEndpoint}`)
53+
.send(body)
54+
.end((err, res)=>{
55+
if (err) return done(err);
56+
expect(res.statusCode).to.equal(501);
57+
expect(res.body.message).to.equal("Feature not implemented");
58+
done();
59+
})
60+
})
61+
62+
it("should return Invalid Request when authorization header is missing", (done) => {
63+
chai
64+
.request(app)
65+
.post(`${postEndpoint}?dev=true`)
66+
.set("authorization", "")
67+
.send(body)
68+
.end((err, res) => {
69+
if (err) return done(err);
70+
expect(res.statusCode).to.equal(400);
71+
expect(res.body.message).to.equal("Invalid Request");
72+
done();
73+
})
74+
})
75+
76+
it("should return Unauthorized Bot for invalid token", (done) => {
77+
chai.request(app)
78+
.post(`${postEndpoint}?dev=true`)
79+
.set("authorization", `Bearer ${BAD_TOKEN}`)
80+
.send(body)
81+
.end((err, res) => {
82+
if (err) return done(err);
83+
expect(res.statusCode).to.equal(401);
84+
expect(res.body.message).to.equal("Unauthorized Bot");
85+
done();
86+
})
87+
})
88+
89+
it("should return 400 response for invalid value type of numberOfDays", (done) => {
90+
chai.request(app)
91+
.post(`${postEndpoint}?dev=true`)
92+
.set("authorization", `Bearer ${botToken}`)
93+
.send({...body, numberOfDays:"1"})
94+
.end((err, res) => {
95+
if (err) return done(err);
96+
expect(res.statusCode).to.equal(400);
97+
expect(res.body.message).to.equal("numberOfDays must be a number");
98+
expect(res.body.error).to.equal("Bad Request");
99+
done();
100+
})
101+
})
102+
103+
it("should return 400 response for invalid value of numberOfDays", (done) => {
104+
chai.request(app)
105+
.post(`${postEndpoint}?dev=true`)
106+
.set("authorization", `Bearer ${botToken}`)
107+
.send({...body, numberOfDays:1.4})
108+
.end((err, res) => {
109+
if (err) return done(err);
110+
expect(res.statusCode).to.equal(400);
111+
expect(res.body.message).to.equal("numberOfDays must be a integer");
112+
expect(res.body.error).to.equal("Bad Request");
113+
done();
114+
})
115+
})
116+
117+
it("should return 400 response for invalid userId", (done) => {
118+
chai.request(app)
119+
.post(`${postEndpoint}?dev=true`)
120+
.set("authorization", `Bearer ${botToken}`)
121+
.send({...body, userId: undefined})
122+
.end((err, res) => {
123+
if (err) return done(err);
124+
expect(res.statusCode).to.equal(400);
125+
expect(res.body.message).to.equal("userId is required");
126+
expect(res.body.error).to.equal("Bad Request");
127+
done();
128+
})
129+
})
130+
131+
it("should return 500 response when fails to create extension request", (done) => {
132+
createUserStatusWithState(testUserId, userStatusModel, userState.ONBOARDING);
133+
sinon.stub(requestsQuery, "createRequest")
134+
.throws("Error while creating extension request");
135+
chai.request(app)
136+
.post(`${postEndpoint}?dev=true`)
137+
.set("authorization", `Bearer ${botToken}`)
138+
.send(body)
139+
.end((err, res)=>{
140+
if (err) return done(err);
141+
expect(res.statusCode).to.equal(500);
142+
expect(res.body.message).to.equal("An internal server error occurred");
143+
done();
144+
})
145+
})
146+
147+
it("should return 404 response when user does not exist", (done) => {
148+
chai.request(app)
149+
.post(`${postEndpoint}?dev=true`)
150+
.set("authorization", `Bearer ${botToken}`)
151+
.send({...body, userId: "11111"})
152+
.end((err, res) => {
153+
if (err) return done(err);
154+
expect(res.statusCode).to.equal(404);
155+
expect(res.body.error).to.equal("Not Found");
156+
expect(res.body.message).to.equal("User not found");
157+
done();
158+
})
159+
})
160+
161+
it("should return 400 response when user's status is not onboarding", (done)=> {
162+
createUserStatusWithState(testUserId, userStatusModel, userState.ACTIVE);
163+
chai.request(app)
164+
.post(`${postEndpoint}?dev=true`)
165+
.set("authorization", `Bearer ${botToken}`)
166+
.send(body)
167+
.end((err, res) => {
168+
if (err) return done(err);
169+
expect(res.statusCode).to.equal(400);
170+
expect(res.body.error).to.equal("Bad Request");
171+
expect(res.body.message).to.equal("User does not have onboarding status");
172+
done();
173+
})
174+
})
175+
176+
it("should return 404 response when requested-user does not exist", (done) => {
177+
createUserStatusWithState(testUserId, userStatusModel, userState.ONBOARDING);
178+
chai.request(app)
179+
.post(`${postEndpoint}?dev=true`)
180+
.set("authorization", `Bearer ${botToken}`)
181+
.send({...body, requestedBy: "11111"})
182+
.end((err, res) => {
183+
if (err) return done(err);
184+
expect(res.statusCode).to.equal(404);
185+
expect(res.body.error).to.equal("Not Found");
186+
expect(res.body.message).to.equal("User not found");
187+
done();
188+
})
189+
})
190+
191+
it("should return 400 response when a user already has a pending request", (done)=> {
192+
createUserStatusWithState(testUserId, userStatusModel, userState.ONBOARDING);
193+
requestsQuery.createRequest({...extensionRequest, state: REQUEST_STATE.PENDING, userId: testUserId});
194+
195+
chai.request(app)
196+
.post(`${postEndpoint}?dev=true`)
197+
.set("authorization", `Bearer ${botToken}`)
198+
.send(body)
199+
.end((err, res) => {
200+
if (err) return done(err);
201+
expect(res.statusCode).to.equal(400);
202+
expect(res.body.error).to.equal("Bad Request");
203+
expect(res.body.message).to.equal(REQUEST_ALREADY_PENDING);
204+
done();
205+
})
206+
})
207+
208+
it("should return 201 for successful response when user and requestedUser are same and has onboarding status", (done)=> {
209+
createUserStatusWithState(testUserId, userStatusModel, userState.ONBOARDING);
210+
chai.request(app)
211+
.post(`${postEndpoint}?dev=true`)
212+
.set("authorization", `Bearer ${botToken}`)
213+
.send(body)
214+
.end((err, res) => {
215+
if (err) return done(err);
216+
expect(res.statusCode).to.equal(201);
217+
expect(res.body.message).to.equal("Onboarding extension request created successfully!");
218+
expect(res.body.data.requestNumber).to.equal(1);
219+
expect(res.body.data.reason).to.equal(body.reason);
220+
expect(res.body.data.state).to.equal(REQUEST_STATE.PENDING)
221+
done();
222+
})
223+
})
224+
225+
it("should return 201 for successful response when requested-user is a super-user and user has onboarding status", (done)=> {
226+
createUserStatusWithState(testUserId, userStatusModel, userState.ONBOARDING);
227+
chai.request(app)
228+
.post(`${postEndpoint}?dev=true`)
229+
.set("authorization", `Bearer ${botToken}`)
230+
.send({
231+
...body,
232+
requestedBy: testSuperUserDiscordId
233+
})
234+
.end((err, res) => {
235+
if (err) return done(err);
236+
expect(res.statusCode).to.equal(201);
237+
expect(res.body.message).to.equal("Onboarding extension request created successfully!");
238+
expect(res.body.data.requestNumber).to.equal(1);
239+
expect(res.body.data.reason).to.equal(body.reason);
240+
expect(res.body.data.state).to.equal(REQUEST_STATE.PENDING)
241+
done();
242+
})
243+
})
244+
245+
it("should return 201 response when latest extension request is approved", async () => {
246+
createUserStatusWithState(testUserId, userStatusModel, userState.ONBOARDING);
247+
const latestApprovedExtension = await requestsQuery.createRequest({
248+
...extensionRequest,
249+
userId: testUserId,
250+
state: REQUEST_STATE.APPROVED,
251+
newEndsOn: Date.now(),
252+
oldEndsOn: Date.now() - 24*60*60*1000,
253+
});
254+
255+
const res = await chai.request(app)
256+
.post(`${postEndpoint}?dev=true`)
257+
.set("authorization", `Bearer ${botToken}`)
258+
.send(body);
259+
260+
expect(res.statusCode).to.equal(201);
261+
expect(res.body.message).to.equal("Onboarding extension request created successfully!");
262+
expect(res.body.data.requestNumber).to.equal(2);
263+
expect(res.body.data.reason).to.equal(body.reason);
264+
expect(res.body.data.state).to.equal(REQUEST_STATE.PENDING);
265+
expect(res.body.data.oldEndsOn).to.equal(latestApprovedExtension.newEndsOn);
266+
expect(res.body.data.newEndsOn).to.equal(latestApprovedExtension.newEndsOn + (body.numberOfDays*24*60*60*1000));
267+
})
268+
269+
it("should return 201 response when latest extension request is rejected", async () => {
270+
createUserStatusWithState(testUserId, userStatusModel, userState.ONBOARDING);
271+
const latestRejectedExtension = await requestsQuery.createRequest({
272+
...extensionRequest,
273+
state: REQUEST_STATE.REJECTED,
274+
userId: testUserId,
275+
newEndsOn: Date.now(),
276+
oldEndsOn: Date.now() - 24*60*60*1000,
277+
});
278+
const res = await chai.request(app)
279+
.post(`${postEndpoint}?dev=true`)
280+
.set("authorization", `Bearer ${botToken}`)
281+
.send(body)
282+
283+
expect(res.statusCode).to.equal(201);
284+
expect(res.body.message).to.equal("Onboarding extension request created successfully!");
285+
expect(res.body.data.requestNumber).to.equal(2);
286+
expect(res.body.data.reason).to.equal(body.reason);;
287+
expect(res.body.data.state).to.equal(REQUEST_STATE.PENDING);
288+
expect(res.body.data.oldEndsOn).to.equal(latestRejectedExtension.oldEndsOn);
289+
expect(res.body.data.newEndsOn).to.equal(latestRejectedExtension.oldEndsOn + (body.numberOfDays*24*60*60*1000));
290+
})
291+
})
292+
});

0 commit comments

Comments
 (0)