@@ -11,13 +11,23 @@ import addUser from "../utils/addUser";
1111import * as impersonationModel from "../../models/impersonationRequests" ;
1212import * as validationService from "../../services/impersonationRequests" ;
1313import { CreateImpersonationRequestBody , ImpersonationRequest } from "../../types/impersonationRequest" ;
14- import { REQUEST_CREATED_SUCCESSFULLY , REQUEST_DOES_NOT_EXIST , REQUEST_STATE } from "../../constants/requests" ;
14+ import {
15+ REQUEST_CREATED_SUCCESSFULLY ,
16+ REQUEST_ALREADY_APPROVED ,
17+ REQUEST_ALREADY_REJECTED ,
18+ REQUEST_APPROVED_SUCCESSFULLY ,
19+ REQUEST_DOES_NOT_EXIST ,
20+ REQUEST_REJECTED_SUCCESSFULLY ,
21+ REQUEST_STATE ,
22+ UNAUTHORIZED_TO_UPDATE_REQUEST
23+ } from "../../constants/requests" ;
1524import { impersonationRequestsBodyData } from "../fixtures/impersonation-requests/impersonationRequests" ;
1625
1726const { expect } = chai ;
27+ chai . use ( chaiHttp ) ;
28+
1829const cookieName = config . get ( "userToken.cookieName" ) ;
1930const userData = userDataFixture ( ) ;
20- chai . use ( chaiHttp ) ;
2131
2232let authToken : string ;
2333let superUserToken : string ;
@@ -30,6 +40,7 @@ let testUserId5: string;
3040let testSuperUserId : string ;
3141let impersonationRequestBody : CreateImpersonationRequestBody ;
3242let impersonationRequest1 : ImpersonationRequest ;
43+ let impersonationRequest2 : ImpersonationRequest ;
3344
3445describe ( "Impersonation Requests" , ( ) => {
3546 requestsEndpoint = "/impersonation/requests?dev=true" ;
@@ -65,7 +76,7 @@ describe("Impersonation Requests", () => {
6576 createdBy : userData [ 4 ] . username
6677 } ) ;
6778
68- await impersonationModel . createImpersonationRequest ( {
79+ impersonationRequest2 = await impersonationModel . createImpersonationRequest ( {
6980 ...impersonationRequestsBodyData [ 0 ] ,
7081 impersonatedUserId : testUserId3 ,
7182 createdFor : userData [ 12 ] . username ,
@@ -79,8 +90,8 @@ describe("Impersonation Requests", () => {
7990 } ) ;
8091
8192 afterEach ( async ( ) => {
82- sinon . restore ( ) ;
8393 await cleanDb ( ) ;
94+ sinon . restore ( ) ;
8495 } ) ;
8596
8697 describe ( "POST /impersonation/requests" , ( ) => {
@@ -578,6 +589,233 @@ describe("Impersonation Requests", () => {
578589 done ( ) ;
579590 } ) ;
580591 } ) ;
592+ } ) ;
593+
594+ describe ( "PATCH /impersonation/requests/:id" , function ( ) {
595+ let rejectedRequest ;
596+ let impersonationRequest3 ;
597+
598+ beforeEach ( async ( ) => {
599+ impersonationRequest1 = await impersonationModel . createImpersonationRequest ( {
600+ ...impersonationRequestsBodyData [ 0 ] ,
601+ impersonatedUserId : testUserId1 ,
602+ createdBy : userData [ 16 ] . username ,
603+ status : REQUEST_STATE . APPROVED
604+ } ) ;
605+
606+ impersonationRequest2 = await impersonationModel . createImpersonationRequest ( {
607+ ...impersonationRequestsBodyData [ 1 ] ,
608+ impersonatedUserId : testUserId3 ,
609+ createdFor : userData [ 12 ] . username
610+ } ) ;
611+
612+ impersonationRequest3 = await impersonationModel . createImpersonationRequest ( {
613+ ...impersonationRequestsBodyData [ 2 ] ,
614+ impersonatedUserId : testUserId4
615+ } ) ;
616+
617+ rejectedRequest = await impersonationModel . createImpersonationRequest ( {
618+ ...impersonationRequestsBodyData [ 3 ] ,
619+ impersonatedUserId : testUserId1 ,
620+ status : REQUEST_STATE . REJECTED
621+ } ) ;
622+ } ) ;
623+
624+ it ( "should return 404 and 'Route not found' message when dev is false" , function ( done ) {
625+ chai
626+ . request ( app )
627+ . patch ( `/impersonation/requests/${ impersonationRequest1 . id } ?dev=false` )
628+ . send ( { status :"APPROVED" } )
629+ . set ( "cookie" , `${ cookieName } =${ authToken } ` )
630+ . end ( function ( err , res ) {
631+ if ( err ) return done ( err ) ;
632+ try {
633+ expect ( res . statusCode ) . to . equal ( 404 ) ;
634+ expect ( res . body . message ) . to . equal ( "Route not found" ) ;
635+ done ( ) ;
636+ } catch ( e ) {
637+ done ( e ) ;
638+ }
639+ } ) ;
640+ } ) ;
641+
642+ it ( "should return 404 and 'Route not found' message when dev is missing" , function ( done ) {
643+ chai
644+ . request ( app )
645+ . patch ( `/impersonation/requests/${ impersonationRequest1 . id } ` )
646+ . send ( { status :"APPROVED" } )
647+ . set ( "cookie" , `${ cookieName } =${ authToken } ` )
648+ . end ( function ( err , res ) {
649+ if ( err ) return done ( err ) ;
650+ try {
651+ expect ( res . statusCode ) . to . equal ( 404 ) ;
652+ expect ( res . body . message ) . to . equal ( "Route not found" ) ;
653+ done ( ) ;
654+ } catch ( e ) {
655+ done ( e ) ;
656+ }
657+ } ) ;
658+ } ) ;
659+
660+ it ( "should update a request status to APPROVED if dev flag is present" , function ( done ) {
661+ const tempAuthToken = authService . generateAuthToken ( { userId : testUserId3 } ) ;
662+ chai
663+ . request ( app )
664+ . patch ( `/impersonation/requests/${ impersonationRequest2 . id } ?dev=true` )
665+ . send ( { status :"APPROVED" } )
666+ . set ( "cookie" , `${ cookieName } =${ tempAuthToken } ` )
667+ . end ( function ( err , res ) {
668+ if ( err ) return done ( err ) ;
669+ expect ( res . statusCode ) . to . equal ( 200 ) ;
670+ expect ( res . body . message ) . to . equal ( REQUEST_APPROVED_SUCCESSFULLY ) ;
671+ expect ( res . body . data . id ) . to . equal ( impersonationRequest2 . id ) ;
672+ expect ( res . body . data . lastModifiedBy ) . to . equal ( impersonationRequest2 . impersonatedUserId ) ;
673+ done ( ) ;
674+ } ) ;
675+ } ) ;
676+
677+ it ( "should update a request status to REJECTED if dev flag is present" , function ( done ) {
678+ const tempAuthToken = authService . generateAuthToken ( { userId : testUserId4 } ) ;
679+ chai
680+ . request ( app )
681+ . patch ( `/impersonation/requests/${ impersonationRequest3 . id } ?dev=true` )
682+ . send ( { status :"REJECTED" } )
683+ . set ( "cookie" , `${ cookieName } =${ tempAuthToken } ` )
684+ . end ( function ( err , res ) {
685+ if ( err ) return done ( err ) ;
686+ expect ( res . statusCode ) . to . equal ( 200 ) ;
687+ expect ( res . body . message ) . to . equal ( REQUEST_REJECTED_SUCCESSFULLY ) ;
688+ expect ( res . body . data . id ) . to . equal ( impersonationRequest3 . id ) ;
689+ expect ( res . body . data . lastModifiedBy ) . to . equal ( impersonationRequest3 . impersonatedUserId ) ;
690+ done ( ) ;
691+ } ) ;
692+ } ) ;
693+
694+ it ( "should return 401 if user is not logged in" , function ( done ) {
695+ chai
696+ . request ( app )
697+ . patch ( `/impersonation/requests/${ impersonationRequest2 . id } ?dev=true` )
698+ . send ( { status :"APPROVED" } )
699+ . end ( function ( err , res ) {
700+ if ( err ) return done ( err ) ;
701+ try {
702+ expect ( res ) . to . have . status ( 401 ) ;
703+ expect ( res . body . error ) . to . equal ( "Unauthorized" ) ;
704+ expect ( res . body . message ) . to . equal ( "Unauthenticated User" ) ;
705+ done ( ) ;
706+ } catch ( e ) {
707+ done ( e ) ;
708+ }
709+ } ) ;
710+ } ) ;
711+
712+ it ( "should return NotFound Error if request does not exist" , function ( done ) {
713+ chai
714+ . request ( app )
715+ . patch ( `/impersonation/requests/randomId?dev=true` )
716+ . send ( { status :"APPROVED" } )
717+ . set ( "cookie" , `${ cookieName } =${ authToken } ` )
718+ . end ( function ( err , res ) {
719+ if ( err ) return done ( err ) ;
720+ expect ( res ) . to . have . status ( 404 ) ;
721+ expect ( res . body . error ) . to . equal ( "Not Found" ) ;
722+ expect ( res . body . message ) . to . equal ( REQUEST_DOES_NOT_EXIST ) ;
723+ done ( ) ;
724+ } ) ;
725+ } ) ;
726+
727+
728+ it ( "should return 403 Forbidden if a request is already approved" , function ( done ) {
729+ const tempAuthToken = authService . generateAuthToken ( { userId : testUserId1 } ) ;
730+ chai
731+ . request ( app )
732+ . patch ( `/impersonation/requests/${ impersonationRequest1 . id } ?dev=true` )
733+ . set ( "cookie" , `${ cookieName } =${ tempAuthToken } ` )
734+ . send ( { status :"APPROVED" } )
735+ . end ( function ( err , res ) {
736+ if ( err ) return done ( err ) ;
737+ expect ( res ) . to . have . status ( 403 ) ;
738+ expect ( res . body . error ) . to . equal ( "Forbidden" ) ;
739+ expect ( res . body . message ) . to . equal ( "You are not allowed for this Operation at the moment" ) ;
740+ done ( ) ;
741+ } ) ;
742+ } ) ;
743+
744+ it ( "should return 403 Forbidden if a request is already rejected" , function ( done ) {
745+ chai
746+ . request ( app )
747+ . patch ( `/impersonation/requests/${ rejectedRequest . id } ?dev=true` )
748+ . set ( "cookie" , `${ cookieName } =${ authToken } ` )
749+ . send ( { status :"REJECTED" } )
750+ . end ( function ( err , res ) {
751+ if ( err ) return done ( err ) ;
752+ expect ( res ) . to . have . status ( 403 ) ;
753+ expect ( res . body . error ) . to . equal ( "Forbidden" ) ;
754+ expect ( res . body . message ) . to . equal ( "You are not allowed for this Operation at the moment" ) ;
755+ done ( ) ;
756+ } ) ;
757+ } ) ;
758+
759+ it ( "should throw 403 Forbidden if unauthorized user tries to update the request" , function ( done ) {
760+ chai
761+ . request ( app )
762+ . patch ( `/impersonation/requests/${ impersonationRequest3 . id } ?dev=true` )
763+ . send ( { status : "APPROVED" } )
764+ . set ( "cookie" , `${ cookieName } =${ authToken } ` )
765+ . end ( function ( err , res ) {
766+ if ( err ) return done ( err ) ;
767+ expect ( res ) . to . have . status ( 403 ) ;
768+ expect ( res . body . error ) . to . equal ( "Forbidden" ) ;
769+ expect ( res . body . message ) . to . equal ( "You are not allowed for this Operation at the moment" ) ;
770+ done ( ) ;
771+ } ) ;
772+ } ) ;
773+
774+ it ( "should return 400 if status is not provided" , function ( done ) {
775+ chai
776+ . request ( app )
777+ . patch ( `/impersonation/requests/${ impersonationRequest1 . id } ?dev=true` )
778+ . set ( "cookie" , `${ cookieName } =${ authToken } ` )
779+ . send ( { status : "" } )
780+ . end ( function ( err , res ) {
781+ if ( err ) return done ( err ) ;
782+ expect ( res ) . to . have . status ( 400 ) ;
783+ expect ( res . body . error ) . to . equal ( "Bad Request" ) ;
784+ expect ( res . body . message ) . to . equal ( `status must be APPROVED or REJECTED,"status" is not allowed to be empty` ) ;
785+ done ( ) ;
786+ } ) ;
787+ } ) ;
788+
789+ it ( "should return 400 if status is not APPROVED/REJECTED" , function ( done ) {
790+ chai
791+ . request ( app )
792+ . patch ( `/impersonation/requests/${ impersonationRequest1 . id } ?dev=true` )
793+ . set ( "cookie" , `${ cookieName } =${ authToken } ` )
794+ . send ( { status : "ACTIVE" } )
795+ . end ( function ( err , res ) {
796+ if ( err ) return done ( err ) ;
797+ expect ( res ) . to . have . status ( 400 ) ;
798+ expect ( res . body . error ) . to . equal ( "Bad Request" ) ;
799+ expect ( res . body . message ) . to . equal ( `status must be APPROVED or REJECTED` ) ;
800+ done ( ) ;
801+ } ) ;
802+ } ) ;
581803
582- } )
804+ it ( "should return 500 if Firestore fails during updateImpersonationRequest (service catch block)" , function ( done ) {
805+ const tempAuthToken = authService . generateAuthToken ( { userId : testUserId4 } ) ;
806+ sinon . stub ( impersonationModel , "updateImpersonationRequest" ) . throws ( new Error ( "Firestore error" ) ) ;
807+ chai
808+ . request ( app )
809+ . patch ( `/impersonation/requests/${ impersonationRequest3 . id } ?dev=true` )
810+ . set ( "cookie" , `${ cookieName } =${ tempAuthToken } ` )
811+ . send ( { status : "APPROVED" } )
812+ . end ( function ( err , res ) {
813+ if ( err ) return done ( err ) ;
814+ expect ( res ) . to . have . status ( 500 ) ;
815+ expect ( res . body . message ) . to . equal ( "An internal server error occurred" ) ;
816+ sinon . restore ( ) ;
817+ done ( ) ;
818+ } ) ;
819+ } ) ;
820+ } ) ;
583821} ) ;
0 commit comments