Skip to content

Commit 7ffecf2

Browse files
committed
- Added dev feature flag through the middleware to control access to the /tasks/orphaned-tasks API.
- Implemented negative test cases for the /tasks/orphaned-tasks endpoint: - Tested the scenario where the dev flag is not provided, expecting a 404 status code with a "Route not found" message. - Tested the scenario where the database query fails, ensuring the API responds with a 500 status code and an appropriate error message.
1 parent 3ae49c5 commit 7ffecf2

File tree

3 files changed

+25
-9
lines changed

3 files changed

+25
-9
lines changed

controllers/tasks.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ const { getPaginatedLink } = require("../utils/helper");
1212
const { updateUserStatusOnTaskUpdate, updateStatusOnTaskCompletion } = require("../models/userStatus");
1313
const dataAccess = require("../services/dataAccessLayer");
1414
const { parseSearchQuery } = require("../utils/tasks");
15-
const { addTaskCreatedAtAndUpdatedAtFields, fetchOrphanedTasks } = require("../services/tasks");
15+
const { addTaskCreatedAtAndUpdatedAtFields } = require("../services/tasks");
16+
const tasksService = require("../services/tasks");
1617
const { RQLQueryParser } = require("../utils/RQLParser");
1718
const { getMissedProgressUpdatesUsers } = require("../models/discordactions");
1819
const { logType } = require("../constants/logs");
@@ -534,8 +535,8 @@ const getUsersHandler = async (req, res) => {
534535

535536
const getOrphanedTasks = async (req, res) => {
536537
try {
537-
const data = await fetchOrphanedTasks();
538-
538+
const data = await tasksService.fetchOrphanedTasks();
539+
if (data.length === 0) return res.status(204).send();
539540
return res.status(200).json({ message: "Orphan tasks fetched successfully", data });
540541
} catch (error) {
541542
logger.error("Error in getting tasks which were abandoned", error);

routes/tasks.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ const { cacheResponse, invalidateCache } = require("../utils/cache");
1717
const { ALL_TASKS } = require("../constants/cacheKeys");
1818
const { verifyCronJob } = require("../middlewares/authorizeBot");
1919
const { CLOUDFLARE_WORKER, CRON_JOB_HANDLER } = require("../constants/bot");
20+
const { devFlagMiddleware } = require("../middlewares/devFlag");
2021

2122
const oldAuthorizationMiddleware = authorizeRoles([APPOWNER, SUPERUSER]);
2223
const newAuthorizationMiddleware = authorizeAndAuthenticate(
@@ -33,7 +34,7 @@ const enableDevModeMiddleware = (req, res, next) => {
3334
}
3435
};
3536

36-
router.get("/orphaned-tasks", tasks.getOrphanedTasks);
37+
router.get("/orphaned-tasks", devFlagMiddleware, tasks.getOrphanedTasks);
3738
router.get("/", getTasksValidator, cacheResponse({ invalidationKey: ALL_TASKS, expiry: 10 }), tasks.fetchTasks);
3839
router.get("/self", authenticate, tasks.getSelfTasks);
3940
router.get("/overdue", authenticate, authorizeRoles([SUPERUSER]), tasks.overdueTasks);

test/integration/tasks.test.js

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ const userDBModel = firestore.collection("users");
2525
const discordService = require("../../services/discordService");
2626
const { CRON_JOB_HANDLER } = require("../../constants/bot");
2727
const { logType } = require("../../constants/logs");
28-
28+
const { INTERNAL_SERVER_ERROR } = require("../../constants/errorMessages");
29+
const tasksService = require("../../services/tasks");
2930
chai.use(chaiHttp);
3031

3132
const appOwner = userData[3];
@@ -1654,7 +1655,7 @@ describe("Tasks", function () {
16541655
});
16551656

16561657
it("should fetch tasks assigned to archived and non-discord users", async function () {
1657-
const res = await chai.request(app).get("/tasks/orphaned-tasks");
1658+
const res = await chai.request(app).get("/tasks/orphaned-tasks?dev=true");
16581659

16591660
expect(res).to.have.status(200);
16601661
expect(res.body).to.have.property("message").that.equals("Orphan tasks fetched successfully");
@@ -1668,11 +1669,24 @@ describe("Tasks", function () {
16681669

16691670
const task = abandonedTasksData[3];
16701671
await tasksModel.add(task);
1672+
const res = await chai.request(app).get("/tasks/orphaned-tasks?dev=true");
1673+
1674+
expect(res).to.have.status(204);
1675+
});
1676+
1677+
it("should fail if dev flag is not passed", async function () {
16711678
const res = await chai.request(app).get("/tasks/orphaned-tasks");
1679+
expect(res).to.have.status(404);
1680+
expect(res.body.message).to.be.equal("Route not found");
1681+
});
16721682

1673-
expect(res).to.have.status(200);
1674-
expect(res.body).to.have.property("message").that.equals("Orphan tasks fetched successfully");
1675-
expect(res.body.data).to.be.an("array").with.lengthOf(0);
1683+
it("should handle errors gracefully if the database query fails", async function () {
1684+
sinon.stub(tasksService, "fetchOrphanedTasks").rejects(new Error(INTERNAL_SERVER_ERROR));
1685+
1686+
const res = await chai.request(app).get("/tasks/orphaned-tasks?dev=true");
1687+
1688+
expect(res).to.have.status(500);
1689+
expect(res.body.message).to.be.equal(INTERNAL_SERVER_ERROR);
16761690
});
16771691
});
16781692
});

0 commit comments

Comments
 (0)