@@ -11,13 +11,23 @@ import addUser from "../utils/addUser";
11
11
import * as impersonationModel from "../../models/impersonationRequests" ;
12
12
import * as validationService from "../../services/impersonationRequests" ;
13
13
import { 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" ;
15
24
import { impersonationRequestsBodyData } from "../fixtures/impersonation-requests/impersonationRequests" ;
16
25
17
26
const { expect } = chai ;
27
+ chai . use ( chaiHttp ) ;
28
+
18
29
const cookieName = config . get ( "userToken.cookieName" ) ;
19
30
const userData = userDataFixture ( ) ;
20
- chai . use ( chaiHttp ) ;
21
31
22
32
let authToken : string ;
23
33
let superUserToken : string ;
@@ -30,6 +40,7 @@ let testUserId5: string;
30
40
let testSuperUserId : string ;
31
41
let impersonationRequestBody : CreateImpersonationRequestBody ;
32
42
let impersonationRequest1 : ImpersonationRequest ;
43
+ let impersonationRequest2 : ImpersonationRequest ;
33
44
34
45
describe ( "Impersonation Requests" , ( ) => {
35
46
requestsEndpoint = "/impersonation/requests?dev=true" ;
@@ -65,7 +76,7 @@ describe("Impersonation Requests", () => {
65
76
createdBy : userData [ 4 ] . username
66
77
} ) ;
67
78
68
- await impersonationModel . createImpersonationRequest ( {
79
+ impersonationRequest2 = await impersonationModel . createImpersonationRequest ( {
69
80
...impersonationRequestsBodyData [ 0 ] ,
70
81
impersonatedUserId : testUserId3 ,
71
82
createdFor : userData [ 12 ] . username ,
@@ -79,8 +90,8 @@ describe("Impersonation Requests", () => {
79
90
} ) ;
80
91
81
92
afterEach ( async ( ) => {
82
- sinon . restore ( ) ;
83
93
await cleanDb ( ) ;
94
+ sinon . restore ( ) ;
84
95
} ) ;
85
96
86
97
describe ( "POST /impersonation/requests" , ( ) => {
@@ -578,6 +589,233 @@ describe("Impersonation Requests", () => {
578
589
done ( ) ;
579
590
} ) ;
580
591
} ) ;
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
+ } ) ;
581
803
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
+ } ) ;
583
821
} ) ;
0 commit comments