UNPKG

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
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'); }); });