So i have this test doing in my typescript project and when i do the mock tests two test have been failing all the issues are related to TypeError [Error]: Cannot redefine property: fetchAndNormalizePullRequests i looked all the way and couldn’t find a way to fix the issue. this is the
pull-request.handler.test.ts
import { test, describe, beforeEach, afterEach, mock } from 'node:test';
import assert from 'node:assert';
import type { Request, Response } from 'express';
import { getAllPullRequests } from '../../handlers/pull-requests.handler.js';
const originalEnv = process.env;
// const pullRequestsService = await import('../../services/pull-requests.service.js');
describe('Pull Requests Handler', () => {
let mockReq: Partial<Request>;
let mockRes: Partial<Response>;
let statusMock: any;
let jsonMock: any;
let fetchMock: any;
beforeEach(() => {
mock.restoreAll();
statusMock = mock.fn(() => mockRes);
jsonMock = mock.fn();
mockRes = {
status: statusMock,
json: jsonMock
};
process.env = { ...originalEnv };
});
afterEach(() => {
process.env = originalEnv;
mock.restoreAll();
});
test('should return 500 when GITHUB_API_TOKEN is missing', async () => {
delete process.env.GITHUB_API_TOKEN;
mockReq = {
query: { owner: 'testowner', repo: 'testrepo' }
};
await getAllPullRequests(mockReq as Request, mockRes as Response);
assert.strictEqual(statusMock.mock.callCount(), 1);
assert.deepStrictEqual(statusMock.mock.calls[0].arguments, [500]);
assert.strictEqual(jsonMock.mock.callCount(), 1);
assert.deepStrictEqual(jsonMock.mock.calls[0].arguments, [{ error: 'Missing environment variables.' }]);
});
test('should return 500 when owner is missing', async () => {
process.env.GITHUB_API_TOKEN = 'test-token';
mockReq = {
query: { repo: 'testrepo' }
};
try{
await getAllPullRequests(mockReq as Request, mockRes as Response);
}
catch(e){
console.error(e);
}
assert.strictEqual(statusMock.mock.callCount(), 1);
assert.deepStrictEqual(statusMock.mock.calls[0].arguments, [500]);
assert.strictEqual(jsonMock.mock.callCount(), 1);
assert.deepStrictEqual(jsonMock.mock.calls[0].arguments, [{ error: 'Missing environment variables.' }]);
});
test('should return 500 when repo is missing', async () => {
process.env.GITHUB_API_TOKEN = 'test-token';
mockReq = {
query: { owner: 'testowner' }
};
await getAllPullRequests(mockReq as Request, mockRes as Response);
assert.strictEqual(statusMock.mock.callCount(), 1);
assert.deepStrictEqual(statusMock.mock.calls[0].arguments, [500]);
assert.strictEqual(jsonMock.mock.callCount(), 1);
assert.deepStrictEqual(jsonMock.mock.calls[0].arguments, [{ error: 'Missing environment variables.' }]);
});
test('should return 200 with pull requests when all parameters are valid', async () => {
process.env.GITHUB_API_TOKEN = 'test-token';
mockReq = {
query: { owner: 'testowner', repo: 'testrepo' }
};
const mockPullRequests = [
{
prNumber: 1,
title: 'Test PR',
creator: 'testuser',
creationTimestamp: '2024-01-01T00:00:00Z',
requestedReviewers: ['reviewer1'],
lastActionType: 'open',
lastActionTimestamp: '2024-01-01T00:00:00Z'
}
];
const fetchMock = mock.fn(() => Promise.resolve(mockPullRequests));
mock.method(await import('../../services/pull-requests.service.js'), 'fetchAndNormalizePullRequests', fetchMock);
await getAllPullRequests(mockReq as Request, mockRes as Response);
assert.strictEqual(statusMock.mock.callCount(), 1);
assert.deepStrictEqual(statusMock.mock.calls[0].arguments, [200]);
assert.strictEqual(jsonMock.mock.callCount(), 1);
assert.deepStrictEqual(jsonMock.mock.calls[0].arguments, [mockPullRequests]);
});
test('should return 500 when service throws an error', async () => {
process.env.GITHUB_API_TOKEN = 'test-token';
mockReq = {
query: { owner: 'testowner', repo: 'testrepo' }
};
const fetchMock = mock.fn(() => Promise.reject(new Error('Service error')));
mock.method(await import('../../services/pull-requests.service.js'), 'fetchAndNormalizePullRequests', fetchMock);
await getAllPullRequests(mockReq as Request, mockRes as Response);
assert.strictEqual(statusMock.mock.callCount(), 1);
assert.deepStrictEqual(statusMock.mock.calls[0].arguments, [500]);
assert.strictEqual(jsonMock.mock.callCount(), 1);
assert.deepStrictEqual(jsonMock.mock.calls[0].arguments, [{ error: 'Internal server error.' }]);
});
});
and this is my fetchAndNormalizePullRequest function
import axios from 'axios';
import type{ NormalizedPR } from '../types/types.js';
export const fetchAndNormalizePullRequests = async (owner: string, repo: string, token: string): Promise<NormalizedPR[]> => {
const url = `https://api.github.com/repos/${owner}/${repo}/pulls?state=all`;
try {
const response = await axios.get(url, {
headers: {
Authorization: `token ${token}`,
'Content-Type': 'application/json',
},
});
return response.data.map((pr: any) => ({
prNumber: pr.number,
title: pr.title,
creator: pr.user.login,
creationTimestamp: pr.created_at,
requestedReviewers: pr.requested_reviewers.map((reviewer: any) => reviewer.login),
lastActionType: pr.merged_at ? 'merged' : pr.state,
lastActionTimestamp: pr.updated_at,
}));
} catch (error) {
throw new Error('Failed to fetch pull requests from GitHub API.');
}
};
what am i doing wrong? can’t fix the issue