Skip to content

Commit

Permalink
Merge pull request #1267 from Real-Dev-Squad/task-dependency-v3
Browse files Browse the repository at this point in the history
Check for valid dependency
  • Loading branch information
heyrandhir committed Jul 20, 2023
2 parents 753762e + 3921db5 commit bcba615
Show file tree
Hide file tree
Showing 5 changed files with 65 additions and 18 deletions.
6 changes: 6 additions & 0 deletions controllers/tasks.js
Original file line number Diff line number Diff line change
Expand Up @@ -259,8 +259,14 @@ const updateTask = async (req, res) => {
if (isUserStatusEnabled && req.body.assignee) {
await updateUserStatusOnTaskUpdate(req.body.assignee);
}

return res.status(204).send();
} catch (err) {
if (err.message.includes("Invalid dependency passed")) {
const errorMessage = "Invalid dependency";
logger.error(`Error while updating task: ${errorMessage}`);
return res.boom.badRequest(errorMessage);
}
logger.error(`Error while updating task: ${err}`);
return res.boom.badImplementation(INTERNAL_SERVER_ERROR);
}
Expand Down
19 changes: 11 additions & 8 deletions models/tasks.js
Original file line number Diff line number Diff line change
Expand Up @@ -37,20 +37,23 @@ const updateTask = async (taskData, taskId = null) => {
const existingDependenciesSnapshot = await transaction.get(dependencyQuery);
const existingDependsOnIds = existingDependenciesSnapshot.docs.map((doc) => doc.data().dependsOn);
const newDependencies = dependsOn.filter((dependency) => !existingDependsOnIds.includes(dependency));

if (newDependencies.length > 0) {
for (const dependency of newDependencies) {
const taskDependsOn = {
taskId: taskId,
dependsOn: dependency,
};
const docRef = dependencyModel.doc();
transaction.set(docRef, taskDependsOn);
const dependencyDoc = await tasksModel.doc(dependency).get();
if (dependencyDoc.exists) {
const taskDependsOn = {
taskId: taskId,
dependsOn: dependency,
};
const docRef = dependencyModel.doc();
transaction.set(docRef, taskDependsOn);
} else {
throw new Error("Invalid dependency passed");
}
}
}
});
}

return { taskId };
}
const taskInfo = await tasksModel.add(taskData);
Expand Down
1 change: 0 additions & 1 deletion test/fixtures/tasks/tasks.js
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,6 @@ module.exports = () => {
endsOn: 1234,
startedOn: 4567,
status: "AVAILABLE",
dependsOn: ["taskId2", "taskId3"],
percentCompleted: 100,
participants: [],
completionAward: { [DINERO]: 3, [NEELAM]: 300 },
Expand Down
21 changes: 18 additions & 3 deletions test/integration/tasks.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -390,7 +390,6 @@ describe("Tasks", function () {
.set("cookie", `${cookieName}=${jwt}`)
.send({
title: "new-title",
dependsOn: ["dependency1", "dependency2"],
})
.end((err, res) => {
if (err) {
Expand All @@ -402,15 +401,17 @@ describe("Tasks", function () {
});
it("Should update dependency", async function () {
taskId = (await tasks.updateTask(tasksData[5])).taskId;
const dependsOn = ["taskId5", "taskId4"];
const taskId1 = (await tasks.updateTask(tasksData[5])).taskId;
const taskId2 = (await tasks.updateTask(tasksData[5])).taskId;

const dependsOn = [taskId1, taskId2];
const res = await chai
.request(app)
.patch(`/tasks/${taskId}`)
.set("cookie", `${cookieName}=${jwt}`)
.send({ dependsOn });
expect(res).to.have.status(204);
const res2 = await chai.request(app).get(`/tasks/${taskId}/details`);

expect(res2).to.have.status(200);
expect(res2.body.taskData.dependsOn).to.be.a("array");
res2.body.taskData.dependsOn.forEach((taskId) => {
Expand All @@ -419,6 +420,20 @@ describe("Tasks", function () {

return taskId;
});

it("Should return 400 if any of taskid is not exist", async function () {
taskId = (await tasks.updateTask(tasksData[5])).taskId;
const taskId1 = (await tasks.updateTask(tasksData[5])).taskId;
const dependsOn = ["taskId5", "taskId6", taskId1];
const res = await chai
.request(app)
.patch(`/tasks/${taskId}`)
.set("cookie", `${cookieName}=${jwt}`)
.send({ dependsOn });
expect(res).to.have.status(400);
expect(res.body.message).to.equal("Invalid dependency");
});

it("Should update status when assignee pass as a payload", async function () {
taskId = (await tasks.updateTask(tasksData[5])).taskId;
const res = await chai
Expand Down
36 changes: 30 additions & 6 deletions test/unit/models/tasks.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -142,16 +142,40 @@ describe("tasks", function () {
});
});

describe("updateDependency", function () {
describe("update Dependency", function () {
it("should add dependencies to firestore", async function () {
const taskId = (await tasks.updateTask(tasksData[5])).taskId;
await firestore.collection("tasks").doc(taskId).set(tasksData[5]);

const taskId1 = (await tasks.updateTask(tasksData[3])).taskId;
const taskId2 = (await tasks.updateTask(tasksData[4])).taskId;
const dependsOn = [taskId1, taskId2];
const data = {
taskId: "taskId1",
dependsOn: ["taskId2", "taskId3"],
dependsOn,
};
const result = await updateTask(data);

expect(result.taskDetails.taskId).to.equal(data.taskId);
expect(result.taskDetails.dependsOn).to.equal(data.dependsOn);
await updateTask(data, taskId);
const taskData = await tasks.fetchTask(taskId);
taskData.dependencyDocReference.forEach((taskId) => {
expect(dependsOn).to.include(taskId);
});
});
it("should throw error when wrong id is passed", async function () {
const taskId = (await tasks.updateTask(tasksData[5])).taskId;
await firestore.collection("tasks").doc(taskId).set(tasksData[5]);

const dependsOn = ["taskId1", "taskId2"];
const data = {
dependsOn,
};

try {
await updateTask(data, taskId);
expect.fail("Something went wrong");
} catch (err) {
expect(err).to.be.an.instanceOf(Error);
expect(err.message).to.equal("Invalid dependency passed");
}
});
});
describe("update tasks", function () {
Expand Down

0 comments on commit bcba615

Please sign in to comment.