@c0dez/github-repo-fetcher
Version:
🔍 A lightweight GitHub profile analyzer that fetches repositories, READMEs, and comprehensive user statistics with TypeScript support. Perfect for building GitHub analytics tools and portfolio sites.
87 lines (86 loc) • 3.66 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const axios_1 = __importDefault(require("axios"));
const index_1 = require("../index");
const mocks_1 = require("./mocks");
jest.mock('axios');
const mockedAxios = axios_1.default;
describe('GitHubRepoFetcher', () => {
let fetcher;
beforeEach(() => {
fetcher = new index_1.GitHubRepoFetcher('test-token');
jest.clearAllMocks();
});
describe('getReposWithReadme', () => {
it('should fetch repositories with readmes', async () => {
mockedAxios.get.mockImplementation((url) => {
if (url.includes('/repos')) {
return Promise.resolve({ data: [mocks_1.mockRepo] });
}
if (url.includes('/readme')) {
return Promise.resolve({ data: mocks_1.mockReadme });
}
return Promise.reject(new Error('Unknown URL'));
});
const result = await fetcher.getReposWithReadme('testuser');
expect(result).toHaveLength(1);
expect(result[0]).toEqual({
...mocks_1.mockRepo,
readme: mocks_1.mockReadme
});
expect(mockedAxios.get).toHaveBeenCalledTimes(2);
});
it('should handle errors gracefully', async () => {
mockedAxios.get.mockRejectedValue({
response: { data: { message: 'Not Found' }, status: 404 }
});
await expect(fetcher.getReposWithReadme('nonexistent')).rejects.toEqual({
message: 'Not Found',
status: 404
});
});
});
describe('getUserStats', () => {
it('should fetch user statistics successfully', async () => {
mockedAxios.get.mockImplementation((url) => {
if (url.includes('/users/') && !url.includes('/repos')) {
return Promise.resolve({ data: mocks_1.mockUserData });
}
if (url.includes('/repos')) {
return Promise.resolve({ data: [mocks_1.mockRepo] });
}
if (url.includes('/languages')) {
return Promise.resolve({ data: mocks_1.mockLanguages });
}
if (url.includes('/contributions')) {
return Promise.resolve({ data: 500 });
}
return Promise.reject(new Error('Unknown URL'));
});
const result = await fetcher.getUserStats('testuser');
expect(result).toEqual({
...mocks_1.mockUserData,
languages: mocks_1.mockLanguages,
totalStars: 10,
contributions: 500
});
});
it('should handle missing data gracefully', async () => {
mockedAxios.get.mockImplementation((url) => {
if (url.includes('/users/')) {
return Promise.resolve({ data: mocks_1.mockUserData });
}
if (url.includes('/repos')) {
return Promise.resolve({ data: [] });
}
return Promise.resolve({ data: {} });
});
const result = await fetcher.getUserStats('testuser');
expect(result.languages).toEqual({});
expect(result.totalStars).toBe(0);
});
});
});