UNPKG

@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
"use strict"; 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); }); }); });