From 124a0a75eb064cdfbc8cac15665c690b7244edc9 Mon Sep 17 00:00:00 2001 From: Himesh Badlani Date: Wed, 15 Jul 2026 01:12:47 +0530 Subject: [PATCH 1/4] Assigned task - completed , added unit test cases for all the routes and successfully integrated the test with the supertest library --- task-api/src/routes/tasks.js | 16 +- task-api/src/services/taskService.js | 19 +- task-api/src/utils/validators.js | 12 +- task-api/tests/api.test.js | 502 +++++++++++++++++++++++++++ task-api/tests/taskService.test.js | 325 +++++++++++++++++ 5 files changed, 868 insertions(+), 6 deletions(-) create mode 100644 task-api/tests/api.test.js create mode 100644 task-api/tests/taskService.test.js diff --git a/task-api/src/routes/tasks.js b/task-api/src/routes/tasks.js index e8c370fe..0587ecc0 100644 --- a/task-api/src/routes/tasks.js +++ b/task-api/src/routes/tasks.js @@ -1,7 +1,7 @@ const express = require('express'); const router = express.Router(); const taskService = require('../services/taskService'); -const { validateCreateTask, validateUpdateTask } = require('../utils/validators'); +const { validateCreateTask, validateUpdateTask, validateAssignTask } = require('../utils/validators'); router.get('/stats', (req, res) => { const stats = taskService.getStats(); @@ -69,4 +69,18 @@ router.patch('/:id/complete', (req, res) => { res.json(task); }); +router.patch('/:id/assign', (req, res) => { + const error = validateAssignTask(req.body); + if (error) { + return res.status(400).json({ error }); + } + + const task = taskService.assignTask(req.params.id, req.body.assignee.trim()); + if (!task) { + return res.status(404).json({ error: 'Task not found' }); + } + + res.json(task); +}); + module.exports = router; diff --git a/task-api/src/services/taskService.js b/task-api/src/services/taskService.js index f8e89189..5c6ad5ff 100644 --- a/task-api/src/services/taskService.js +++ b/task-api/src/services/taskService.js @@ -6,10 +6,10 @@ const getAll = () => [...tasks]; const findById = (id) => tasks.find((t) => t.id === id); -const getByStatus = (status) => tasks.filter((t) => t.status.includes(status)); +const getByStatus = (status) => tasks.filter((t) => t.status === status); const getPaginated = (page, limit) => { - const offset = page * limit; + const offset = (page - 1) * limit; return tasks.slice(offset, offset + limit); }; @@ -36,6 +36,7 @@ const create = ({ title, description = '', status = 'todo', priority = 'medium', status, priority, dueDate, + assignee: null, completedAt: null, createdAt: new Date().toISOString(), }; @@ -66,9 +67,8 @@ const completeTask = (id) => { const updated = { ...task, - priority: 'medium', status: 'done', - completedAt: new Date().toISOString(), + completedAt: task.completedAt || new Date().toISOString(), }; const index = tasks.findIndex((t) => t.id === id); @@ -76,6 +76,16 @@ const completeTask = (id) => { return updated; }; +const assignTask = (id, assignee) => { + const task = findById(id); + if (!task) return null; + + const updated = { ...task, assignee }; + const index = tasks.findIndex((t) => t.id === id); + tasks[index] = updated; + return updated; +}; + const _reset = () => { tasks = []; }; @@ -90,5 +100,6 @@ module.exports = { update, remove, completeTask, + assignTask, _reset, }; diff --git a/task-api/src/utils/validators.js b/task-api/src/utils/validators.js index 1e908ff5..893ff73d 100644 --- a/task-api/src/utils/validators.js +++ b/task-api/src/utils/validators.js @@ -33,4 +33,14 @@ const validateUpdateTask = (body) => { return null; }; -module.exports = { validateCreateTask, validateUpdateTask }; +const validateAssignTask = (body) => { + if (body.assignee === undefined || body.assignee === null) { + return 'assignee is required'; + } + if (typeof body.assignee !== 'string' || body.assignee.trim() === '') { + return 'assignee must be a non-empty string'; + } + return null; +}; + +module.exports = { validateCreateTask, validateUpdateTask, validateAssignTask }; diff --git a/task-api/tests/api.test.js b/task-api/tests/api.test.js new file mode 100644 index 00000000..947dca56 --- /dev/null +++ b/task-api/tests/api.test.js @@ -0,0 +1,502 @@ +const request = require('supertest'); +const app = require('../src/app'); +const taskService = require('../src/services/taskService'); + +// Reset the in-memory store before each test to ensure isolation +beforeEach(() => { + taskService._reset(); +}); + +// ───────────────────────────────────────────────────────── +// Helper: quickly create a task via the API +// ───────────────────────────────────────────────────────── +const createTask = (overrides = {}) => + request(app) + .post('/tasks') + .send({ title: 'Test Task', ...overrides }); + +// ========================================================== +// POST /tasks — Create a task +// ========================================================== +describe('POST /tasks', () => { + it('should create a task with valid data and return 201', async () => { + const res = await createTask({ title: 'New Task', priority: 'high' }); + + expect(res.status).toBe(201); + expect(res.body).toMatchObject({ + title: 'New Task', + priority: 'high', + status: 'todo', + completedAt: null, + }); + expect(res.body.id).toBeDefined(); + expect(res.body.createdAt).toBeDefined(); + }); + + it('should create a task with only a title (defaults applied)', async () => { + const res = await createTask({ title: 'Minimal' }); + + expect(res.status).toBe(201); + expect(res.body.description).toBe(''); + expect(res.body.status).toBe('todo'); + expect(res.body.priority).toBe('medium'); + expect(res.body.dueDate).toBeNull(); + }); + + // Edge case: missing title + it('should return 400 when title is missing', async () => { + const res = await request(app).post('/tasks').send({ description: 'no title' }); + expect(res.status).toBe(400); + expect(res.body.error).toBeDefined(); + }); + + // Edge case: empty title + it('should return 400 when title is an empty string', async () => { + const res = await createTask({ title: '' }); + expect(res.status).toBe(400); + expect(res.body.error).toBeDefined(); + }); + + // Edge case: whitespace-only title + it('should return 400 when title is only whitespace', async () => { + const res = await createTask({ title: ' ' }); + expect(res.status).toBe(400); + }); + + // Edge case: invalid status + it('should return 400 for invalid status value', async () => { + const res = await createTask({ title: 'Bad Status', status: 'invalid' }); + expect(res.status).toBe(400); + expect(res.body.error).toContain('status'); + }); + + // Edge case: invalid priority + it('should return 400 for invalid priority value', async () => { + const res = await createTask({ title: 'Bad Priority', priority: 'urgent' }); + expect(res.status).toBe(400); + expect(res.body.error).toContain('priority'); + }); + + // Edge case: invalid dueDate + it('should return 400 for an invalid dueDate', async () => { + const res = await createTask({ title: 'Bad Date', dueDate: 'not-a-date' }); + expect(res.status).toBe(400); + expect(res.body.error).toContain('dueDate'); + }); + + it('should accept a valid dueDate', async () => { + const res = await createTask({ + title: 'With Date', + dueDate: '2026-12-25T00:00:00.000Z', + }); + expect(res.status).toBe(201); + expect(res.body.dueDate).toBe('2026-12-25T00:00:00.000Z'); + }); +}); + +// ========================================================== +// GET /tasks — List tasks +// ========================================================== +describe('GET /tasks', () => { + it('should return an empty array when no tasks exist', async () => { + const res = await request(app).get('/tasks'); + expect(res.status).toBe(200); + expect(res.body).toEqual([]); + }); + + it('should return all tasks', async () => { + await createTask({ title: 'Task 1' }); + await createTask({ title: 'Task 2' }); + + const res = await request(app).get('/tasks'); + expect(res.status).toBe(200); + expect(res.body).toHaveLength(2); + }); +}); + +// ========================================================== +// GET /tasks?status= — Filter by status +// ========================================================== +describe('GET /tasks?status=', () => { + it('should filter tasks by status', async () => { + await createTask({ title: 'Todo', status: 'todo' }); + await createTask({ title: 'Done', status: 'done' }); + + const res = await request(app).get('/tasks?status=todo'); + expect(res.status).toBe(200); + expect(res.body).toHaveLength(1); + expect(res.body[0].title).toBe('Todo'); + }); + + it('should return empty array when no tasks match the status', async () => { + await createTask({ title: 'Todo', status: 'todo' }); + const res = await request(app).get('/tasks?status=in_progress'); + expect(res.status).toBe(200); + expect(res.body).toEqual([]); + }); + + // Edge case — BUG: partial status match via includes() + it('should not partially match status values', () => { + taskService.create({ title: 'Completed', status: 'done' }); + + const result = taskService.getByStatus('do'); + expect(result).toHaveLength(0); +}); +}); + +// ========================================================== +// GET /tasks?page=&limit= — Pagination +// ========================================================== +describe('GET /tasks?page=&limit=', () => { + beforeEach(async () => { + for (let i = 1; i <= 12; i++) { + await createTask({ title: `Task ${i}` }); + } + }); + + it('should return the first 5 items for page 1', async () => { + const res = await request(app).get('/tasks?page=1&limit=5'); + expect(res.status).toBe(200); + expect(res.body).toHaveLength(5); + expect(res.body[0].title).toBe('Task 1'); + expect(res.body[4].title).toBe('Task 5'); + }); + + it('should use default limit of 10 when not specified', async () => { + const res = await request(app).get('/tasks?page=1'); + expect(res.status).toBe(200); + expect(res.body).toHaveLength(10); + }); + + it('should return empty array for a page beyond available data', async () => { + const res = await request(app).get('/tasks?page=999&limit=5'); + expect(res.status).toBe(200); + expect(res.body).toEqual([]); + }); +}); + +// ========================================================== +// PUT /tasks/:id — Update a task +// ========================================================== +describe('PUT /tasks/:id', () => { + it('should update a task and return 200', async () => { + const createRes = await createTask({ title: 'Original' }); + const id = createRes.body.id; + + const res = await request(app) + .put(`/tasks/${id}`) + .send({ title: 'Updated Title', priority: 'high' }); + + expect(res.status).toBe(200); + expect(res.body.title).toBe('Updated Title'); + expect(res.body.priority).toBe('high'); + expect(res.body.id).toBe(id); + }); + + it('should return 404 when task does not exist', async () => { + const res = await request(app) + .put('/tasks/nonexistent-id') + .send({ title: 'Ghost' }); + + expect(res.status).toBe(404); + expect(res.body.error).toBeDefined(); + }); + + // Edge case: empty title + it('should return 400 when title is set to empty string', async () => { + const createRes = await createTask({ title: 'Valid' }); + const res = await request(app) + .put(`/tasks/${createRes.body.id}`) + .send({ title: '' }); + + expect(res.status).toBe(400); + }); + + // Edge case: invalid status + it('should return 400 for invalid status on update', async () => { + const createRes = await createTask({ title: 'Valid' }); + const res = await request(app) + .put(`/tasks/${createRes.body.id}`) + .send({ status: 'invalid_status' }); + + expect(res.status).toBe(400); + }); + + // Edge case: invalid priority on update + it('should return 400 for invalid priority on update', async () => { + const createRes = await createTask({ title: 'Valid' }); + const res = await request(app) + .put(`/tasks/${createRes.body.id}`) + .send({ priority: 'critical' }); + + expect(res.status).toBe(400); + }); + + it('should allow partial updates (only update one field)', async () => { + const createRes = await createTask({ title: 'Original', priority: 'low' }); + const id = createRes.body.id; + + const res = await request(app) + .put(`/tasks/${id}`) + .send({ priority: 'high' }); + + expect(res.status).toBe(200); + expect(res.body.priority).toBe('high'); + expect(res.body.title).toBe('Original'); // untouched + }); +}); + +// ========================================================== +// DELETE /tasks/:id — Delete a task +// ========================================================== +describe('DELETE /tasks/:id', () => { + it('should delete a task and return 204', async () => { + const createRes = await createTask({ title: 'Delete Me' }); + const id = createRes.body.id; + + const res = await request(app).delete(`/tasks/${id}`); + expect(res.status).toBe(204); + + // verify its gone + const getRes = await request(app).get('/tasks'); + expect(getRes.body).toHaveLength(0); + }); + + it('should return 404 when task does not exist', async () => { + const res = await request(app).delete('/tasks/nonexistent-id'); + expect(res.status).toBe(404); + expect(res.body.error).toBeDefined(); + }); + + // edge case- double delete + it('should return 404 on second delete of the same task', async () => { + const createRes = await createTask({ title: 'Delete Twice' }); + const id = createRes.body.id; + + await request(app).delete(`/tasks/${id}`); + const res = await request(app).delete(`/tasks/${id}`); + + expect(res.status).toBe(404); + }); +}); + +// mark as complete + +describe('PATCH /tasks/:id/complete', () => { + it('should mark a task as done and set completedAt', async () => { + const createRes = await createTask({ title: 'Complete Me' }); + const id = createRes.body.id; + + const res = await request(app).patch(`/tasks/${id}/complete`); + + expect(res.status).toBe(200); + expect(res.body.status).toBe('done'); + expect(res.body.completedAt).toBeDefined(); + }); + + it('should return 404 when task does not exist', async () => { + const res = await request(app).patch('/tasks/nonexistent-id/complete'); + expect(res.status).toBe(404); + expect(res.body.error).toBeDefined(); + }); + + it('should preserve priority when completing task', () => { + const task = taskService.create({ + title:'Urgent', + priority:'high' + }); + + const completed = taskService.completeTask(task.id); + expect(completed.priority).toBe('high'); +}); + + // Edge case: complete an already completed task + it('should allow completing an already-done task (idempotent)', async () => { + const createRes = await createTask({ title: 'Already Done', status: 'done' }); + const id = createRes.body.id; + + const res = await request(app).patch(`/tasks/${id}/complete`); + expect(res.status).toBe(200); + expect(res.body.status).toBe('done'); + }); + + it('should not change completedAt when completing already completed task', async()=>{ + const createRes = await createTask({ + title:'Done', + status:'done' + }); + + const first = await request(app) + .patch(`/tasks/${createRes.body.id}/complete`); + + const second = await request(app) + .patch(`/tasks/${createRes.body.id}/complete`); + + expect(second.body.completedAt) + .toBe(first.body.completedAt); + }); +}); + +// ========================================================== +// PATCH /tasks/:id/assign — Assign a task +// ========================================================== +describe('PATCH /tasks/:id/assign', () => { + it('should assign a person to a task and return 200', async () => { + const createRes = await createTask({ title: 'Assign Me' }); + const id = createRes.body.id; + + const res = await request(app) + .patch(`/tasks/${id}/assign`) + .send({ assignee: 'Alice' }); + + expect(res.status).toBe(200); + expect(res.body.assignee).toBe('Alice'); + expect(res.body.id).toBe(id); + expect(res.body.title).toBe('Assign Me'); + }); + + it('should return 404 when task does not exist', async () => { + const res = await request(app) + .patch('/tasks/nonexistent-id/assign') + .send({ assignee: 'Bob' }); + + expect(res.status).toBe(404); + expect(res.body.error).toBeDefined(); + }); + + // Edge case: missing assignee field + it('should return 400 when assignee field is missing', async () => { + const createRes = await createTask({ title: 'No Assignee' }); + const res = await request(app) + .patch(`/tasks/${createRes.body.id}/assign`) + .send({}); + + expect(res.status).toBe(400); + expect(res.body.error).toContain('assignee'); + }); + + // Edge case: empty string assignee + it('should return 400 when assignee is an empty string', async () => { + const createRes = await createTask({ title: 'Empty Assignee' }); + const res = await request(app) + .patch(`/tasks/${createRes.body.id}/assign`) + .send({ assignee: '' }); + + expect(res.status).toBe(400); + expect(res.body.error).toContain('assignee'); + }); + + // Edge case: whitespace-only assignee + it('should return 400 when assignee is only whitespace', async () => { + const createRes = await createTask({ title: 'Whitespace' }); + const res = await request(app) + .patch(`/tasks/${createRes.body.id}/assign`) + .send({ assignee: ' ' }); + + expect(res.status).toBe(400); + }); + + // Edge case: non-string assignee + it('should return 400 when assignee is not a string', async () => { + const createRes = await createTask({ title: 'Number' }); + const res = await request(app) + .patch(`/tasks/${createRes.body.id}/assign`) + .send({ assignee: 123 }); + + expect(res.status).toBe(400); + }); + + // Edge case: reassignment (task already assigned) + it('should allow reassigning a task to a different person', async () => { + const createRes = await createTask({ title: 'Reassign' }); + const id = createRes.body.id; + + await request(app).patch(`/tasks/${id}/assign`).send({ assignee: 'Alice' }); + const res = await request(app).patch(`/tasks/${id}/assign`).send({ assignee: 'Bob' }); + + expect(res.status).toBe(200); + expect(res.body.assignee).toBe('Bob'); + }); + + // Edge case: assignee with leading/trailing whitespace should be trimmed + it('should trim whitespace from assignee name', async () => { + const createRes = await createTask({ title: 'Trim Test' }); + const res = await request(app) + .patch(`/tasks/${createRes.body.id}/assign`) + .send({ assignee: ' Alice ' }); + + expect(res.status).toBe(200); + expect(res.body.assignee).toBe('Alice'); + }); + + // Verify new tasks start with assignee: null + it('should show assignee as null on newly created tasks', async () => { + const res = await createTask({ title: 'Fresh Task' }); + expect(res.body.assignee).toBeNull(); + }); +}); + +// ========================================================== +// GET /tasks/stats — Stats endpoint +// ========================================================== +describe('GET /tasks/stats', () => { + it('should return zero counts when no tasks exist', async () => { + const res = await request(app).get('/tasks/stats'); + expect(res.status).toBe(200); + expect(res.body).toEqual({ todo: 0, in_progress: 0, done: 0, overdue: 0 }); + }); + + it('should return correct counts by status', async () => { + await createTask({ title: 'A', status: 'todo' }); + await createTask({ title: 'B', status: 'todo' }); + await createTask({ title: 'C', status: 'in_progress' }); + await createTask({ title: 'D', status: 'done' }); + + const res = await request(app).get('/tasks/stats'); + expect(res.status).toBe(200); + expect(res.body.todo).toBe(2); + expect(res.body.in_progress).toBe(1); + expect(res.body.done).toBe(1); + }); + + it('should count overdue tasks correctly', async () => { + // Overdue: past due date + not done + await createTask({ + title: 'Overdue', + status: 'todo', + dueDate: '2020-01-01T00:00:00.000Z', + }); + // Not overdue: past due date but done + await createTask({ + title: 'Done Past', + status: 'done', + dueDate: '2020-01-01T00:00:00.000Z', + }); + // Not overdue: future due date + await createTask({ + title: 'Future', + status: 'todo', + dueDate: '2099-12-31T00:00:00.000Z', + }); + + const res = await request(app).get('/tasks/stats'); + expect(res.body.overdue).toBe(1); + }); + + // Edge case: tasks with no dueDate are never overdue + it('should not count tasks without dueDate as overdue', async () => { + await createTask({ title: 'No Date', status: 'todo' }); + const res = await request(app).get('/tasks/stats'); + expect(res.body.overdue).toBe(0); + }); +}); + +// ========================================================== +// Edge case: Unknown routes +// ========================================================== +describe('Unknown routes', () => { + it('should return 404 for an unknown path', async () => { + const res = await request(app).get('/unknown-path'); + expect(res.status).toBe(404); + }); +}); diff --git a/task-api/tests/taskService.test.js b/task-api/tests/taskService.test.js new file mode 100644 index 00000000..a6f66164 --- /dev/null +++ b/task-api/tests/taskService.test.js @@ -0,0 +1,325 @@ +const taskService = require('../src/services/taskService'); + +// reset the in-memory store before each test +beforeEach(() => { + taskService._reset(); +}); + +// create + +describe('taskService.create', () => { + it('should create a task with all default fields populated', () => { + const task = taskService.create({ title: 'My Task' }); + + expect(task).toMatchObject({ + title: 'My Task', + description: '', + status: 'todo', + priority: 'medium', + dueDate: null, + completedAt: null, + }); + expect(task.id).toBeDefined(); + expect(task.createdAt).toBeDefined(); + }); + + it('should create a task with all provided fields', () => { + const input = { + title: 'Full Task', + description: 'detailed description', + status: 'in_progress', + priority: 'high', + dueDate: '2026-12-31T00:00:00.000Z', + }; + const task = taskService.create(input); + + expect(task.title).toBe('Full Task'); + expect(task.description).toBe('detailed description'); + expect(task.status).toBe('in_progress'); + expect(task.priority).toBe('high'); + expect(task.dueDate).toBe('2026-12-31T00:00:00.000Z'); + }); + + it('should generate unique IDs for each task', () => { + const t1 = taskService.create({ title: 'Task A' }); + const t2 = taskService.create({ title: 'Task B' }); + expect(t1.id).not.toBe(t2.id); + }); +}); + +// GET ALL + +describe('taskService.getAll', () => { + it('should return an empty array when no tasks exist', () => { + expect(taskService.getAll()).toEqual([]); + }); + + it('should return all created tasks', () => { + taskService.create({ title: 'A' }); + taskService.create({ title: 'B' }); + expect(taskService.getAll()).toHaveLength(2); + }); + + it('should return a copy, not the internal array reference', () => { + taskService.create({ title: 'A' }); + const all = taskService.getAll(); + all.push({ fake: true }); + // internal store should be unaffected + expect(taskService.getAll()).toHaveLength(1); + }); +}); + +// ───────────────────────────────────────────────────────── +// FIND BY ID +// ───────────────────────────────────────────────────────── +describe('taskService.findById', () => { + it('should find a task by its ID', () => { + const task = taskService.create({ title: 'Find Me' }); + const found = taskService.findById(task.id); + expect(found).toBeDefined(); + expect(found.title).toBe('Find Me'); + }); + + it('should return undefined for a non-existent ID', () => { + expect(taskService.findById('non-existent-id')).toBeUndefined(); + }); +}); + +// ───────────────────────────────────────────────────────── +// GET BY STATUS +// ───────────────────────────────────────────────────────── +describe('taskService.getByStatus', () => { + it('should filter tasks by status', () => { + taskService.create({ title: 'Todo 1', status: 'todo' }); + taskService.create({ title: 'In Prog', status: 'in_progress' }); + taskService.create({ title: 'Done', status: 'done' }); + + const todoTasks = taskService.getByStatus('todo'); + expect(todoTasks).toHaveLength(1); + expect(todoTasks[0].title).toBe('Todo 1'); + }); + + it('should return an empty array when no tasks match the status', () => { + taskService.create({ title: 'Todo', status: 'todo' }); + const result = taskService.getByStatus('done'); + expect(result).toEqual([]); + }); + + it('should not partially match status values', () => { + taskService.create({ title: 'Completed', status: 'done' }); + + const result = taskService.getByStatus('do'); + + expect(result).toHaveLength(0); + }); +}); + +// ───────────────────────────────────────────────────────── +// GET PAGINATED +// ───────────────────────────────────────────────────────── +describe('taskService.getPaginated', () => { + beforeEach(() => { + for (let i = 1; i <= 15; i++) { + taskService.create({ title: `Task ${i}` }); + } + }); + + it('should return the first 5 items for page 1 with limit 5', () => { + const result = taskService.getPaginated(1, 5); + expect(result).toHaveLength(5); + expect(result[0].title).toBe('Task 1'); + expect(result[4].title).toBe('Task 5'); + }); + + it('should return items 6-10 for page 2 with limit 5', () => { + const result = taskService.getPaginated(2, 5); + expect(result).toHaveLength(5); + expect(result[0].title).toBe('Task 6'); + expect(result[4].title).toBe('Task 10'); + }); + + it('should return empty array when page exceeds available data', () => { + const result = taskService.getPaginated(100, 5); + expect(result).toEqual([]); + }); +}); + +// ───────────────────────────────────────────────────────── +// GET STATS +// ───────────────────────────────────────────────────────── +describe('taskService.getStats', () => { + it('should return zero counts when no tasks exist', () => { + const stats = taskService.getStats(); + expect(stats).toEqual({ todo: 0, in_progress: 0, done: 0, overdue: 0 }); + }); + + it('should count tasks by status correctly', () => { + taskService.create({ title: 'A', status: 'todo' }); + taskService.create({ title: 'B', status: 'todo' }); + taskService.create({ title: 'C', status: 'in_progress' }); + taskService.create({ title: 'D', status: 'done' }); + + const stats = taskService.getStats(); + expect(stats.todo).toBe(2); + expect(stats.in_progress).toBe(1); + expect(stats.done).toBe(1); + }); + + it('should count overdue tasks (past dueDate + not done)', () => { + taskService.create({ + title: 'Overdue', + status: 'todo', + dueDate: '2020-01-01T00:00:00.000Z', + }); + taskService.create({ + title: 'Not Overdue', + status: 'done', + dueDate: '2020-01-01T00:00:00.000Z', + }); + + const stats = taskService.getStats(); + expect(stats.overdue).toBe(1); + }); + + it('should NOT count tasks with future dueDate as overdue', () => { + taskService.create({ + title: 'Future', + status: 'todo', + dueDate: '2099-12-31T00:00:00.000Z', + }); + const stats = taskService.getStats(); + expect(stats.overdue).toBe(0); + }); +}); + +// ───────────────────────────────────────────────────────── +// UPDATE +// ───────────────────────────────────────────────────────── +describe('taskService.update', () => { + it('should update specific fields of a task', () => { + const task = taskService.create({ title: 'Original' }); + const updated = taskService.update(task.id, { title: 'Updated', priority: 'high' }); + + expect(updated.title).toBe('Updated'); + expect(updated.priority).toBe('high'); + expect(updated.id).toBe(task.id); + }); + + it('should return null when task ID does not exist', () => { + const result = taskService.update('nonexistent', { title: 'Nope' }); + expect(result).toBeNull(); + }); + + it('should persist the update in the store', () => { + const task = taskService.create({ title: 'Before' }); + taskService.update(task.id, { title: 'After' }); + const found = taskService.findById(task.id); + expect(found.title).toBe('After'); + }); +}); + +// ───────────────────────────────────────────────────────── +// REMOVE +// ───────────────────────────────────────────────────────── +describe('taskService.remove', () => { + it('should remove a task and return true', () => { + const task = taskService.create({ title: 'Delete Me' }); + const result = taskService.remove(task.id); + expect(result).toBe(true); + expect(taskService.findById(task.id)).toBeUndefined(); + }); + + it('should return false when task ID does not exist', () => { + expect(taskService.remove('nonexistent')).toBe(false); + }); + + it('should reduce the total task count by one', () => { + taskService.create({ title: 'A' }); + const task = taskService.create({ title: 'B' }); + taskService.remove(task.id); + expect(taskService.getAll()).toHaveLength(1); + }); +}); + +// ───────────────────────────────────────────────────────── +// COMPLETE TASK +// ───────────────────────────────────────────────────────── +describe('taskService.completeTask', () => { + it('should mark a task as done and set completedAt', () => { + const task = taskService.create({ title: 'Finish this', status: 'todo' }); + const completed = taskService.completeTask(task.id); + + expect(completed.status).toBe('done'); + expect(completed.completedAt).toBeDefined(); + expect(new Date(completed.completedAt).getTime()).not.toBeNaN(); + }); + + it('should return null for a non-existent task', () => { + expect(taskService.completeTask('nonexistent')).toBeNull(); + }); + + // BUG: completeTask silently resets priority to 'medium'. + it('BUG — completeTask resets priority to medium regardless of original priority', () => { + const task = taskService.create({ title: 'Urgent', priority: 'high' }); + const completed = taskService.completeTask(task.id); + // The bug forces priority to 'medium' + expect(completed.priority).toBe('high'); // BUG: should remain 'high' + }); + + it('should persist the completion in the store', () => { + const task = taskService.create({ title: 'Persist test' }); + taskService.completeTask(task.id); + const found = taskService.findById(task.id); + expect(found.status).toBe('done'); + expect(found.completedAt).toBeDefined(); + }); +}); + +// ───────────────────────────────────────────────────────── +// ASSIGN TASK +// ───────────────────────────────────────────────────────── +describe('taskService.assignTask', () => { + it('should assign a person to a task', () => { + const task = taskService.create({ title: 'Assign Me' }); + const result = taskService.assignTask(task.id, 'Alice'); + + expect(result.assignee).toBe('Alice'); + expect(result.id).toBe(task.id); + }); + + it('should return null for a non-existent task', () => { + expect(taskService.assignTask('nonexistent', 'Bob')).toBeNull(); + }); + + it('should allow reassigning a task to a different person', () => { + const task = taskService.create({ title: 'Reassign Me' }); + taskService.assignTask(task.id, 'Alice'); + const result = taskService.assignTask(task.id, 'Bob'); + + expect(result.assignee).toBe('Bob'); + }); + + it('should persist the assignment in the store', () => { + const task = taskService.create({ title: 'Persist' }); + taskService.assignTask(task.id, 'Charlie'); + const found = taskService.findById(task.id); + expect(found.assignee).toBe('Charlie'); + }); + + it('should default assignee to null on task creation', () => { + const task = taskService.create({ title: 'No Assignee' }); + expect(task.assignee).toBeNull(); + }); +}); + +// ───────────────────────────────────────────────────────── +// _RESET (test utility) +// ───────────────────────────────────────────────────────── +describe('taskService._reset', () => { + it('should clear all tasks', () => { + taskService.create({ title: 'A' }); + taskService.create({ title: 'B' }); + taskService._reset(); + expect(taskService.getAll()).toEqual([]); + }); +}); From 003545f60943fa42979b3d7d75e13bb92cf0d6ef Mon Sep 17 00:00:00 2001 From: Himesh Badlani Date: Wed, 15 Jul 2026 01:19:00 +0530 Subject: [PATCH 2/4] refactor: clean up comments and improve readability in tests --- task-api/tests/api.test.js | 29 ++++++-------------------- task-api/tests/taskService.test.js | 33 +++++++++--------------------- 2 files changed, 16 insertions(+), 46 deletions(-) diff --git a/task-api/tests/api.test.js b/task-api/tests/api.test.js index 947dca56..77e95d20 100644 --- a/task-api/tests/api.test.js +++ b/task-api/tests/api.test.js @@ -2,22 +2,20 @@ const request = require('supertest'); const app = require('../src/app'); const taskService = require('../src/services/taskService'); -// Reset the in-memory store before each test to ensure isolation +// Reset the in-memory store before each test beforeEach(() => { taskService._reset(); }); -// ───────────────────────────────────────────────────────── // Helper: quickly create a task via the API -// ───────────────────────────────────────────────────────── const createTask = (overrides = {}) => request(app) .post('/tasks') .send({ title: 'Test Task', ...overrides }); -// ========================================================== + // POST /tasks — Create a task -// ========================================================== + describe('POST /tasks', () => { it('should create a task with valid data and return 201', async () => { const res = await createTask({ title: 'New Task', priority: 'high' }); @@ -94,9 +92,7 @@ describe('POST /tasks', () => { }); }); -// ========================================================== // GET /tasks — List tasks -// ========================================================== describe('GET /tasks', () => { it('should return an empty array when no tasks exist', async () => { const res = await request(app).get('/tasks'); @@ -114,9 +110,7 @@ describe('GET /tasks', () => { }); }); -// ========================================================== // GET /tasks?status= — Filter by status -// ========================================================== describe('GET /tasks?status=', () => { it('should filter tasks by status', async () => { await createTask({ title: 'Todo', status: 'todo' }); @@ -135,7 +129,7 @@ describe('GET /tasks?status=', () => { expect(res.body).toEqual([]); }); - // Edge case — BUG: partial status match via includes() + // Edge case — partial status match via includes() it('should not partially match status values', () => { taskService.create({ title: 'Completed', status: 'done' }); @@ -144,9 +138,7 @@ describe('GET /tasks?status=', () => { }); }); -// ========================================================== // GET /tasks?page=&limit= — Pagination -// ========================================================== describe('GET /tasks?page=&limit=', () => { beforeEach(async () => { for (let i = 1; i <= 12; i++) { @@ -175,9 +167,8 @@ describe('GET /tasks?page=&limit=', () => { }); }); -// ========================================================== // PUT /tasks/:id — Update a task -// ========================================================== + describe('PUT /tasks/:id', () => { it('should update a task and return 200', async () => { const createRes = await createTask({ title: 'Original' }); @@ -242,13 +233,11 @@ describe('PUT /tasks/:id', () => { expect(res.status).toBe(200); expect(res.body.priority).toBe('high'); - expect(res.body.title).toBe('Original'); // untouched + expect(res.body.title).toBe('Original'); }); }); -// ========================================================== // DELETE /tasks/:id — Delete a task -// ========================================================== describe('DELETE /tasks/:id', () => { it('should delete a task and return 204', async () => { const createRes = await createTask({ title: 'Delete Me' }); @@ -337,9 +326,7 @@ describe('PATCH /tasks/:id/complete', () => { }); }); -// ========================================================== // PATCH /tasks/:id/assign — Assign a task -// ========================================================== describe('PATCH /tasks/:id/assign', () => { it('should assign a person to a task and return 200', async () => { const createRes = await createTask({ title: 'Assign Me' }); @@ -436,9 +423,7 @@ describe('PATCH /tasks/:id/assign', () => { }); }); -// ========================================================== // GET /tasks/stats — Stats endpoint -// ========================================================== describe('GET /tasks/stats', () => { it('should return zero counts when no tasks exist', async () => { const res = await request(app).get('/tasks/stats'); @@ -491,9 +476,7 @@ describe('GET /tasks/stats', () => { }); }); -// ========================================================== // Edge case: Unknown routes -// ========================================================== describe('Unknown routes', () => { it('should return 404 for an unknown path', async () => { const res = await request(app).get('/unknown-path'); diff --git a/task-api/tests/taskService.test.js b/task-api/tests/taskService.test.js index a6f66164..a8185a5c 100644 --- a/task-api/tests/taskService.test.js +++ b/task-api/tests/taskService.test.js @@ -5,7 +5,7 @@ beforeEach(() => { taskService._reset(); }); -// create +// Create a task via the API describe('taskService.create', () => { it('should create a task with all default fields populated', () => { @@ -69,9 +69,7 @@ describe('taskService.getAll', () => { }); }); -// ───────────────────────────────────────────────────────── // FIND BY ID -// ───────────────────────────────────────────────────────── describe('taskService.findById', () => { it('should find a task by its ID', () => { const task = taskService.create({ title: 'Find Me' }); @@ -85,9 +83,8 @@ describe('taskService.findById', () => { }); }); -// ───────────────────────────────────────────────────────── // GET BY STATUS -// ───────────────────────────────────────────────────────── +// describe('taskService.getByStatus', () => { it('should filter tasks by status', () => { taskService.create({ title: 'Todo 1', status: 'todo' }); @@ -114,9 +111,7 @@ describe('taskService.getByStatus', () => { }); }); -// ───────────────────────────────────────────────────────── // GET PAGINATED -// ───────────────────────────────────────────────────────── describe('taskService.getPaginated', () => { beforeEach(() => { for (let i = 1; i <= 15; i++) { @@ -144,9 +139,7 @@ describe('taskService.getPaginated', () => { }); }); -// ───────────────────────────────────────────────────────── // GET STATS -// ───────────────────────────────────────────────────────── describe('taskService.getStats', () => { it('should return zero counts when no tasks exist', () => { const stats = taskService.getStats(); @@ -192,9 +185,9 @@ describe('taskService.getStats', () => { }); }); -// ───────────────────────────────────────────────────────── +// // UPDATE -// ───────────────────────────────────────────────────────── +// describe('taskService.update', () => { it('should update specific fields of a task', () => { const task = taskService.create({ title: 'Original' }); @@ -218,9 +211,7 @@ describe('taskService.update', () => { }); }); -// ───────────────────────────────────────────────────────── // REMOVE -// ───────────────────────────────────────────────────────── describe('taskService.remove', () => { it('should remove a task and return true', () => { const task = taskService.create({ title: 'Delete Me' }); @@ -241,9 +232,8 @@ describe('taskService.remove', () => { }); }); -// ───────────────────────────────────────────────────────── +// // COMPLETE TASK -// ───────────────────────────────────────────────────────── describe('taskService.completeTask', () => { it('should mark a task as done and set completedAt', () => { const task = taskService.create({ title: 'Finish this', status: 'todo' }); @@ -258,12 +248,12 @@ describe('taskService.completeTask', () => { expect(taskService.completeTask('nonexistent')).toBeNull(); }); - // BUG: completeTask silently resets priority to 'medium'. - it('BUG — completeTask resets priority to medium regardless of original priority', () => { + // completeTask silently resets priority to 'medium'. + it('completeTask resets priority to medium regardless of original priority', () => { const task = taskService.create({ title: 'Urgent', priority: 'high' }); const completed = taskService.completeTask(task.id); - // The bug forces priority to 'medium' - expect(completed.priority).toBe('high'); // BUG: should remain 'high' + + expect(completed.priority).toBe('high'); }); it('should persist the completion in the store', () => { @@ -275,9 +265,8 @@ describe('taskService.completeTask', () => { }); }); -// ───────────────────────────────────────────────────────── + // ASSIGN TASK -// ───────────────────────────────────────────────────────── describe('taskService.assignTask', () => { it('should assign a person to a task', () => { const task = taskService.create({ title: 'Assign Me' }); @@ -312,9 +301,7 @@ describe('taskService.assignTask', () => { }); }); -// ───────────────────────────────────────────────────────── // _RESET (test utility) -// ───────────────────────────────────────────────────────── describe('taskService._reset', () => { it('should clear all tasks', () => { taskService.create({ title: 'A' }); From 22e4a0b2edd67985b05121df6b26e3fb85aa2285 Mon Sep 17 00:00:00 2001 From: Himesh Badlani Date: Wed, 15 Jul 2026 01:27:07 +0530 Subject: [PATCH 3/4] docs: add comprehensive README and bug report detailing testing, fixes, and new features --- task-api/BUG_REPORT.md | 206 ++++++++++++++++++++++++++++++++++++++ task-api/Readme.md | 220 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 426 insertions(+) create mode 100644 task-api/BUG_REPORT.md create mode 100644 task-api/Readme.md diff --git a/task-api/BUG_REPORT.md b/task-api/BUG_REPORT.md new file mode 100644 index 00000000..9f580336 --- /dev/null +++ b/task-api/BUG_REPORT.md @@ -0,0 +1,206 @@ +# Bug Report – Task Manager API + +**Author:** Himesh +**Date:** 2026-07-15 + +## Overview + +While writing unit and integration tests for the Task Manager API, I identified several issues related to pagination, task filtering, and task completion. The bugs below were discovered through a combination of code review and automated testing. + +--- + +## Summary + +| Bug | Severity | Status | +| ---------------------------------------- | -------- | ------- | +| Pagination offset calculation | Critical | ✅ Fixed | +| Status filtering uses substring matching | Medium | ✅ Fixed | +| Task completion resets priority | Medium | ✅ Fixed | + +--- + +# Bug #1 – Pagination Returns Incorrect Results + +**Severity:** Critical + +## Expected Behavior + +Pagination should treat the `page` parameter as **1-indexed**. + +Example: + +``` +GET /tasks?page=1&limit=5 +``` + +should return the first five tasks. + +--- + +## Actual Behavior + +The pagination offset was calculated using: + +```javascript +const offset = page * limit; +``` + +As a result: + +| Request | Expected Items | Actual Items | +| --------------- | -------------- | ------------ | +| page=1, limit=5 | 1–5 | 6–10 | +| page=2, limit=5 | 6–10 | 11–15 | + +Every paginated request skipped the first page of results. + +--- + +## How It Was Discovered + +While writing pagination tests, the first task returned for page 1 did not match the expected data. Reviewing the pagination logic revealed an incorrect offset calculation. + +--- + +## Fix + +Changed: + +```javascript +const offset = page * limit; +``` + +to: + +```javascript +const offset = (page - 1) * limit; +``` + +--- + +## Test Coverage + +Verified by: + +* Unit tests for `taskService.getPaginated()` +* Integration tests for `GET /tasks?page=&limit=` + +--- + +# Bug #2 – Status Filtering Used Substring Matching + +**Severity:** Medium + +## Expected Behavior + +Filtering tasks by status should return only tasks whose status exactly matches the requested value. + +Example: + +``` +GET /tasks?status=todo +``` + +should only return tasks with status `"todo"`. + +--- + +## Actual Behavior + +The filtering logic used substring matching. + +Example: + +``` +GET /tasks?status=do +``` + +incorrectly returned tasks whose status was `"done"`. + +--- + +## How It Was Discovered + +A unit test querying `"do"` unexpectedly matched `"done"` tasks. Code review showed that the implementation used `String.prototype.includes()` instead of strict equality. + +--- + +## Fix + +Changed: + +```javascript +task.status.includes(status) +``` + +to: + +```javascript +task.status === status +``` + +--- + +## Test Coverage + +Verified by: + +* Unit tests for `taskService.getByStatus()` +* Integration tests for `GET /tasks?status=` + +--- + +# Bug #3 – Completing a Task Reset Priority + +**Severity:** Medium + +## Expected Behavior + +Completing a task should only update: + +* `status` +* `completedAt` + +All other task properties should remain unchanged. + +--- + +## Actual Behavior + +Completing a task overwrote the existing priority, causing a task marked as `"high"` priority to become `"medium"` after completion. + +This resulted in unintended modification of task data unrelated to completion. + +--- + +## How It Was Discovered + +A unit test created a high-priority task, completed it, and verified that the priority should remain unchanged. The test exposed the issue during implementation. + +--- + +## Fix + +Updated the completion logic to preserve all existing task properties and modify only: + +* `status` +* `completedAt` + +The original priority is now retained after task completion. + +--- + +## Test Coverage + +Verified by: + +* Unit tests for `taskService.completeTask()` +* Integration tests for `PATCH /tasks/:id/complete` + +--- + +# Conclusion + +Automated testing helped uncover issues that were not immediately visible during manual inspection. These tests now serve as regression tests to ensure that the corrected behavior remains intact in future changes. + +The identified issues have been documented, reproduced through automated tests, and fixed as part of this submission. diff --git a/task-api/Readme.md b/task-api/Readme.md new file mode 100644 index 00000000..da998347 --- /dev/null +++ b/task-api/Readme.md @@ -0,0 +1,220 @@ +# Task Manager API – Take-Home Assignment + +## Overview + +This repository contains my solution for the Task Manager API take-home assignment. + +The objective of the assignment was to understand an unfamiliar codebase, write automated tests, identify bugs, fix one bug, and implement a new feature while maintaining good code quality. + +--- + +# Completed Tasks + +## ✅ Unit Tests + +Added comprehensive unit tests for `taskService.js`, covering: + +* Task creation +* Task retrieval +* Find by ID +* Status filtering +* Pagination +* Statistics +* Task updates +* Task deletion +* Task completion +* Task assignment +* Reset functionality + +--- + +## ✅ Integration Tests + +Added API integration tests using **Jest** and **Supertest** covering: + +* POST `/tasks` +* GET `/tasks` +* GET `/tasks?status=` +* GET `/tasks?page=&limit=` +* PUT `/tasks/:id` +* DELETE `/tasks/:id` +* PATCH `/tasks/:id/complete` +* PATCH `/tasks/:id/assign` +* GET `/tasks/stats` + +Each endpoint includes both happy-path and edge-case scenarios. + +--- + +## ✅ Bug Investigation + +During testing, multiple issues were identified and documented in **BUG_REPORT.md**. + +The report includes: + +* Expected behavior +* Actual behavior +* How each issue was discovered +* Suggested fix +* Fix status + +--- + +## ✅ Bug Fix + +Fixed identified issues in the application and updated the corresponding tests to verify the corrected behavior. + +--- + +## ✅ New Feature + +Implemented the required endpoint: + +```http +PATCH /tasks/:id/assign +``` + +### Request Body + +```json +{ + "assignee": "Alice" +} +``` + +### Behavior + +* Assigns a user to a task +* Allows reassignment +* Returns the updated task +* Returns **404** if the task does not exist +* Validates missing, empty, whitespace-only, and invalid assignee values + +--- + +# Test Coverage + +The project includes: + +* Unit tests +* Integration tests +* Validation tests +* Edge-case tests +* Regression tests for discovered bugs + +Coverage summary: + +```text +Paste your coverage summary here. + +Example: + +Test Suites: 2 passed +Tests: 79 passed + +Statements : XX% +Branches : XX% +Functions : XX% +Lines : XX% +``` + +--- + +# Project Structure + +```text +task-api/ +│ +├── src/ +│ ├── routes/ +│ ├── services/ +│ └── app.js +│ +├── tests/ +│ ├── taskService.test.js +│ └── api.test.js +│ +├── BUG_REPORT.md +├── README.md +├── package.json +└── .gitignore +``` + +--- + +# Getting Started + +## Install dependencies + +```bash +npm install +``` + +--- + +## Start the server + +```bash +npm start +``` + +--- + +## Run all tests + +```bash +npm test +``` + +--- + +## Generate coverage report + +If a coverage script exists: + +```bash +npm run coverage +``` + +Otherwise: + +```bash +npx jest --coverage +``` + +--- + +# Assumptions + +* Pagination is 1-indexed. +* Tasks can be reassigned. +* Statistics are computed dynamically. +* The application uses an in-memory data store for simplicity. + +--- + +# Additional Documentation + +* **BUG_REPORT.md** – Details of the bugs identified during testing and their resolutions. + +--- + +# Future Improvements + +Given additional time, I would focus on: + +* Authentication and authorization +* Persistent database storage +* Concurrency testing +* Performance and load testing +* Security-focused validation +* API documentation (OpenAPI/Swagger) +* CI/CD integration with automated test execution + +--- + +# Author + +**Himesh** + +Take-Home Assignment Submission – 2026 From 42ae7dda916aec79c2ca9474bcd471a75fd15155 Mon Sep 17 00:00:00 2001 From: Himesh Badlani Date: Wed, 15 Jul 2026 01:40:08 +0530 Subject: [PATCH 4/4] docs: update README and BUG_REPORT with bug fix details; add test result screenshots --- README.md | 1 + screenshots/tests-passed.png | 0 task-api/BUG_REPORT.md | 6 +- task-api/Readme.md | 82 ++++++++------------------ task-api/screenshots/coverage.png | Bin 0 -> 65921 bytes task-api/screenshots/tests-passed.png | Bin 0 -> 43854 bytes 6 files changed, 28 insertions(+), 61 deletions(-) create mode 100644 screenshots/tests-passed.png create mode 100644 task-api/screenshots/coverage.png create mode 100644 task-api/screenshots/tests-passed.png diff --git a/README.md b/README.md index 5d46160c..3dbbe9d6 100644 --- a/README.md +++ b/README.md @@ -111,3 +111,4 @@ See [ASSIGNMENT.md](./ASSIGNMENT.md) for full submission requirements. At minimu - **Bug report** — what you found, where in the code, and why it's a bug (not just symptoms) - **At least one fix** — with a note on your approach - **`PATCH /tasks/:id/assign` implementation** — plus a short explanation of any design decisions (validation, edge cases, etc.) + diff --git a/screenshots/tests-passed.png b/screenshots/tests-passed.png new file mode 100644 index 00000000..e69de29b diff --git a/task-api/BUG_REPORT.md b/task-api/BUG_REPORT.md index 9f580336..6d7aa3e7 100644 --- a/task-api/BUG_REPORT.md +++ b/task-api/BUG_REPORT.md @@ -13,9 +13,9 @@ While writing unit and integration tests for the Task Manager API, I identified | Bug | Severity | Status | | ---------------------------------------- | -------- | ------- | -| Pagination offset calculation | Critical | ✅ Fixed | -| Status filtering uses substring matching | Medium | ✅ Fixed | -| Task completion resets priority | Medium | ✅ Fixed | +| Pagination offset calculation | Critical | Fixed | +| Status filtering uses substring matching | Medium | Fixed | +| Task completion resets priority | Medium | Fixed | --- diff --git a/task-api/Readme.md b/task-api/Readme.md index da998347..d7e553a9 100644 --- a/task-api/Readme.md +++ b/task-api/Readme.md @@ -10,7 +10,7 @@ The objective of the assignment was to understand an unfamiliar codebase, write # Completed Tasks -## ✅ Unit Tests +## Unit Tests Added comprehensive unit tests for `taskService.js`, covering: @@ -28,7 +28,7 @@ Added comprehensive unit tests for `taskService.js`, covering: --- -## ✅ Integration Tests +## Integration Tests Added API integration tests using **Jest** and **Supertest** covering: @@ -46,7 +46,7 @@ Each endpoint includes both happy-path and edge-case scenarios. --- -## ✅ Bug Investigation +## Bug Investigation During testing, multiple issues were identified and documented in **BUG_REPORT.md**. @@ -60,13 +60,13 @@ The report includes: --- -## ✅ Bug Fix +## Bug Fixed Fixed identified issues in the application and updated the corresponding tests to verify the corrected behavior. --- -## ✅ New Feature +## New Feature Added Implemented the required endpoint: @@ -112,28 +112,35 @@ Example: Test Suites: 2 passed Tests: 79 passed -Statements : XX% -Branches : XX% -Functions : XX% -Lines : XX% +Statements : 96.81% +Branches : 94.5% +Functions : 93.33% +Lines : 95.6% ``` --- +## Test Results + +### All Tests Passing + +![All Tests Passing](screenshots/tests-passed.png) + +### Test Coverage + +![Coverage Report](screenshots/coverage.png) + + # Project Structure ```text task-api/ │ ├── src/ -│ ├── routes/ -│ ├── services/ -│ └── app.js -│ ├── tests/ -│ ├── taskService.test.js -│ └── api.test.js -│ +├── screenshots/ +│ ├── coverage.png +│ └── tests-passed.png ├── BUG_REPORT.md ├── README.md ├── package.json @@ -142,48 +149,6 @@ task-api/ --- -# Getting Started - -## Install dependencies - -```bash -npm install -``` - ---- - -## Start the server - -```bash -npm start -``` - ---- - -## Run all tests - -```bash -npm test -``` - ---- - -## Generate coverage report - -If a coverage script exists: - -```bash -npm run coverage -``` - -Otherwise: - -```bash -npx jest --coverage -``` - ---- - # Assumptions * Pagination is 1-indexed. @@ -218,3 +183,4 @@ Given additional time, I would focus on: **Himesh** Take-Home Assignment Submission – 2026 + diff --git a/task-api/screenshots/coverage.png b/task-api/screenshots/coverage.png new file mode 100644 index 0000000000000000000000000000000000000000..6ecae19525960e4736a7cfd41fe57dcdd1d11633 GIT binary patch literal 65921 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 literal 0 HcmV?d00001 diff --git a/task-api/screenshots/tests-passed.png b/task-api/screenshots/tests-passed.png new file mode 100644 index 0000000000000000000000000000000000000000..73c397819bb0f782f81cc0e717d711549ac68586 GIT binary patch literal 43854 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 literal 0 HcmV?d00001