diff --git a/test/fixtures/oooRequest/oooRequest.ts b/test/fixtures/oooRequest/oooRequest.ts index e6386b872..30b72d2a0 100644 --- a/test/fixtures/oooRequest/oooRequest.ts +++ b/test/fixtures/oooRequest/oooRequest.ts @@ -157,4 +157,19 @@ export const updateOooStatusRequest = [ updatedAt: 1234567890, reason: "Approval granted.", }, -]; \ No newline at end of file +]; + +export const createOooRequests3 = { + from: Date.now() + 100000, + until: Date.now() + 200000, + type: "OOO", + requestedBy: "suraj-maity-1", + reason: "Out of office for personal emergency.", + status: REQUEST_STATE.PENDING +}; + +export const acknowledgeOooRequest = { + type: REQUEST_TYPE.OOO, + status: REQUEST_STATE.APPROVED, + comment: "OOO request approved as it's emergency." +}; \ No newline at end of file diff --git a/test/integration/requests.test.ts b/test/integration/requests.test.ts index 15bb731c9..2e83acf18 100644 --- a/test/integration/requests.test.ts +++ b/test/integration/requests.test.ts @@ -15,6 +15,8 @@ import { validOooStatusRequests, validOooStatusUpdate, createOooRequests2, + acknowledgeOooRequest, + createOooRequests3, } from "../fixtures/oooRequest/oooRequest"; import { createRequest, updateRequest } from "../../models/requests"; import { @@ -27,6 +29,8 @@ import { REQUEST_ALREADY_PENDING, REQUEST_REJECTED_SUCCESSFULLY, REQUEST_ALREADY_REJECTED, + INVALID_REQUEST_TYPE, + // UNAUTHORIZED_TO_ACKNOWLEDGE_OOO_REQUEST, UNAUTHORIZED_TO_CREATE_OOO_REQUEST, USER_STATUS_NOT_FOUND, OOO_STATUS_ALREADY_EXIST, @@ -36,6 +40,7 @@ import { validTaskAssignmentRequest, validTaskCreqtionRequest } from "../fixture import { deleteUserStatus, updateUserStatus } from "../../models/userStatus"; import * as requestsQuery from "../../models/requests"; import { userState } from "../../constants/userStatus"; +import * as logUtils from "../../services/logService"; const userData = userDataFixture(); chai.use(chaiHttp); @@ -48,6 +53,7 @@ let approvedOooRequestId: string; let oooRequestData: any; let oooRequestData2: any; let testUserId: string; +let testSuperUserId: string; let testArchivedUserId: string; describe("/requests OOO", function () { @@ -58,6 +64,7 @@ describe("/requests OOO", function () { const userIdPromises = [addUser(userData[16]), addUser(userData[4]), addUser(userData[18])]; const [userId, superUserId, archivedUserId] = await Promise.all(userIdPromises); testUserId = userId; + testSuperUserId = superUserId; testArchivedUserId = archivedUserId; oooRequestData = { ...createOooRequests, requestedBy: userId }; @@ -316,6 +323,189 @@ describe("/requests OOO", function () { }); }); + describe.skip("PATCH /requests/:id", function () { + let testOooRequest; + let onboardingRequest; + let approvedOooRequest; + let rejectedOooRequest; + + beforeEach(async function () { + + oooRequestData = { ...createOooRequests3, userId: testUserId }; + testOooRequest = await createRequest(oooRequestData); + + onboardingRequest = await createRequest({ + type: REQUEST_TYPE.ONBOARDING, + numberOfDays: 5, + reason: "This is the reason", + userId: testUserId, + }); + + const pendingOooRequest1 = await createRequest(oooRequestData); + approvedOooRequest = await updateRequest(pendingOooRequest1.id, { status: REQUEST_STATE.APPROVED }, testSuperUserId, REQUEST_TYPE.OOO); + + const pendingOooRequest2 = await createRequest(oooRequestData); + rejectedOooRequest = await updateRequest(pendingOooRequest2.id, { status: REQUEST_STATE.REJECTED }, testSuperUserId, REQUEST_TYPE.OOO); + }); + + it("should return 401 if user is not logged in", function (done) { + chai + .request(app) + .patch(`/requests/${testOooRequest.id}?dev=true`) + .send(acknowledgeOooRequest) + .end(function (err, res) { + expect(res).to.have.status(401); + expect(res.body.error).to.equal("Unauthorized"); + expect(res.body.message).to.equal("Unauthenticated User"); + done(); + }); + }); + + it("should return 501 and 'Feature not implemented' message when dev is false", function (done) { + chai + .request(app) + .patch(`/requests/${testOooRequest.id}?dev=false`) + .set("cookie", `${cookieName}=${superUserToken}`) + .send(acknowledgeOooRequest) + .end(function (err, res) { + if (err) { + return done(err); + } + expect(res.statusCode).to.equal(501); + expect(res.body.message).to.equal("Feature not implemented"); + done(); + }); + }); + + it("should return 404 if request does not exist", function (done) { + chai + .request(app) + .patch(`/requests/11111111111111?dev=true`) + .set("cookie", `${cookieName}=${superUserToken}`) + .send(acknowledgeOooRequest) + .end(function (err, res) { + if (err) { + return done(err); + } + expect(res.statusCode).to.equal(404); + expect(res.body.message).to.equal(REQUEST_DOES_NOT_EXIST); + done(); + }); + }); + + it("should return 403 if user does not have super user permission", function (done) { + chai + .request(app) + .patch(`/requests/${testOooRequest.id}?dev=true`) + .set("cookie", `${cookieName}=${authToken}`) + .send(acknowledgeOooRequest) + .end(function (err, res) { + if (err) { + return done(err); + } + expect(res.statusCode).to.equal(403); + // expect(res.body.message).to.equal(UNAUTHORIZED_TO_ACKNOWLEDGE_OOO_REQUEST); + done(); + }); + }); + + it("should return 409 if OOO request is already approved", function (done) { + chai + .request(app) + .patch(`/requests/${approvedOooRequest.id}?dev=true`) + .set("cookie", `${cookieName}=${superUserToken}`) + .send(acknowledgeOooRequest) + .end(function (err, res) { + if (err) { + return done(err); + } + expect(res.statusCode).to.equal(409); + expect(res.body.message).to.equal(REQUEST_ALREADY_APPROVED); + done(); + }); + }); + + it("should return 409 if OOO request is already rejected", function (done) { + chai + .request(app) + .patch(`/requests/${rejectedOooRequest.id}?dev=true`) + .set("cookie", `${cookieName}=${superUserToken}`) + .send(acknowledgeOooRequest) + .end(function (err, res) { + if (err) { + return done(err); + } + expect(res.statusCode).to.equal(409); + expect(res.body.message).to.equal(REQUEST_ALREADY_REJECTED); + done(); + }); + }); + + it("should return 400 when the request type for the given ID is not 'OOO'", function (done) { + chai + .request(app) + .patch(`/requests/${onboardingRequest.id}?dev=true`) + .set("cookie", `${cookieName}=${superUserToken}`) + .send(acknowledgeOooRequest) + .end(function (err, res) { + if (err) { + return done(err); + } + expect(res.statusCode).to.equal(400); + expect(res.body.message).to.equal(INVALID_REQUEST_TYPE); + done(); + }); + }); + + it("should approve OOO request when dev is true", function (done) { + chai + .request(app) + .patch(`/requests/${testOooRequest.id}?dev=true`) + .set("cookie", `${cookieName}=${superUserToken}`) + .send(acknowledgeOooRequest) + .end(function (err, res) { + if (err) { + return done(err); + } + expect(res.statusCode).to.equal(200); + expect(res.body.message).to.equal(REQUEST_APPROVED_SUCCESSFULLY); + done(); + }); + }); + + it("should reject OOO request when dev is true", function (done) { + chai + .request(app) + .patch(`/requests/${testOooRequest.id}?dev=true`) + .set("cookie", `${cookieName}=${superUserToken}`) + .send({...acknowledgeOooRequest, status: REQUEST_STATE.REJECTED}) + .end(function (err, res) { + if (err) { + return done(err); + } + expect(res.statusCode).to.equal(200); + expect(res.body.message).to.equal(REQUEST_REJECTED_SUCCESSFULLY); + done(); + }); + }); + + it("should return 500 response for unexpected error", function (done) { + sinon.stub(logUtils, "addLog").throws("Error"); + chai + .request(app) + .patch(`/requests/${testOooRequest.id}?dev=true`) + .set("cookie", `${cookieName}=${superUserToken}`) + .send(acknowledgeOooRequest) + .end(function (err, res) { + if (err) return done(err); + expect(res.statusCode).to.equal(500); + expect(res.body.error).to.equal("Internal Server Error"); + expect(res.body.message).to.equal("An internal server error occurred"); + done(); + }); + }); + }); + describe("PUT /requests/:id", function () { it("should return 401 if user is not logged in", function (done) { chai diff --git a/test/unit/middlewares/oooRequests.test.ts b/test/unit/middlewares/oooRequests.test.ts index 27022e8ef..11272e860 100644 --- a/test/unit/middlewares/oooRequests.test.ts +++ b/test/unit/middlewares/oooRequests.test.ts @@ -4,8 +4,10 @@ const { expect } = chai; import { createOooStatusRequestValidator, + // acknowledgeOOORequestsValidator, } from "./../../../middlewares/validators/oooRequests"; -import { validOooStatusRequests } from "../../fixtures/oooRequest/oooRequest"; +import { acknowledgeOooRequest, validOooStatusRequests, validOooStatusUpdate } from "../../fixtures/oooRequest/oooRequest"; +import _ from "lodash"; describe("OOO Status Request Validators", function () { let req: any; @@ -88,4 +90,42 @@ describe("OOO Status Request Validators", function () { } }); }); -}); \ No newline at end of file + + describe.skip("acknowledgeOOORequestsValidator", function () { + it("should not validate for an invalid request for invalid request type", async function () { + req = { + body: { ...acknowledgeOooRequest, type: "XYZ"} + }; + + // await acknowledgeOOORequestsValidator(req, res, nextSpy); + expect(nextSpy.notCalled).to.be.true; + }); + + it("should not validate for an invalid request if status is incorrect", async function () { + req = { + body: { ...acknowledgeOooRequest, status: "PENDING"} + }; + + // await acknowledgeOOORequestsValidator(req, res, nextSpy); + expect(nextSpy.notCalled).to.be.true; + }); + + it("should validate for a valid acknowledge OOO request if comment not provided by superusers", async function() { + req = { + body: _.omit(acknowledgeOooRequest, "comment") + }; + res = {}; + // await acknowledgeOOORequestsValidator(req, res, nextSpy); + expect(nextSpy.calledOnce).to.be.true; + }); + + it("should validate for a valid acknowledge OOO request", async function() { + req = { + body: acknowledgeOooRequest + }; + res = {}; + // await acknowledgeOOORequestsValidator(req, res, nextSpy); + expect(nextSpy.calledOnce).to.be.true; + }); + }); +}); diff --git a/test/unit/services/oooRequest.test.ts b/test/unit/services/oooRequest.test.ts index 3f0e94292..eb63242b6 100644 --- a/test/unit/services/oooRequest.test.ts +++ b/test/unit/services/oooRequest.test.ts @@ -1,10 +1,23 @@ import sinon from "sinon"; import cleanDb from "../../utils/cleanDb"; import { + INVALID_REQUEST_TYPE, + REQUEST_ALREADY_APPROVED, + REQUEST_ALREADY_REJECTED, + REQUEST_APPROVED_SUCCESSFULLY, + REQUEST_DOES_NOT_EXIST, + REQUEST_REJECTED_SUCCESSFULLY, + REQUEST_STATE, + REQUEST_TYPE, OOO_STATUS_ALREADY_EXIST, USER_STATUS_NOT_FOUND, } from "../../../constants/requests"; -import { createOooRequest, validateUserStatus } from "../../../services/oooRequest"; +import { + createOooRequest, + validateUserStatus, + // acknowledgeOOORequest, + // validateOOOAcknowledgeRequest +} from "../../../services/oooRequest"; import { expect } from "chai"; import { testUserStatus, validOooStatusRequests, validUserCurrentStatus, createdOOORequest } from "../../fixtures/oooRequest/oooRequest"; import { updateUserStatus } from "../../../models/userStatus"; @@ -12,6 +25,8 @@ import { userState } from "../../../constants/userStatus"; import addUser from "../../utils/addUser"; import userDataFixture from "../../fixtures/user/user"; import * as logService from "../../../services/logService"; +import { acknowledgeOooRequest, createOooRequests3 } from "../../fixtures/oooRequest/oooRequest"; +import { createRequest } from "../../../models/requests"; describe("Test OOO Request Service", function() { @@ -26,6 +41,7 @@ describe("Test OOO Request Service", function() { }); afterEach(async function() { + sinon.restore(); await cleanDb(); }); @@ -94,4 +110,137 @@ describe("Test OOO Request Service", function() { } }); }); -}); + + describe.skip("validateOOOAcknowledgeRequest", function() { + + let testOooRequest; + + beforeEach(async function () { + testOooRequest = await createRequest({ + ...createOooRequests3, + userId: testUserId, + comment: null, + lastModifiedBy: null, + }); + }); + + it("should return INVALID_REQUEST_TYPE if request type is not OOO", async function() { + // const validationResponse = await validateOOOAcknowledgeRequest( + // testOooRequest.id, + // REQUEST_TYPE.ONBOARDING, + // testOooRequest.status + // ); + // expect(validationResponse.error).to.be.not.undefined; + // expect(validationResponse.error).to.equal(INVALID_REQUEST_TYPE); + }); + + it("should return REQUEST_ALREADY_APPROVED if request is already approved", async function() { + // const validationResponse = await validateOOOAcknowledgeRequest( + // testOooRequest.id, + // testOooRequest.type, + // REQUEST_STATE.APPROVED + // ); + // expect(validationResponse.error).to.be.not.undefined; + // expect(validationResponse.error).to.equal(REQUEST_ALREADY_APPROVED); + }); + + it("should return REQUEST_ALREADY_REJECTED if request is already rejected", async function() { + // const validationResponse = await validateOOOAcknowledgeRequest( + // testOooRequest.id, + // testOooRequest.type, + // REQUEST_STATE.REJECTED + // ); + // expect(validationResponse.error).to.be.not.undefined; + // expect(validationResponse.error).to.equal(REQUEST_ALREADY_REJECTED); + }); + + it("should return undefined when all validation checks passes", async function() { + // const response = await validateOOOAcknowledgeRequest( + // testOooRequest.id, + // testOooRequest.type, + // testOooRequest.status + // ); + // expect(response).to.not.exist; + }); + }); + + describe.skip("acknowledgeOOORequest", function() { + + let testSuperUserId; + let testOooRequest; + + beforeEach(async function () { + const users = userDataFixture(); + const superUserId = await addUser(users[4]); + testSuperUserId = superUserId; + + testOooRequest = await createRequest({ + ...createOooRequests3, + userId: testUserId, + comment: null, + lastModifiedBy: null, + }); + }); + + it("should return REQUEST_DOES_NOT_EXIST if invalid request id is passed", async function () { + // const invalidOOORequestId = "11111111111111111111"; + // const response = await acknowledgeOOORequest( + // invalidOOORequestId, + // acknowledgeOooRequest, + // testSuperUserId + // ); + // expect(response.error).to.equal(REQUEST_DOES_NOT_EXIST); + }); + + it("should approve OOO request", async function() { + // const response = await acknowledgeOOORequest( + // testOooRequest.id, + // acknowledgeOooRequest, + // testSuperUserId + // ); + // expect(response).to.deep.include({ + // message: REQUEST_APPROVED_SUCCESSFULLY, + // data: { + // ...acknowledgeOooRequest, + // id: testOooRequest.id, + // lastModifiedBy: testSuperUserId, + // updatedAt: response.data.updatedAt + // } + // }); + }); + + it("should reject OOO request", async function() { + // const response = await acknowledgeOOORequest( + // testOooRequest.id, + // { ...acknowledgeOooRequest, status: REQUEST_STATE.REJECTED }, + // testSuperUserId + // ); + // expect(response).to.deep.include({ + // message: REQUEST_REJECTED_SUCCESSFULLY, + // data: { + // ...acknowledgeOooRequest, + // id: testOooRequest.id, + // status: REQUEST_STATE.REJECTED, + // lastModifiedBy: testSuperUserId, + // updatedAt: response.data.updatedAt + // } + // }); + }); + + it("should throw error", async function() { + // sinon.stub(logService, "addLog").throws(new Error(errorMessage)); + // const createSpy = sinon.spy(require("../../../services/oooRequest"), "acknowledgeOOORequest"); + + // try { + // await acknowledgeOOORequest( + // testOooRequest.id, + // acknowledgeOooRequest, + // testSuperUserId + // ); + // } catch (error) { + // expect(error.message).to.equal(errorMessage); + // expect(createSpy.calledOnce).to.be.true; + // } + }); + }); +}); \ No newline at end of file