vibe-coder-mcp
Version:
Production-ready MCP server with complete agent integration, multi-transport support, and comprehensive development automation tools for AI-assisted workflows.
122 lines (121 loc) • 6.31 kB
JavaScript
import { describe, it, expect, beforeEach, vi } from 'vitest';
import { getJobResult } from './index.js';
import { jobManager, JobStatus } from '../../services/job-manager/index.js';
vi.mock('../../services/job-manager/index.js', () => ({
jobManager: {
getJob: vi.fn(),
},
JobStatus: {
PENDING: 'pending',
RUNNING: 'running',
COMPLETED: 'completed',
FAILED: 'failed',
}
}));
vi.mock('../../logger.js', () => ({
default: {
info: vi.fn(),
warn: vi.fn(),
error: vi.fn(),
debug: vi.fn(),
}
}));
describe('getJobResult Tool Executor', () => {
const mockConfig = {
baseUrl: 'mock-url',
apiKey: 'mock-key',
geminiModel: 'mock-gemini',
perplexityModel: 'mock-perplexity',
};
const mockContext = undefined;
beforeEach(() => {
vi.clearAllMocks();
});
it('should return "Job not found" if jobManager.getJob returns undefined', async () => {
const jobId = 'non-existent-job';
const mockGetJob = jobManager.getJob;
mockGetJob.mockReturnValue(undefined);
const result = await getJobResult({ jobId }, mockConfig, mockContext);
expect(mockGetJob).toHaveBeenCalledWith(jobId);
expect(result.isError).toBe(true);
const resultWithContent = result;
expect(resultWithContent.content[0]?.text).toContain(`Job with ID "${jobId}" not found.`);
const resultWithError = result;
expect(resultWithError.errorDetails?.type).toBe('JobNotFoundError');
});
it('should return PENDING status if the job is pending', async () => {
const jobId = 'pending-job';
const mockJob = { id: jobId, status: JobStatus.PENDING };
const mockGetJob = jobManager.getJob;
mockGetJob.mockReturnValue(mockJob);
const result = await getJobResult({ jobId }, mockConfig, mockContext);
expect(mockGetJob).toHaveBeenCalledWith(jobId);
expect(result.isError).toBe(false);
const resultWithContent = result;
expect(resultWithContent.content[0]?.text).toContain(`Job "${jobId}" is currently ${JobStatus.PENDING}.`);
});
it('should return RUNNING status and progress message if the job is running', async () => {
const jobId = 'running-job';
const progressMessage = 'Processing step 2...';
const mockJob = { id: jobId, status: JobStatus.RUNNING, progressMessage };
const mockGetJob = jobManager.getJob;
mockGetJob.mockReturnValue(mockJob);
const result = await getJobResult({ jobId }, mockConfig, mockContext);
expect(mockGetJob).toHaveBeenCalledWith(jobId);
expect(result.isError).toBe(false);
const resultWithContent = result;
expect(resultWithContent.content[0]?.text).toContain(`Job "${jobId}" is currently ${JobStatus.RUNNING}.`);
expect(resultWithContent.content[0]?.text).toContain(`Progress: ${progressMessage}`);
});
it('should return RUNNING status without progress message if none is set', async () => {
const jobId = 'running-job-no-msg';
const mockJob = { id: jobId, status: JobStatus.RUNNING };
jobManager.getJob.mockReturnValue(mockJob);
const result = await getJobResult({ jobId }, mockConfig, mockContext);
expect(jobManager.getJob).toHaveBeenCalledWith(jobId);
expect(result.isError).toBe(false);
const resultWithContent = result;
expect(resultWithContent.content[0]?.text).toContain(`Job "${jobId}" is currently ${JobStatus.RUNNING}.`);
expect(result.content[0]?.text).not.toContain(`Progress:`);
});
it('should return the final result if the job is COMPLETED', async () => {
const jobId = 'completed-job';
const finalResultData = { content: [{ type: 'text', text: 'Final success data!' }], isError: false };
const mockJob = { id: jobId, status: JobStatus.COMPLETED, result: finalResultData };
jobManager.getJob.mockReturnValue(mockJob);
const result = await getJobResult({ jobId }, mockConfig, mockContext);
expect(jobManager.getJob).toHaveBeenCalledWith(jobId);
expect(result).toEqual(finalResultData);
});
it('should return the final error result if the job is FAILED', async () => {
const jobId = 'failed-job';
const finalErrorData = { content: [{ type: 'text', text: 'Job failed message' }], isError: true, errorDetails: { type: 'ToolError', message: 'Something went wrong' } };
const mockJob = { id: jobId, status: JobStatus.FAILED, result: finalErrorData };
jobManager.getJob.mockReturnValue(mockJob);
const result = await getJobResult({ jobId }, mockConfig, mockContext);
expect(jobManager.getJob).toHaveBeenCalledWith(jobId);
expect(result).toEqual(finalErrorData);
});
it('should return an error if a COMPLETED job has no result stored', async () => {
const jobId = 'completed-no-result-job';
const mockJob = { id: jobId, status: JobStatus.COMPLETED, result: undefined };
jobManager.getJob.mockReturnValue(mockJob);
const result = await getJobResult({ jobId }, mockConfig, mockContext);
expect(jobManager.getJob).toHaveBeenCalledWith(jobId);
expect(result.isError).toBe(true);
const resultWithContent = result;
expect(resultWithContent.content[0]?.text).toContain(`Job "${jobId}" is ${JobStatus.COMPLETED} but has no result stored.`);
expect(resultWithContent.errorDetails?.type).toBe('MissingJobResultError');
});
it('should return an error if a FAILED job has no result stored', async () => {
const jobId = 'failed-no-result-job';
const mockJob = { id: jobId, status: JobStatus.FAILED, result: undefined };
jobManager.getJob.mockReturnValue(mockJob);
const result = await getJobResult({ jobId }, mockConfig, mockContext);
expect(jobManager.getJob).toHaveBeenCalledWith(jobId);
expect(result.isError).toBe(true);
const resultWithContent = result;
expect(resultWithContent.content[0]?.text).toContain(`Job "${jobId}" is ${JobStatus.FAILED} but has no result stored.`);
expect(resultWithContent.errorDetails?.type).toBe('MissingJobResultError');
});
});