@@ -39,9 +39,13 @@ let testUserId3: string;
39
39
let testUserId4 : string ;
40
40
let testUserId5 : string ;
41
41
let testSuperUserId : string ;
42
+ let tempAuthToken : string ;
42
43
let impersonationRequestBody : CreateImpersonationRequestBody ;
43
- let impersonationRequest1 : ImpersonationRequest ;
44
- let impersonationRequest2 : ImpersonationRequest ;
44
+ let unapprovedImpersonationRequest : ImpersonationRequest ;
45
+ let rejectedRequest : ImpersonationRequest ;
46
+ let unapprovedImpersonationRequest2 : ImpersonationRequest ;
47
+ let approvedImpersonationRequest : ImpersonationRequest ;
48
+ let finishedImpersonationRequest : ImpersonationRequest ;
45
49
46
50
describe ( "Impersonation Requests" , ( ) => {
47
51
requestsEndpoint = "/impersonation/requests?dev=true" ;
@@ -69,15 +73,15 @@ describe("Impersonation Requests", () => {
69
73
reason : "User assistance required for account debugging."
70
74
} ;
71
75
72
- impersonationRequest1 = await impersonationModel . createImpersonationRequest ( {
76
+ unapprovedImpersonationRequest = await impersonationModel . createImpersonationRequest ( {
73
77
...impersonationRequestsBodyData [ 0 ] ,
74
78
impersonatedUserId : testUserId2 ,
75
79
createdFor : userData [ 19 ] . username ,
76
80
userId : testSuperUserId ,
77
81
createdBy : userData [ 4 ] . username
78
82
} ) ;
79
83
80
- impersonationRequest2 = await impersonationModel . createImpersonationRequest ( {
84
+ approvedImpersonationRequest = await impersonationModel . createImpersonationRequest ( {
81
85
...impersonationRequestsBodyData [ 0 ] ,
82
86
impersonatedUserId : testUserId3 ,
83
87
createdFor : userData [ 12 ] . username ,
@@ -554,13 +558,13 @@ describe("Impersonation Requests", () => {
554
558
it ( "should return request by specific ID" , function ( done ) {
555
559
chai
556
560
. request ( app )
557
- . get ( `/impersonation/requests/${ impersonationRequest1 . id } ?dev=true` )
561
+ . get ( `/impersonation/requests/${ unapprovedImpersonationRequest . id } ?dev=true` )
558
562
. set ( "cookie" , `${ cookieName } =${ authToken } ` )
559
563
. end ( function ( err , res ) {
560
564
if ( err ) return done ( err ) ;
561
565
expect ( res ) . to . have . status ( 200 ) ;
562
566
expect ( res . body . data ) . to . be . an ( "object" ) ;
563
- expect ( res . body . data . id ) . to . equal ( impersonationRequest1 . id ) ;
567
+ expect ( res . body . data . id ) . to . equal ( unapprovedImpersonationRequest . id ) ;
564
568
done ( ) ;
565
569
} ) ;
566
570
} ) ;
@@ -593,24 +597,21 @@ describe("Impersonation Requests", () => {
593
597
} ) ;
594
598
595
599
describe ( "PATCH /impersonation/requests/:id" , function ( ) {
596
- let rejectedRequest ;
597
- let impersonationRequest3 ;
598
-
599
600
beforeEach ( async ( ) => {
600
- impersonationRequest1 = await impersonationModel . createImpersonationRequest ( {
601
+ approvedImpersonationRequest = await impersonationModel . createImpersonationRequest ( {
601
602
...impersonationRequestsBodyData [ 0 ] ,
602
603
impersonatedUserId : testUserId1 ,
603
604
createdBy : userData [ 16 ] . username ,
604
605
status : REQUEST_STATE . APPROVED
605
606
} ) ;
606
607
607
- impersonationRequest2 = await impersonationModel . createImpersonationRequest ( {
608
+ unapprovedImpersonationRequest = await impersonationModel . createImpersonationRequest ( {
608
609
...impersonationRequestsBodyData [ 1 ] ,
609
610
impersonatedUserId : testUserId3 ,
610
611
createdFor : userData [ 12 ] . username
611
612
} ) ;
612
613
613
- impersonationRequest3 = await impersonationModel . createImpersonationRequest ( {
614
+ unapprovedImpersonationRequest2 = await impersonationModel . createImpersonationRequest ( {
614
615
...impersonationRequestsBodyData [ 2 ] ,
615
616
impersonatedUserId : testUserId4
616
617
} ) ;
@@ -625,7 +626,7 @@ describe("Impersonation Requests", () => {
625
626
it ( "should return 404 and 'Route not found' message when dev is false" , function ( done ) {
626
627
chai
627
628
. request ( app )
628
- . patch ( `/impersonation/requests/${ impersonationRequest1 . id } ?dev=false` )
629
+ . patch ( `/impersonation/requests/${ unapprovedImpersonationRequest . id } ?dev=false` )
629
630
. send ( { status :"APPROVED" } )
630
631
. set ( "cookie" , `${ cookieName } =${ authToken } ` )
631
632
. end ( function ( err , res ) {
@@ -643,7 +644,7 @@ describe("Impersonation Requests", () => {
643
644
it ( "should return 404 and 'Route not found' message when dev is missing" , function ( done ) {
644
645
chai
645
646
. request ( app )
646
- . patch ( `/impersonation/requests/${ impersonationRequest1 . id } ` )
647
+ . patch ( `/impersonation/requests/${ unapprovedImpersonationRequest . id } ` )
647
648
. send ( { status :"APPROVED" } )
648
649
. set ( "cookie" , `${ cookieName } =${ authToken } ` )
649
650
. end ( function ( err , res ) {
@@ -662,15 +663,15 @@ describe("Impersonation Requests", () => {
662
663
const tempAuthToken = authService . generateAuthToken ( { userId : testUserId3 } ) ;
663
664
chai
664
665
. request ( app )
665
- . patch ( `/impersonation/requests/${ impersonationRequest2 . id } ?dev=true` )
666
+ . patch ( `/impersonation/requests/${ unapprovedImpersonationRequest . id } ?dev=true` )
666
667
. send ( { status :"APPROVED" } )
667
668
. set ( "cookie" , `${ cookieName } =${ tempAuthToken } ` )
668
669
. end ( function ( err , res ) {
669
670
if ( err ) return done ( err ) ;
670
671
expect ( res . statusCode ) . to . equal ( 200 ) ;
671
672
expect ( res . body . message ) . to . equal ( REQUEST_APPROVED_SUCCESSFULLY ) ;
672
- expect ( res . body . data . id ) . to . equal ( impersonationRequest2 . id ) ;
673
- expect ( res . body . data . lastModifiedBy ) . to . equal ( impersonationRequest2 . impersonatedUserId ) ;
673
+ expect ( res . body . data . id ) . to . equal ( unapprovedImpersonationRequest . id ) ;
674
+ expect ( res . body . data . lastModifiedBy ) . to . equal ( unapprovedImpersonationRequest . impersonatedUserId ) ;
674
675
done ( ) ;
675
676
} ) ;
676
677
} ) ;
@@ -679,23 +680,23 @@ describe("Impersonation Requests", () => {
679
680
const tempAuthToken = authService . generateAuthToken ( { userId : testUserId4 } ) ;
680
681
chai
681
682
. request ( app )
682
- . patch ( `/impersonation/requests/${ impersonationRequest3 . id } ?dev=true` )
683
+ . patch ( `/impersonation/requests/${ unapprovedImpersonationRequest2 . id } ?dev=true` )
683
684
. send ( { status :"REJECTED" } )
684
685
. set ( "cookie" , `${ cookieName } =${ tempAuthToken } ` )
685
686
. end ( function ( err , res ) {
686
687
if ( err ) return done ( err ) ;
687
688
expect ( res . statusCode ) . to . equal ( 200 ) ;
688
689
expect ( res . body . message ) . to . equal ( REQUEST_REJECTED_SUCCESSFULLY ) ;
689
- expect ( res . body . data . id ) . to . equal ( impersonationRequest3 . id ) ;
690
- expect ( res . body . data . lastModifiedBy ) . to . equal ( impersonationRequest3 . impersonatedUserId ) ;
690
+ expect ( res . body . data . id ) . to . equal ( unapprovedImpersonationRequest2 . id ) ;
691
+ expect ( res . body . data . lastModifiedBy ) . to . equal ( unapprovedImpersonationRequest2 . impersonatedUserId ) ;
691
692
done ( ) ;
692
693
} ) ;
693
694
} ) ;
694
695
695
696
it ( "should return 401 if user is not logged in" , function ( done ) {
696
697
chai
697
698
. request ( app )
698
- . patch ( `/impersonation/requests/${ impersonationRequest2 . id } ?dev=true` )
699
+ . patch ( `/impersonation/requests/${ unapprovedImpersonationRequest . id } ?dev=true` )
699
700
. send ( { status :"APPROVED" } )
700
701
. end ( function ( err , res ) {
701
702
if ( err ) return done ( err ) ;
@@ -730,7 +731,7 @@ describe("Impersonation Requests", () => {
730
731
const tempAuthToken = authService . generateAuthToken ( { userId : testUserId1 } ) ;
731
732
chai
732
733
. request ( app )
733
- . patch ( `/impersonation/requests/${ impersonationRequest1 . id } ?dev=true` )
734
+ . patch ( `/impersonation/requests/${ approvedImpersonationRequest . id } ?dev=true` )
734
735
. set ( "cookie" , `${ cookieName } =${ tempAuthToken } ` )
735
736
. send ( { status :"APPROVED" } )
736
737
. end ( function ( err , res ) {
@@ -760,7 +761,7 @@ describe("Impersonation Requests", () => {
760
761
it ( "should throw 403 Forbidden if unauthorized user tries to update the request" , function ( done ) {
761
762
chai
762
763
. request ( app )
763
- . patch ( `/impersonation/requests/${ impersonationRequest3 . id } ?dev=true` )
764
+ . patch ( `/impersonation/requests/${ unapprovedImpersonationRequest2 . id } ?dev=true` )
764
765
. send ( { status : "APPROVED" } )
765
766
. set ( "cookie" , `${ cookieName } =${ authToken } ` )
766
767
. end ( function ( err , res ) {
@@ -775,7 +776,7 @@ describe("Impersonation Requests", () => {
775
776
it ( "should return 400 if status is not provided" , function ( done ) {
776
777
chai
777
778
. request ( app )
778
- . patch ( `/impersonation/requests/${ impersonationRequest1 . id } ?dev=true` )
779
+ . patch ( `/impersonation/requests/${ unapprovedImpersonationRequest . id } ?dev=true` )
779
780
. set ( "cookie" , `${ cookieName } =${ authToken } ` )
780
781
. send ( { status : "" } )
781
782
. end ( function ( err , res ) {
@@ -790,7 +791,7 @@ describe("Impersonation Requests", () => {
790
791
it ( "should return 400 if status is not APPROVED/REJECTED" , function ( done ) {
791
792
chai
792
793
. request ( app )
793
- . patch ( `/impersonation/requests/${ impersonationRequest1 . id } ?dev=true` )
794
+ . patch ( `/impersonation/requests/${ unapprovedImpersonationRequest . id } ?dev=true` )
794
795
. set ( "cookie" , `${ cookieName } =${ authToken } ` )
795
796
. send ( { status : "ACTIVE" } )
796
797
. end ( function ( err , res ) {
@@ -807,7 +808,7 @@ describe("Impersonation Requests", () => {
807
808
sinon . stub ( impersonationModel , "updateImpersonationRequest" ) . throws ( new Error ( "Firestore error" ) ) ;
808
809
chai
809
810
. request ( app )
810
- . patch ( `/impersonation/requests/${ impersonationRequest3 . id } ?dev=true` )
811
+ . patch ( `/impersonation/requests/${ unapprovedImpersonationRequest2 . id } ?dev=true` )
811
812
. set ( "cookie" , `${ cookieName } =${ tempAuthToken } ` )
812
813
. send ( { status : "APPROVED" } )
813
814
. end ( function ( err , res ) {
@@ -819,4 +820,191 @@ describe("Impersonation Requests", () => {
819
820
} ) ;
820
821
} ) ;
821
822
} ) ;
823
+ describe ( "PATCH /impersonation/:id" , function ( ) {
824
+ beforeEach ( async ( ) => {
825
+ tempAuthToken = authService . generateAuthToken ( { userId : testUserId3 } ) ;
826
+
827
+ finishedImpersonationRequest = await impersonationModel . createImpersonationRequest ( {
828
+ ...impersonationRequestsBodyData [ 0 ] ,
829
+ impersonatedUserId : testUserId4 ,
830
+ createdFor : userData [ 0 ] . username ,
831
+ userId : testSuperUserId ,
832
+ status : "APPROVED" ,
833
+ isImpersonationFinished : true ,
834
+ createdBy : userData [ 4 ] . username ,
835
+ } ) ;
836
+ } ) ;
837
+
838
+ it ( "should return 404 and 'Route not Found' message when dev is false" , function ( done ) {
839
+ chai
840
+ . request ( app )
841
+ . patch ( `/impersonation/${ unapprovedImpersonationRequest . id } ?dev=false&action=START` )
842
+ . set ( "cookie" , `${ cookieName } =${ authToken } ` )
843
+ . end ( function ( err , res ) {
844
+ if ( err ) return done ( err ) ;
845
+ expect ( res . statusCode ) . to . equal ( 404 ) ;
846
+ expect ( res . body . message ) . to . equal ( "Route not found" ) ;
847
+ done ( ) ;
848
+ } ) ;
849
+ } ) ;
850
+
851
+ it ( "should return 404 and 'Route not Found' message when dev is missing" , function ( done ) {
852
+ chai
853
+ . request ( app )
854
+ . patch ( `/impersonation/${ unapprovedImpersonationRequest . id } ` )
855
+ . set ( "cookie" , `${ cookieName } =${ authToken } ` )
856
+ . end ( function ( err , res ) {
857
+ if ( err ) return done ( err ) ;
858
+ expect ( res . statusCode ) . to . equal ( 404 ) ;
859
+ expect ( res . body . message ) . to . equal ( "Route not found" ) ;
860
+ done ( ) ;
861
+ } ) ;
862
+ } ) ;
863
+
864
+ it ( "should return 400 when action type is invalid (other than START, STOP)" , function ( done ) {
865
+ chai
866
+ . request ( app )
867
+ . patch ( `/impersonation/${ unapprovedImpersonationRequest . id } ?dev=true&action=ACTIVE` )
868
+ . set ( "cookie" , `${ cookieName } =${ superUserToken } ` )
869
+ . end ( function ( err , res ) {
870
+ if ( err ) return done ( err ) ;
871
+ expect ( res . statusCode ) . to . equal ( 400 ) ;
872
+ expect ( res . body . message ) . to . equal ( "action must be START or STOP" ) ;
873
+ done ( ) ;
874
+ } ) ;
875
+ } ) ;
876
+
877
+ it ( "should successfully start the impersonation when action is START" , function ( done ) {
878
+ chai
879
+ . request ( app )
880
+ . patch ( `/impersonation/${ approvedImpersonationRequest . id } ?dev=true&action=START` )
881
+ . send ( { status : "APPROVED" } )
882
+ . set ( "cookie" , `${ cookieName } =${ superUserToken } ` )
883
+ . end ( function ( err , res ) {
884
+ if ( err ) return done ( err ) ;
885
+ expect ( res . statusCode ) . to . equal ( 200 ) ;
886
+ expect ( res . body . message ) . to . equal ( "Impersonation session has started." ) ;
887
+ expect ( res . body . data . id ) . to . equal ( approvedImpersonationRequest . id ) ;
888
+ done ( ) ;
889
+ } ) ;
890
+ } ) ;
891
+
892
+ it ( "should successfully stop the impersonation when action is STOP" , function ( done ) {
893
+ const impersonationToken = authService . generateImpersonationAuthToken ( {
894
+ userId : testSuperUserId ,
895
+ impersonatedUserId : testUserId3 ,
896
+ } ) ;
897
+
898
+ chai
899
+ . request ( app )
900
+ . patch ( `/impersonation/${ approvedImpersonationRequest . id } ?dev=true&action=STOP` )
901
+ . set ( "cookie" , `${ cookieName } =${ impersonationToken } ` )
902
+ . end ( function ( err , res ) {
903
+ if ( err ) return done ( err ) ;
904
+ expect ( res . statusCode ) . to . equal ( 200 ) ;
905
+ expect ( res . body . message ) . to . equal ( "Impersonation session has been stopped." ) ;
906
+ expect ( res . body . data . id ) . to . equal ( approvedImpersonationRequest . id ) ;
907
+ done ( ) ;
908
+ } ) ;
909
+ } ) ;
910
+
911
+ it ( "should return 403 if impersonation request is not approved" , function ( done ) {
912
+ chai
913
+ . request ( app )
914
+ . patch ( `/impersonation/${ unapprovedImpersonationRequest . id } ?dev=true&action=START` )
915
+ . set ( "cookie" , `${ cookieName } =${ superUserToken } ` )
916
+ . end ( function ( err , res ) {
917
+ if ( err ) return done ( err ) ;
918
+ expect ( res . statusCode ) . to . equal ( 403 ) ;
919
+ expect ( res . body . message ) . to . equal ( OPERATION_NOT_ALLOWED ) ;
920
+ done ( ) ;
921
+ } ) ;
922
+ } ) ;
923
+
924
+ it ( "should return 403 if a user other than the impersonated user tries to STOP the session" , function ( done ) {
925
+ const fakeImpersonationToken = authService . generateImpersonationAuthToken ( {
926
+ userId : testSuperUserId ,
927
+ impersonatedUserId : testUserId5 ,
928
+ } ) ;
929
+
930
+ chai
931
+ . request ( app )
932
+ . patch ( `/impersonation/${ approvedImpersonationRequest . id } ?dev=true&action=STOP` )
933
+ . set ( "cookie" , `${ cookieName } =${ fakeImpersonationToken } ` )
934
+ . end ( function ( err , res ) {
935
+ if ( err ) return done ( err ) ;
936
+ expect ( res . statusCode ) . to . equal ( 403 ) ;
937
+ expect ( res . body . message ) . to . equal ( OPERATION_NOT_ALLOWED ) ;
938
+ done ( ) ;
939
+ } ) ;
940
+ } ) ;
941
+
942
+ it ( "should return 403 if a user who is not currently impersonating attempts to stop the impersonation session" , function ( done ) {
943
+ const normalToken = authService . generateAuthToken ( {
944
+ userId : testSuperUserId , // not impersonating anyone
945
+ } ) ;
946
+
947
+ chai
948
+ . request ( app )
949
+ . patch ( `/impersonation/${ approvedImpersonationRequest . id } ?dev=true&action=STOP` )
950
+ . set ( "cookie" , `${ cookieName } =${ normalToken } ` )
951
+ . end ( function ( err , res ) {
952
+ if ( err ) return done ( err ) ;
953
+ try {
954
+ expect ( res ) . to . have . status ( 403 ) ;
955
+ expect ( res . body ) . to . have . property ( "message" , OPERATION_NOT_ALLOWED ) ;
956
+ expect ( res . body ) . to . have . property ( "error" , "Forbidden" ) ;
957
+ done ( ) ;
958
+ } catch ( e ) {
959
+ done ( e ) ;
960
+ }
961
+ } ) ;
962
+ } ) ;
963
+
964
+ it ( "should return 404 if impersonation request does not exist" , function ( done ) {
965
+ chai
966
+ . request ( app )
967
+ . patch ( `/impersonation/nonexistent-id?dev=true&action=START` )
968
+ . set ( "cookie" , `${ cookieName } =${ superUserToken } ` )
969
+ . end ( function ( err , res ) {
970
+ if ( err ) return done ( err ) ;
971
+ expect ( res . statusCode ) . to . equal ( 404 ) ;
972
+ expect ( res . body . message ) . to . equal ( "Request does not exist" ) ;
973
+ done ( ) ;
974
+ } ) ;
975
+ } ) ;
976
+
977
+ it ( "should return 403 if trying to START an already finished impersonation session" , function ( done ) {
978
+ chai
979
+ . request ( app )
980
+ . patch ( `/impersonation/${ finishedImpersonationRequest . id } ?dev=true&action=START` )
981
+ . set ( "cookie" , `${ cookieName } =${ superUserToken } ` )
982
+ . end ( function ( err , res ) {
983
+ if ( err ) return done ( err ) ;
984
+ expect ( res . statusCode ) . to . equal ( 403 ) ;
985
+ expect ( res . body . message ) . to . equal ( "You are not allowed for this operation at the moment" ) ;
986
+ done ( ) ;
987
+ } ) ;
988
+ } ) ;
989
+
990
+ it ( "should throw 404 NotFound if impersonation request does not exist at stopImpersonation Service" , function ( done ) {
991
+ const impersonationToken = authService . generateImpersonationAuthToken ( {
992
+ userId : testSuperUserId ,
993
+ impersonatedUserId : testUserId3 ,
994
+ } ) ;
995
+
996
+ const invalidRequestId = "non-existent-id" ;
997
+
998
+ chai
999
+ . request ( app )
1000
+ . patch ( `/impersonation/${ invalidRequestId } ?dev=true&action=STOP` )
1001
+ . set ( "cookie" , `${ cookieName } =${ impersonationToken } ` )
1002
+ . end ( function ( err , res ) {
1003
+ if ( err ) return done ( err ) ;
1004
+ expect ( res . statusCode ) . to . equal ( 404 ) ;
1005
+ expect ( res . body . message ) . to . equal ( REQUEST_DOES_NOT_EXIST ) ;
1006
+ done ( ) ;
1007
+ } ) ;
1008
+ } ) ;
1009
+ } ) ;
822
1010
} ) ;
0 commit comments