Skip to content

Commit e0d7524

Browse files
feat: adds integration tests for impersonation session feat (#2451)
* added integration tests for impersonation session feature * fixed linting and tests * fixed missing variable and identation * fixed tests * fixed request names * fixed spacing in tests --------- Co-authored-by: Yash Raj <[email protected]>
1 parent cfcf6b6 commit e0d7524

File tree

1 file changed

+214
-26
lines changed

1 file changed

+214
-26
lines changed

test/integration/impersonationRequests.test.ts

Lines changed: 214 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,13 @@ let testUserId3: string;
3939
let testUserId4: string;
4040
let testUserId5: string;
4141
let testSuperUserId: string;
42+
let tempAuthToken: string;
4243
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;
4549

4650
describe("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

Comments
 (0)