Skip to content

Commit 9edc182

Browse files
test/ integration tests for update impersonation request (#2448)
* added integration tests for update impersonation requests * fixed errors due to bad pull * added error handling * fixed integration tests imports and resolved comments * fixed bot comments --------- Co-authored-by: Amit Prakash <[email protected]>
1 parent 8fd3e13 commit 9edc182

File tree

1 file changed

+243
-5
lines changed

1 file changed

+243
-5
lines changed

test/integration/impersonationRequests.test.ts

Lines changed: 243 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,23 @@ import addUser from "../utils/addUser";
1111
import * as impersonationModel from "../../models/impersonationRequests";
1212
import * as validationService from "../../services/impersonationRequests";
1313
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";
1524
import { impersonationRequestsBodyData } from "../fixtures/impersonation-requests/impersonationRequests";
1625

1726
const { expect } = chai;
27+
chai.use(chaiHttp);
28+
1829
const cookieName = config.get("userToken.cookieName");
1930
const userData = userDataFixture();
20-
chai.use(chaiHttp);
2131

2232
let authToken: string;
2333
let superUserToken: string;
@@ -30,6 +40,7 @@ let testUserId5: string;
3040
let testSuperUserId: string;
3141
let impersonationRequestBody: CreateImpersonationRequestBody;
3242
let impersonationRequest1: ImpersonationRequest;
43+
let impersonationRequest2: ImpersonationRequest;
3344

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

Comments
 (0)