Skip to main content
Glama
api.test.ts•6.38 kB
import { api, createTestProject, createTestTask, TestData, Assertions } from '../helpers'; import { ProjectStatus, TaskStatus } from '../../models/types'; describe('API Integration Tests', () => { describe('Project Endpoints', () => { describe('GET /api/projects', () => { it('should return all projects', async () => { const project = await createTestProject(); const response = await api.projects.getAll(); expect(response.status).toBe(200); expect(response.body).toHaveLength(1); expect(response.body[0].id).toBe(project.id); }); it('should filter projects by status', async () => { await createTestProject({ status: ProjectStatus.COMPLETED }); const activeProject = await createTestProject({ status: ProjectStatus.IN_PROGRESS }); const response = await api.projects.getAll({ status: ProjectStatus.IN_PROGRESS }); expect(response.status).toBe(200); expect(response.body).toHaveLength(1); expect(response.body[0].id).toBe(activeProject.id); }); }); describe('POST /api/projects', () => { it('should create a new project', async () => { const projectData = TestData.project({ name: 'New Project', description: 'Project Description', status: ProjectStatus.PLANNED, }); const response = await api.projects.create(projectData); expect(response.status).toBe(201); Assertions.matchesData(response.body, projectData); Assertions.hasValidDates(response.body, ['startDate', 'endDate']); }); it('should validate required fields', async () => { const response = await api.projects.create({}); expect(response.status).toBe(400); }); }); describe('GET /api/projects/:id', () => { it('should return a project by id', async () => { const project = await createTestProject(); const response = await api.projects.getById(project.id); expect(response.status).toBe(200); expect(response.body.id).toBe(project.id); }); it('should return 404 for non-existent project', async () => { const response = await api.projects.getById('non-existent-id'); expect(response.status).toBe(404); }); }); describe('PUT /api/projects/:id', () => { it('should update a project', async () => { const project = await createTestProject(); const updateData = { name: 'Updated Project' }; const response = await api.projects.update(project.id, updateData); expect(response.status).toBe(200); expect(response.body.name).toBe(updateData.name); }); }); describe('DELETE /api/projects/:id', () => { it('should delete a project', async () => { const project = await createTestProject(); const response = await api.projects.delete(project.id); expect(response.status).toBe(200); expect(response.body.id).toBe(project.id); }); }); }); describe('Task Endpoints', () => { describe('GET /api/tasks', () => { it('should return all tasks', async () => { const project = await createTestProject(); const task = await createTestTask(project.id); const response = await api.tasks.getAll(); expect(response.status).toBe(200); expect(response.body).toHaveLength(1); expect(response.body[0].id).toBe(task.id); }); it('should filter tasks by status', async () => { const project = await createTestProject(); await createTestTask(project.id, { status: TaskStatus.COMPLETED }); const pendingTask = await createTestTask(project.id, { status: TaskStatus.TODO }); const response = await api.tasks.getAll({ status: TaskStatus.TODO }); expect(response.status).toBe(200); expect(response.body).toHaveLength(1); expect(response.body[0].id).toBe(pendingTask.id); }); }); describe('POST /api/tasks', () => { it('should create a new task', async () => { const project = await createTestProject(); const taskData = TestData.task(project.id, { title: 'New Task', assignedTo: 'user@example.com', status: TaskStatus.TODO, }); const response = await api.tasks.create(taskData); expect(response.status).toBe(201); Assertions.matchesData(response.body, taskData); Assertions.hasValidDates(response.body, ['dueDate']); }); it('should validate project existence', async () => { const taskData = TestData.task('non-existent-id', { title: 'New Task', assignedTo: 'user@example.com', status: TaskStatus.TODO, }); const response = await api.tasks.create(taskData); expect(response.status).toBe(404); }); }); describe('GET /api/tasks/project/:projectId', () => { it('should return tasks for a project', async () => { const project = await createTestProject(); const task = await createTestTask(project.id); const response = await api.tasks.getByProject(project.id); expect(response.status).toBe(200); expect(response.body).toHaveLength(1); expect(response.body[0].id).toBe(task.id); }); it('should return 404 for non-existent project', async () => { const response = await api.tasks.getByProject('non-existent-id'); expect(response.status).toBe(404); }); }); describe('PUT /api/tasks/:id', () => { it('should update a task', async () => { const project = await createTestProject(); const task = await createTestTask(project.id); const updateData = { title: 'Updated Task' }; const response = await api.tasks.update(task.id, updateData); expect(response.status).toBe(200); expect(response.body.title).toBe(updateData.title); }); }); describe('DELETE /api/tasks/:id', () => { it('should delete a task', async () => { const project = await createTestProject(); const task = await createTestTask(project.id); const response = await api.tasks.delete(task.id); expect(response.status).toBe(200); expect(response.body.id).toBe(task.id); }); }); }); });

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/jatinderbhola/mcp-taskflow-tracker-api'

If you have feedback or need assistance with the MCP directory API, please join our Discord server