UNPKG

review-copilot

Version:

ReviewCopilot - AI-powered code review assistant with customizable prompts

142 lines (141 loc) 5.98 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const review_1 = require("../review"); const review_utils_1 = require("./review.utils"); const provider_factory_1 = require("../../../providers/provider-factory"); const ora_1 = __importDefault(require("ora")); jest.useFakeTimers(); // Mock other dependencies jest.mock('../../../config/config-manager'); jest.mock('../../../utils/vcs-factory'); jest.mock('../../../providers/provider-factory'); jest.mock('../../../providers/openai-provider'); jest.mock('../../../services/git-platform-factory'); jest.mock('micromatch', () => ({ isMatch: jest.fn((file, pattern) => { if (pattern === '**/*.ts') return file.endsWith('.ts'); if (pattern === '**/*.{ts,tsx,js,jsx}') return /\.(ts|tsx|js|jsx)$/.test(file); return true; }), })); describe('reviewCommand - basic functionality', () => { const mockSpinner = ora_1.default.mockSpinnerInstance; beforeEach(() => { jest.clearAllMocks(); // Reset spinner mock state Object.values(mockSpinner).forEach((mock) => { if (typeof mock === 'function' && 'mockClear' in mock) { mock.mockClear(); } }); }); afterEach(() => { mockSpinner._cleanup(); jest.clearAllTimers(); jest.resetModules(); (0, review_utils_1.cleanupMocks)(); }); afterAll(() => { jest.restoreAllMocks(); }); it('should successfully review commits and code changes', async () => { const { mockProvider, mockConfigManager, mockVcsProvider } = (0, review_utils_1.setupMocks)(); const result = await (0, review_1.reviewCommand)({ config: 'test-config.yaml' }); expect(result).toBe(true); expect(mockConfigManager.getConfig).toHaveBeenCalled(); expect(provider_factory_1.ProviderFactory.createProvider).toHaveBeenCalled(); expect(mockVcsProvider.getCurrentBranchName).toHaveBeenCalled(); expect(mockVcsProvider.getPullRequestFiles).toHaveBeenCalled(); expect(mockProvider.review).toHaveBeenCalled(); expect(mockSpinner.start).toHaveBeenCalled(); expect(mockSpinner.succeed).toHaveBeenCalled(); expect(mockSpinner.stop).toHaveBeenCalled(); }); it('should handle no commits scenario', async () => { const { mockProvider, mockVcsProvider } = (0, review_utils_1.setupMocks)(review_utils_1.mockConfig, []); const result = await (0, review_1.reviewCommand)({ config: 'test-config.yaml' }); expect(result).toBe(true); expect(mockVcsProvider.getPullRequestFiles).toHaveBeenCalled(); expect(mockProvider.review).not.toHaveBeenCalled(); expect(mockSpinner.start).toHaveBeenCalled(); expect(mockSpinner.succeed).toHaveBeenCalled(); expect(mockSpinner.stop).toHaveBeenCalled(); }); it('should respect disabled rules', async () => { const disabledConfig = { ...review_utils_1.mockConfig, rules: { ...review_utils_1.mockConfig.rules, codeChanges: { ...review_utils_1.mockConfig.rules.codeChanges, enabled: false }, commitMessage: { ...review_utils_1.mockConfig.rules.commitMessage, enabled: false }, branchName: { ...review_utils_1.mockConfig.rules.branchName, enabled: false }, }, }; const { mockProvider } = (0, review_utils_1.setupMocks)(disabledConfig); const result = await (0, review_1.reviewCommand)({ config: 'test-config.yaml' }); expect(result).toBe(true); expect(mockProvider.review).not.toHaveBeenCalled(); expect(mockSpinner.start).toHaveBeenCalled(); expect(mockSpinner.succeed).toHaveBeenCalled(); expect(mockSpinner.stop).toHaveBeenCalled(); }); it('should format branch name in outputReviewResults', async () => { const { formatReviewResultsAsMarkdown } = require('../helpers'); const results = { branchName: [ { success: true, suggestions: [ { message: 'Branch name is good', reviewType: 'general' }, ], error: undefined, }, ], }; const markdown = formatReviewResultsAsMarkdown(results.branchName, { type: 'branchName', branchName: 'feature/test', }); expect(markdown).toContain('**Branch:** `feature/test`'); expect(markdown).toContain('Branch name is good'); }); it('should format commit SHA as link in outputReviewResults', async () => { const { formatReviewResultsAsMarkdown } = require('../helpers'); const prDetails = { owner: 'owner', repo: 'repo', pullNumber: 1 }; const commits = [ { hash: 'abc1234', message: 'feat: add feature', author: 'Test', date: '2024-01-01', }, { hash: 'def5678', message: 'fix: bug fix', author: 'Test', date: '2024-01-02', }, ]; const results = [ { success: true, suggestions: [{ message: 'Good commit', reviewType: 'general' }], error: undefined, }, ]; const markdown = formatReviewResultsAsMarkdown(results, { type: 'commitMessages', commits, prDetails, }); expect(markdown).toContain('[abc1234]('); expect(markdown).toContain('[def5678]('); expect(markdown).toContain('feat: add feature'); expect(markdown).toContain('fix: bug fix'); }); });