@@ -39,9 +39,13 @@ let testUserId3: string;
3939let testUserId4 : string ;
4040let testUserId5 : string ;
4141let testSuperUserId : string ;
42+ let tempAuthToken : string ;
4243let 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 ;
4549
4650describe ( "Impersonation Requests" , ( ) => {
4751 requestsEndpoint = "/impersonation/requests?dev=true" ;
@@ -69,15 +73,15 @@ describe("Impersonation Requests", () => {
6973 reason : "User assistance required for account debugging."
7074 } ;
7175
72- impersonationRequest1 = await impersonationModel . createImpersonationRequest ( {
76+ unapprovedImpersonationRequest = await impersonationModel . createImpersonationRequest ( {
7377 ...impersonationRequestsBodyData [ 0 ] ,
7478 impersonatedUserId : testUserId2 ,
7579 createdFor : userData [ 19 ] . username ,
7680 userId : testSuperUserId ,
7781 createdBy : userData [ 4 ] . username
7882 } ) ;
7983
80- impersonationRequest2 = await impersonationModel . createImpersonationRequest ( {
84+ approvedImpersonationRequest = await impersonationModel . createImpersonationRequest ( {
8185 ...impersonationRequestsBodyData [ 0 ] ,
8286 impersonatedUserId : testUserId3 ,
8387 createdFor : userData [ 12 ] . username ,
@@ -554,13 +558,13 @@ describe("Impersonation Requests", () => {
554558 it ( "should return request by specific ID" , function ( done ) {
555559 chai
556560 . request ( app )
557- . get ( `/impersonation/requests/${ impersonationRequest1 . id } ?dev=true` )
561+ . get ( `/impersonation/requests/${ unapprovedImpersonationRequest . id } ?dev=true` )
558562 . set ( "cookie" , `${ cookieName } =${ authToken } ` )
559563 . end ( function ( err , res ) {
560564 if ( err ) return done ( err ) ;
561565 expect ( res ) . to . have . status ( 200 ) ;
562566 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 ) ;
564568 done ( ) ;
565569 } ) ;
566570 } ) ;
@@ -593,24 +597,21 @@ describe("Impersonation Requests", () => {
593597 } ) ;
594598
595599 describe ( "PATCH /impersonation/requests/:id" , function ( ) {
596- let rejectedRequest ;
597- let impersonationRequest3 ;
598-
599600 beforeEach ( async ( ) => {
600- impersonationRequest1 = await impersonationModel . createImpersonationRequest ( {
601+ approvedImpersonationRequest = await impersonationModel . createImpersonationRequest ( {
601602 ...impersonationRequestsBodyData [ 0 ] ,
602603 impersonatedUserId : testUserId1 ,
603604 createdBy : userData [ 16 ] . username ,
604605 status : REQUEST_STATE . APPROVED
605606 } ) ;
606607
607- impersonationRequest2 = await impersonationModel . createImpersonationRequest ( {
608+ unapprovedImpersonationRequest = await impersonationModel . createImpersonationRequest ( {
608609 ...impersonationRequestsBodyData [ 1 ] ,
609610 impersonatedUserId : testUserId3 ,
610611 createdFor : userData [ 12 ] . username
611612 } ) ;
612613
613- impersonationRequest3 = await impersonationModel . createImpersonationRequest ( {
614+ unapprovedImpersonationRequest2 = await impersonationModel . createImpersonationRequest ( {
614615 ...impersonationRequestsBodyData [ 2 ] ,
615616 impersonatedUserId : testUserId4
616617 } ) ;
@@ -625,7 +626,7 @@ describe("Impersonation Requests", () => {
625626 it ( "should return 404 and 'Route not found' message when dev is false" , function ( done ) {
626627 chai
627628 . request ( app )
628- . patch ( `/impersonation/requests/${ impersonationRequest1 . id } ?dev=false` )
629+ . patch ( `/impersonation/requests/${ unapprovedImpersonationRequest . id } ?dev=false` )
629630 . send ( { status :"APPROVED" } )
630631 . set ( "cookie" , `${ cookieName } =${ authToken } ` )
631632 . end ( function ( err , res ) {
@@ -643,7 +644,7 @@ describe("Impersonation Requests", () => {
643644 it ( "should return 404 and 'Route not found' message when dev is missing" , function ( done ) {
644645 chai
645646 . request ( app )
646- . patch ( `/impersonation/requests/${ impersonationRequest1 . id } ` )
647+ . patch ( `/impersonation/requests/${ unapprovedImpersonationRequest . id } ` )
647648 . send ( { status :"APPROVED" } )
648649 . set ( "cookie" , `${ cookieName } =${ authToken } ` )
649650 . end ( function ( err , res ) {
@@ -662,15 +663,15 @@ describe("Impersonation Requests", () => {
662663 const tempAuthToken = authService . generateAuthToken ( { userId : testUserId3 } ) ;
663664 chai
664665 . request ( app )
665- . patch ( `/impersonation/requests/${ impersonationRequest2 . id } ?dev=true` )
666+ . patch ( `/impersonation/requests/${ unapprovedImpersonationRequest . id } ?dev=true` )
666667 . send ( { status :"APPROVED" } )
667668 . set ( "cookie" , `${ cookieName } =${ tempAuthToken } ` )
668669 . end ( function ( err , res ) {
669670 if ( err ) return done ( err ) ;
670671 expect ( res . statusCode ) . to . equal ( 200 ) ;
671672 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 ) ;
674675 done ( ) ;
675676 } ) ;
676677 } ) ;
@@ -679,23 +680,23 @@ describe("Impersonation Requests", () => {
679680 const tempAuthToken = authService . generateAuthToken ( { userId : testUserId4 } ) ;
680681 chai
681682 . request ( app )
682- . patch ( `/impersonation/requests/${ impersonationRequest3 . id } ?dev=true` )
683+ . patch ( `/impersonation/requests/${ unapprovedImpersonationRequest2 . id } ?dev=true` )
683684 . send ( { status :"REJECTED" } )
684685 . set ( "cookie" , `${ cookieName } =${ tempAuthToken } ` )
685686 . end ( function ( err , res ) {
686687 if ( err ) return done ( err ) ;
687688 expect ( res . statusCode ) . to . equal ( 200 ) ;
688689 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 ) ;
691692 done ( ) ;
692693 } ) ;
693694 } ) ;
694695
695696 it ( "should return 401 if user is not logged in" , function ( done ) {
696697 chai
697698 . request ( app )
698- . patch ( `/impersonation/requests/${ impersonationRequest2 . id } ?dev=true` )
699+ . patch ( `/impersonation/requests/${ unapprovedImpersonationRequest . id } ?dev=true` )
699700 . send ( { status :"APPROVED" } )
700701 . end ( function ( err , res ) {
701702 if ( err ) return done ( err ) ;
@@ -730,7 +731,7 @@ describe("Impersonation Requests", () => {
730731 const tempAuthToken = authService . generateAuthToken ( { userId : testUserId1 } ) ;
731732 chai
732733 . request ( app )
733- . patch ( `/impersonation/requests/${ impersonationRequest1 . id } ?dev=true` )
734+ . patch ( `/impersonation/requests/${ approvedImpersonationRequest . id } ?dev=true` )
734735 . set ( "cookie" , `${ cookieName } =${ tempAuthToken } ` )
735736 . send ( { status :"APPROVED" } )
736737 . end ( function ( err , res ) {
@@ -760,7 +761,7 @@ describe("Impersonation Requests", () => {
760761 it ( "should throw 403 Forbidden if unauthorized user tries to update the request" , function ( done ) {
761762 chai
762763 . request ( app )
763- . patch ( `/impersonation/requests/${ impersonationRequest3 . id } ?dev=true` )
764+ . patch ( `/impersonation/requests/${ unapprovedImpersonationRequest2 . id } ?dev=true` )
764765 . send ( { status : "APPROVED" } )
765766 . set ( "cookie" , `${ cookieName } =${ authToken } ` )
766767 . end ( function ( err , res ) {
@@ -775,7 +776,7 @@ describe("Impersonation Requests", () => {
775776 it ( "should return 400 if status is not provided" , function ( done ) {
776777 chai
777778 . request ( app )
778- . patch ( `/impersonation/requests/${ impersonationRequest1 . id } ?dev=true` )
779+ . patch ( `/impersonation/requests/${ unapprovedImpersonationRequest . id } ?dev=true` )
779780 . set ( "cookie" , `${ cookieName } =${ authToken } ` )
780781 . send ( { status : "" } )
781782 . end ( function ( err , res ) {
@@ -790,7 +791,7 @@ describe("Impersonation Requests", () => {
790791 it ( "should return 400 if status is not APPROVED/REJECTED" , function ( done ) {
791792 chai
792793 . request ( app )
793- . patch ( `/impersonation/requests/${ impersonationRequest1 . id } ?dev=true` )
794+ . patch ( `/impersonation/requests/${ unapprovedImpersonationRequest . id } ?dev=true` )
794795 . set ( "cookie" , `${ cookieName } =${ authToken } ` )
795796 . send ( { status : "ACTIVE" } )
796797 . end ( function ( err , res ) {
@@ -807,7 +808,7 @@ describe("Impersonation Requests", () => {
807808 sinon . stub ( impersonationModel , "updateImpersonationRequest" ) . throws ( new Error ( "Firestore error" ) ) ;
808809 chai
809810 . request ( app )
810- . patch ( `/impersonation/requests/${ impersonationRequest3 . id } ?dev=true` )
811+ . patch ( `/impersonation/requests/${ unapprovedImpersonationRequest2 . id } ?dev=true` )
811812 . set ( "cookie" , `${ cookieName } =${ tempAuthToken } ` )
812813 . send ( { status : "APPROVED" } )
813814 . end ( function ( err , res ) {
@@ -819,4 +820,191 @@ describe("Impersonation Requests", () => {
819820 } ) ;
820821 } ) ;
821822 } ) ;
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+ } ) ;
8221010} ) ;
0 commit comments