review-copilot
Version:
ReviewCopilot - AI-powered code review assistant with customizable prompts
114 lines (113 loc) • 4.53 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const selective_review_1 = require("../selective-review");
const config_manager_1 = require("../../../config/config-manager");
const selective_review_service_1 = require("../../../services/selective-review-service");
const git_platform_factory_1 = require("../../../services/git-platform-factory");
const file_content_provider_1 = require("../../../services/file-content-provider");
const ora_1 = __importDefault(require("ora"));
const review_utils_1 = require("./review.utils");
jest.useFakeTimers();
describe('selectiveReviewCommand', () => {
let configManagerMock;
let gitServiceMock;
let fileContentProviderMock;
let reviewServiceMock;
const mockSpinner = ora_1.default.mockSpinnerInstance;
beforeAll(() => {
jest.useFakeTimers();
});
beforeEach(() => {
configManagerMock = { loadConfig: jest.fn() };
gitServiceMock = { getPRDetails: jest.fn() };
fileContentProviderMock = { getFileContent: jest.fn() };
reviewServiceMock = { processSelectiveReview: jest.fn() };
jest.spyOn(config_manager_1.ConfigManager, 'getInstance').mockReturnValue(configManagerMock);
jest
.spyOn(git_platform_factory_1.GitPlatformFactory, 'createService')
.mockReturnValue(gitServiceMock);
jest
.spyOn(file_content_provider_1.FileContentProviderFactory, 'createProvider')
.mockReturnValue(fileContentProviderMock);
jest
.spyOn(selective_review_service_1.SelectiveReviewService, 'getInstance')
.mockReturnValue(reviewServiceMock);
jest.clearAllMocks();
// Reset spinner mock state
Object.values(mockSpinner).forEach((mock) => {
if (typeof mock === 'function' && 'mockClear' in mock) {
mock.mockClear();
}
});
});
afterEach(async () => {
// Run any pending timers first
jest.runAllTimers();
// Cleanup spinner
mockSpinner._cleanup();
mockSpinner.stop();
// Clear all mocks and timers
jest.clearAllTimers();
jest.clearAllMocks();
jest.resetModules();
// Cleanup any other mocks
(0, review_utils_1.cleanupMocks)();
});
afterAll(() => {
jest.useRealTimers();
});
const baseOptions = {
config: 'config.yaml',
file: 'file.ts',
startLine: 1,
endLine: 2,
comment: 'review this',
};
it('should fail if PR details are missing', async () => {
gitServiceMock.getPRDetails.mockResolvedValue(null);
const promise = (0, selective_review_1.selectiveReviewCommand)(baseOptions);
jest.runAllTimers();
const result = await promise;
expect(result).toBe(false);
expect(mockSpinner.start).toHaveBeenCalled();
expect(mockSpinner.fail).toHaveBeenCalled();
expect(mockSpinner.stop).toHaveBeenCalled();
});
it('should fail if file content is missing', async () => {
gitServiceMock.getPRDetails.mockResolvedValue({
owner: 'alex',
repo: 'repo',
pullNumber: 1,
});
fileContentProviderMock.getFileContent.mockResolvedValue(null);
const promise = (0, selective_review_1.selectiveReviewCommand)(baseOptions);
jest.runAllTimers();
const result = await promise;
expect(result).toBe(false);
expect(mockSpinner.start).toHaveBeenCalled();
expect(mockSpinner.fail).toHaveBeenCalled();
expect(mockSpinner.stop).toHaveBeenCalled();
});
it('should fail if line range is invalid', async () => {
gitServiceMock.getPRDetails.mockResolvedValue({
owner: 'alex',
repo: 'repo',
pullNumber: 1,
});
fileContentProviderMock.getFileContent.mockResolvedValue('line1\nline2');
const promise = (0, selective_review_1.selectiveReviewCommand)({
...baseOptions,
startLine: 1,
endLine: 10,
});
jest.runAllTimers();
const result = await promise;
expect(result).toBe(false);
expect(mockSpinner.start).toHaveBeenCalled();
expect(mockSpinner.fail).toHaveBeenCalled();
expect(mockSpinner.stop).toHaveBeenCalled();
});
});