diff --git a/test/fixtures/oooRequest/oooRequest.ts b/test/fixtures/oooRequest/oooRequest.ts index 10dce241d..36ba49cd8 100644 --- a/test/fixtures/oooRequest/oooRequest.ts +++ b/test/fixtures/oooRequest/oooRequest.ts @@ -167,7 +167,7 @@ export const createOooRequests3 = { status: REQUEST_STATE.PENDING }; -export const acknowledgeOooRequest = { +export const testAcknowledgeOooRequest = { type: REQUEST_TYPE.OOO, status: REQUEST_STATE.APPROVED, comment: "OOO request approved as it's emergency." diff --git a/test/integration/requests.test.ts b/test/integration/requests.test.ts index 94b0d371c..d5560138b 100644 --- a/test/integration/requests.test.ts +++ b/test/integration/requests.test.ts @@ -15,7 +15,7 @@ import { validOooStatusRequests, validOooStatusUpdate, createOooRequests2, - acknowledgeOooRequest, + testAcknowledgeOooRequest, createOooRequests3, } from "../fixtures/oooRequest/oooRequest"; import { createRequest, updateRequest } from "../../models/requests"; @@ -351,7 +351,7 @@ describe("/requests OOO", function () { chai .request(app) .patch(`/requests/${testOooRequest.id}?dev=true`) - .send(acknowledgeOooRequest) + .send(testAcknowledgeOooRequest) .end(function (err, res) { expect(res).to.have.status(401); expect(res.body.error).to.equal("Unauthorized"); @@ -365,7 +365,7 @@ describe("/requests OOO", function () { .request(app) .patch(`/requests/${testOooRequest.id}?dev=false`) .set("cookie", `${cookieName}=${superUserToken}`) - .send(acknowledgeOooRequest) + .send(testAcknowledgeOooRequest) .end(function (err, res) { if (err) { return done(err); @@ -381,7 +381,7 @@ describe("/requests OOO", function () { .request(app) .patch(`/requests/11111111111111?dev=true`) .set("cookie", `${cookieName}=${superUserToken}`) - .send(acknowledgeOooRequest) + .send(testAcknowledgeOooRequest) .end(function (err, res) { if (err) { return done(err); @@ -397,13 +397,13 @@ describe("/requests OOO", function () { .request(app) .patch(`/requests/${testOooRequest.id}?dev=true`) .set("cookie", `${cookieName}=${authToken}`) - .send(acknowledgeOooRequest) + .send(testAcknowledgeOooRequest) .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); + expect(res.body.message).to.equal(UNAUTHORIZED_TO_CREATE_OOO_REQUEST); done(); }); }); @@ -413,7 +413,7 @@ describe("/requests OOO", function () { .request(app) .patch(`/requests/${approvedOooRequest.id}?dev=true`) .set("cookie", `${cookieName}=${superUserToken}`) - .send(acknowledgeOooRequest) + .send(testAcknowledgeOooRequest) .end(function (err, res) { if (err) { return done(err); @@ -429,7 +429,7 @@ describe("/requests OOO", function () { .request(app) .patch(`/requests/${rejectedOooRequest.id}?dev=true`) .set("cookie", `${cookieName}=${superUserToken}`) - .send(acknowledgeOooRequest) + .send(testAcknowledgeOooRequest) .end(function (err, res) { if (err) { return done(err); @@ -445,7 +445,7 @@ describe("/requests OOO", function () { .request(app) .patch(`/requests/${onboardingRequest.id}?dev=true`) .set("cookie", `${cookieName}=${superUserToken}`) - .send(acknowledgeOooRequest) + .send(testAcknowledgeOooRequest) .end(function (err, res) { if (err) { return done(err); @@ -461,7 +461,7 @@ describe("/requests OOO", function () { .request(app) .patch(`/requests/${testOooRequest.id}?dev=true`) .set("cookie", `${cookieName}=${superUserToken}`) - .send(acknowledgeOooRequest) + .send(testAcknowledgeOooRequest) .end(function (err, res) { if (err) { return done(err); @@ -477,7 +477,7 @@ describe("/requests OOO", function () { .request(app) .patch(`/requests/${testOooRequest.id}?dev=true`) .set("cookie", `${cookieName}=${superUserToken}`) - .send({...acknowledgeOooRequest, status: REQUEST_STATE.REJECTED}) + .send({...testAcknowledgeOooRequest, status: REQUEST_STATE.REJECTED}) .end(function (err, res) { if (err) { return done(err); @@ -494,7 +494,7 @@ describe("/requests OOO", function () { .request(app) .patch(`/requests/${testOooRequest.id}?dev=true`) .set("cookie", `${cookieName}=${superUserToken}`) - .send(acknowledgeOooRequest) + .send(testAcknowledgeOooRequest) .end(function (err, res) { if (err) return done(err); expect(res.statusCode).to.equal(500); diff --git a/test/unit/middlewares/oooRequests.test.ts b/test/unit/middlewares/oooRequests.test.ts index 11272e860..f8b4c103c 100644 --- a/test/unit/middlewares/oooRequests.test.ts +++ b/test/unit/middlewares/oooRequests.test.ts @@ -4,15 +4,17 @@ const { expect } = chai; import { createOooStatusRequestValidator, - // acknowledgeOOORequestsValidator, + acknowledgeOooRequestValidator, } from "./../../../middlewares/validators/oooRequests"; -import { acknowledgeOooRequest, validOooStatusRequests, validOooStatusUpdate } from "../../fixtures/oooRequest/oooRequest"; +import { testAcknowledgeOooRequest, validOooStatusRequests, validOooStatusUpdate } from "../../fixtures/oooRequest/oooRequest"; import _ from "lodash"; +import { AcknowledgeOooRequest, OooRequestResponse } from "../../../types/oooRequest"; describe("OOO Status Request Validators", function () { let req: any; let res: any; let nextSpy; + beforeEach(function () { res = { boom: { @@ -91,40 +93,46 @@ describe("OOO Status Request Validators", function () { }); }); - describe.skip("acknowledgeOOORequestsValidator", function () { + describe("acknowledgeOOORequestsValidator", function () { it("should not validate for an invalid request for invalid request type", async function () { req = { - body: { ...acknowledgeOooRequest, type: "XYZ"} + body: { ...testAcknowledgeOooRequest, type: "XYZ"}, + params: { id: "test-id" } }; - // await acknowledgeOOORequestsValidator(req, res, nextSpy); + await acknowledgeOooRequestValidator(req as AcknowledgeOooRequest, res as OooRequestResponse, nextSpy); + expect(res.boom.badRequest.calledOnce).to.be.true; 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"} + body: { ...testAcknowledgeOooRequest, status: "PENDING"}, + params: { id: "test-id" } }; - // await acknowledgeOOORequestsValidator(req, res, nextSpy); + await acknowledgeOooRequestValidator(req as AcknowledgeOooRequest, res as OooRequestResponse, nextSpy); + expect(res.boom.badRequest.calledOnce).to.be.true; 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") + body: _.omit(testAcknowledgeOooRequest, "comment"), + params: { id: "test-id" } }; res = {}; - // await acknowledgeOOORequestsValidator(req, res, nextSpy); + await acknowledgeOooRequestValidator(req as AcknowledgeOooRequest, res as OooRequestResponse, nextSpy); expect(nextSpy.calledOnce).to.be.true; }); it("should validate for a valid acknowledge OOO request", async function() { req = { - body: acknowledgeOooRequest + body: testAcknowledgeOooRequest, + params: { id: "test-id" } }; res = {}; - // await acknowledgeOOORequestsValidator(req, res, nextSpy); + await acknowledgeOooRequestValidator(req as AcknowledgeOooRequest, res as OooRequestResponse, nextSpy); expect(nextSpy.calledOnce).to.be.true; }); }); diff --git a/test/unit/services/oooRequest.test.ts b/test/unit/services/oooRequest.test.ts index c71580b1a..f66d67fca 100644 --- a/test/unit/services/oooRequest.test.ts +++ b/test/unit/services/oooRequest.test.ts @@ -1,245 +1,213 @@ 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, + 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, - // acknowledgeOOORequest, - // validateOOOAcknowledgeRequest +import { + createOooRequest, + validateUserStatus, + acknowledgeOooRequest, + validateOooAcknowledgeRequest, } from "../../../services/oooRequest"; import { expect } from "chai"; -import { testUserStatus, validOooStatusRequests, validUserCurrentStatus, createdOOORequest } from "../../fixtures/oooRequest/oooRequest"; +import { + testUserStatus, + validOooStatusRequests, + validUserCurrentStatus, + createdOOORequest, +} from "../../fixtures/oooRequest/oooRequest"; import { updateUserStatus } from "../../../models/userStatus"; import { userState } from "../../../constants/userStatus"; import addUser from "../../utils/addUser"; import userDataFixture from "../../fixtures/user/user"; import * as logService from "../../../services/logService"; -import { createOooRequests3 } from "../../fixtures/oooRequest/oooRequest"; +import { createOooRequests3, testAcknowledgeOooRequest } from "../../fixtures/oooRequest/oooRequest"; import { createRequest } from "../../../models/requests"; -describe("Test OOO Request Service", function() { - - let testUserName: string; - let testUserId: string; - const errorMessage = "Unexpected error occured"; - - beforeEach(async function() { - const users = userDataFixture(); - testUserId = await addUser(users[8]); - testUserName = users[8].username; - }); - - afterEach(async function() { - sinon.restore(); - await cleanDb(); - }); - - describe("validateUserStatus", function() { - - it("should return USER_STATUS_NOT_FOUND if user status not found", async function() { - const validationResponse = await validateUserStatus( - testUserId, - { ...testUserStatus, userStatusExists: false } - ); - expect(validationResponse).to.be.not.undefined; - expect(validationResponse.error).to.equal(USER_STATUS_NOT_FOUND); - }); - - it("should return OOO_STATUS_ALREADY_EXIST if user status is already OOO", async function() { - const validationResponse = await validateUserStatus( - testUserId, - { - ...testUserStatus, - data: { - ...testUserStatus.data, - currentStatus: { - ...testUserStatus.data.currentStatus, - state: userState.OOO - } - } - } - ); - expect(validationResponse).to.be.not.undefined; - expect(validationResponse.error).to.equal(OOO_STATUS_ALREADY_EXIST); - }); - - it("should return undefined when all validation checks passes", async function() { - const response = await validateUserStatus(testUserId, testUserStatus); - expect(response).to.not.exist; - }); - }); - - describe("createOooRequest", function() { - - beforeEach(async function() { - await updateUserStatus(testUserId, testUserStatus.data); - }); - - afterEach(async function () { - sinon.restore(); - }); - - it("should create OOO request", async function() { - const response = await createOooRequest(validOooStatusRequests, testUserId); - expect(response).to.deep.include({ - ...createdOOORequest, - id: response.id, - requestedBy: testUserId - }); - }); - - it("should throw error", async function () { - sinon.stub(logService, "addLog").throws(new Error(errorMessage)); - - try { - await createOooRequest(validOooStatusRequests, testUserId); - } catch (error) { - expect(error.message).to.equal(errorMessage); - } - }); - }); - - 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 +describe("Test OOO Request Service", function () { + let testUserName: string; + let testUserId: string; + const errorMessage = "Unexpected error occured"; + + + + beforeEach(async function () { + const users = userDataFixture(); + testUserId = await addUser(users[8]); + testUserName = users[8].username; + }); + + afterEach(async function () { + sinon.restore(); + await cleanDb(); + }); + + describe("validateUserStatus", function () { + it("should return USER_STATUS_NOT_FOUND if user status not found", async function () { + const validationResponse = await validateUserStatus(testUserId, { ...testUserStatus, userStatusExists: false }); + expect(validationResponse).to.be.not.undefined; + expect(validationResponse.error).to.equal(USER_STATUS_NOT_FOUND); + }); + + it("should return OOO_STATUS_ALREADY_EXIST if user status is already OOO", async function () { + const validationResponse = await validateUserStatus(testUserId, { + ...testUserStatus, + data: { + ...testUserStatus.data, + currentStatus: { + ...testUserStatus.data.currentStatus, + state: userState.OOO, + }, + }, + }); + expect(validationResponse).to.be.not.undefined; + expect(validationResponse.error).to.equal(OOO_STATUS_ALREADY_EXIST); + }); + + it("should return undefined when all validation checks passes", async function () { + const response = await validateUserStatus(testUserId, testUserStatus); + expect(response).to.not.exist; + }); + }); + + describe("createOooRequest", function () { + beforeEach(async function () { + await updateUserStatus(testUserId, testUserStatus.data); + }); + + afterEach(async function () { + sinon.restore(); + }); + + it("should create OOO request", async function () { + const response = await createOooRequest(validOooStatusRequests, testUserId); + expect(response).to.deep.include({ + ...createdOOORequest, + id: response.id, + requestedBy: testUserId, + }); + }); + + it("should throw error", async function () { + sinon.stub(logService, "addLog").throws(new Error(errorMessage)); + + try { + await createOooRequest(validOooStatusRequests, testUserId); + expect.fail("Should have thrown an error"); + } catch (error) { + expect(error.message).to.equal(errorMessage); + } + }); + }); + + describe("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 () { + try { + await validateOooAcknowledgeRequest(REQUEST_TYPE.ONBOARDING, testOooRequest.status); + expect.fail("Should have thrown an error"); + } catch (error) { + expect(error.message).to.equal(INVALID_REQUEST_TYPE); + } + }); + + it("should return REQUEST_ALREADY_APPROVED if request is already approved", async function () { + try { + await validateOooAcknowledgeRequest(REQUEST_TYPE.OOO, REQUEST_STATE.APPROVED); + expect.fail("Should have thrown an error"); + } catch (error) { + expect(error.message).to.equal(REQUEST_ALREADY_APPROVED); + } + }); + + it("should return REQUEST_ALREADY_REJECTED if request is already rejected", async function () { + try { + await validateOooAcknowledgeRequest(REQUEST_TYPE.OOO, REQUEST_STATE.REJECTED); + expect.fail("Should have thrown an error"); + } catch (error) { + expect(error.message).to.equal(REQUEST_ALREADY_REJECTED); + } + }); + + it("should return undefined when all validation checks passes", async function () { + const response = await validateOooAcknowledgeRequest(REQUEST_TYPE.OOO, REQUEST_STATE.PENDING); + expect(response).to.not.exist; + }); + }); + + describe("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 not found' if invalid request id is passed", async function () { + const invalidOOORequestId = "11111111111111111111"; + try { + await acknowledgeOooRequest(invalidOOORequestId, testAcknowledgeOooRequest, testSuperUserId); + expect.fail("Should have thrown an error"); + } catch (error) { + expect(error.message).to.equal("Request not found"); + } + }); + + it("should approve OOO request", async function () { + const response = await acknowledgeOooRequest(testOooRequest.id, testAcknowledgeOooRequest, testSuperUserId); + expect(response).to.include({ + message: REQUEST_APPROVED_SUCCESSFULLY, + }); + }); + + it("should reject OOO request", async function () { + const response = await acknowledgeOooRequest( + testOooRequest.id, + { ...testAcknowledgeOooRequest, status: REQUEST_STATE.REJECTED }, + testSuperUserId + ); + expect(response).to.include({ + message: REQUEST_REJECTED_SUCCESSFULLY, + }); + }); + + it("should propagate error when logging fails", async function () { + sinon.stub(logService, "addLog").throws(new Error(errorMessage)); + + try { + await acknowledgeOooRequest(testOooRequest.id, testAcknowledgeOooRequest, testSuperUserId); + expect.fail("Should have thrown an error"); + } catch (error) { + expect(error.message).to.equal(errorMessage); + } + }); + }); +});