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