Something went wrong. Try again.
[READ-ONLY] Mirror of https://github.com/andreijiroh-dev/gh-readme-stats-patches. gh-readme-stats-patches.vercel.app
Something went wrong. Try again.
13 kB · 507 lines
JavaScript
at main
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508import { afterEach, beforeEach, describe, expect, it } from "@jest/globals";import "@testing-library/jest-dom";import axios from "axios";import MockAdapter from "axios-mock-adapter";import { calculateRank } from "../src/calculateRank.js";import { fetchStats } from "../src/fetchers/stats.js";
// Test parameters.const data_stats = { data: { user: { name: "Anurag Hazra", repositoriesContributedTo: { totalCount: 61 }, commits: { totalCommitContributions: 100, }, reviews: { totalPullRequestReviewContributions: 50, }, pullRequests: { totalCount: 300 }, mergedPullRequests: { totalCount: 240 }, openIssues: { totalCount: 100 }, closedIssues: { totalCount: 100 }, followers: { totalCount: 100 }, repositoryDiscussions: { totalCount: 10 }, repositoryDiscussionComments: { totalCount: 40 }, repositories: { totalCount: 5, nodes: [ { name: "test-repo-1", stargazers: { totalCount: 100 } }, { name: "test-repo-2", stargazers: { totalCount: 100 } }, { name: "test-repo-3", stargazers: { totalCount: 100 } }, ], pageInfo: { hasNextPage: true, endCursor: "cursor", }, }, }, },};
const data_year2003 = JSON.parse(JSON.stringify(data_stats));data_year2003.data.user.commits.totalCommitContributions = 428;
const data_without_pull_requests = { data: { user: { ...data_stats.data.user, pullRequests: { totalCount: 0 }, mergedPullRequests: { totalCount: 0 }, }, },};
const data_repo = { data: { user: { repositories: { nodes: [ { name: "test-repo-4", stargazers: { totalCount: 50 } }, { name: "test-repo-5", stargazers: { totalCount: 50 } }, ], pageInfo: { hasNextPage: false, endCursor: "cursor", }, }, }, },};
const data_repo_zero_stars = { data: { user: { repositories: { nodes: [ { name: "test-repo-1", stargazers: { totalCount: 100 } }, { name: "test-repo-2", stargazers: { totalCount: 100 } }, { name: "test-repo-3", stargazers: { totalCount: 100 } }, { name: "test-repo-4", stargazers: { totalCount: 0 } }, { name: "test-repo-5", stargazers: { totalCount: 0 } }, ], pageInfo: { hasNextPage: true, endCursor: "cursor", }, }, }, },};
const error = { errors: [ { type: "NOT_FOUND", path: ["user"], locations: [], message: "Could not resolve to a User with the login of 'noname'.", }, ],};
const mock = new MockAdapter(axios);
beforeEach(() => { process.env.FETCH_MULTI_PAGE_STARS = "false"; // Set to `false` to fetch only one page of stars. mock.onPost("https://api.github.com/graphql").reply((cfg) => { let req = JSON.parse(cfg.data);
if ( req.variables && req.variables.startTime && req.variables.startTime.startsWith("2003") ) { return [200, data_year2003]; } return [ 200, req.query.includes("totalCommitContributions") ? data_stats : data_repo, ]; });});
afterEach(() => { mock.reset();});
describe("Test fetchStats", () => { it("should fetch correct stats", async () => { let stats = await fetchStats("anuraghazra"); const rank = calculateRank({ all_commits: false, commits: 100, prs: 300, reviews: 50, issues: 200, repos: 5, stars: 300, followers: 100, });
expect(stats).toStrictEqual({ contributedTo: 61, name: "Anurag Hazra", totalCommits: 100, totalIssues: 200, totalPRs: 300, totalPRsMerged: 0, mergedPRsPercentage: 0, totalReviews: 50, totalStars: 300, totalDiscussionsStarted: 0, totalDiscussionsAnswered: 0, rank, }); });
it("should stop fetching when there are repos with zero stars", async () => { mock.reset(); mock .onPost("https://api.github.com/graphql") .replyOnce(200, data_stats) .onPost("https://api.github.com/graphql") .replyOnce(200, data_repo_zero_stars);
let stats = await fetchStats("anuraghazra"); const rank = calculateRank({ all_commits: false, commits: 100, prs: 300, reviews: 50, issues: 200, repos: 5, stars: 300, followers: 100, });
expect(stats).toStrictEqual({ contributedTo: 61, name: "Anurag Hazra", totalCommits: 100, totalIssues: 200, totalPRs: 300, totalPRsMerged: 0, mergedPRsPercentage: 0, totalReviews: 50, totalStars: 300, totalDiscussionsStarted: 0, totalDiscussionsAnswered: 0, rank, }); });
it("should throw error", async () => { mock.reset(); mock.onPost("https://api.github.com/graphql").reply(200, error);
await expect(fetchStats("anuraghazra")).rejects.toThrow( "Could not resolve to a User with the login of 'noname'.", ); });
it("should fetch total commits", async () => { mock .onGet("https://api.github.com/search/commits?q=author:anuraghazra") .reply(200, { total_count: 1000 });
let stats = await fetchStats("anuraghazra", true); const rank = calculateRank({ all_commits: true, commits: 1000, prs: 300, reviews: 50, issues: 200, repos: 5, stars: 300, followers: 100, });
expect(stats).toStrictEqual({ contributedTo: 61, name: "Anurag Hazra", totalCommits: 1000, totalIssues: 200, totalPRs: 300, totalPRsMerged: 0, mergedPRsPercentage: 0, totalReviews: 50, totalStars: 300, totalDiscussionsStarted: 0, totalDiscussionsAnswered: 0, rank, }); });
it("should throw specific error when include_all_commits true and invalid username", async () => { expect(fetchStats("asdf///---", true)).rejects.toThrow( new Error("Invalid username provided."), ); });
it("should throw specific error when include_all_commits true and API returns error", async () => { mock .onGet("https://api.github.com/search/commits?q=author:anuraghazra") .reply(200, { error: "Some test error message" });
expect(fetchStats("anuraghazra", true)).rejects.toThrow( new Error("Could not fetch total commits."), ); });
it("should exclude stars of the `test-repo-1` repository", async () => { mock .onGet("https://api.github.com/search/commits?q=author:anuraghazra") .reply(200, { total_count: 1000 });
let stats = await fetchStats("anuraghazra", true, ["test-repo-1"]); const rank = calculateRank({ all_commits: true, commits: 1000, prs: 300, reviews: 50, issues: 200, repos: 5, stars: 200, followers: 100, });
expect(stats).toStrictEqual({ contributedTo: 61, name: "Anurag Hazra", totalCommits: 1000, totalIssues: 200, totalPRs: 300, totalPRsMerged: 0, mergedPRsPercentage: 0, totalReviews: 50, totalStars: 200, totalDiscussionsStarted: 0, totalDiscussionsAnswered: 0, rank, }); });
it("should fetch two pages of stars if 'FETCH_MULTI_PAGE_STARS' env variable is set to `true`", async () => { process.env.FETCH_MULTI_PAGE_STARS = true;
let stats = await fetchStats("anuraghazra"); const rank = calculateRank({ all_commits: false, commits: 100, prs: 300, reviews: 50, issues: 200, repos: 5, stars: 400, followers: 100, });
expect(stats).toStrictEqual({ contributedTo: 61, name: "Anurag Hazra", totalCommits: 100, totalIssues: 200, totalPRs: 300, totalPRsMerged: 0, mergedPRsPercentage: 0, totalReviews: 50, totalStars: 400, totalDiscussionsStarted: 0, totalDiscussionsAnswered: 0, rank, }); });
it("should fetch one page of stars if 'FETCH_MULTI_PAGE_STARS' env variable is set to `false`", async () => { process.env.FETCH_MULTI_PAGE_STARS = "false";
let stats = await fetchStats("anuraghazra"); const rank = calculateRank({ all_commits: false, commits: 100, prs: 300, reviews: 50, issues: 200, repos: 5, stars: 300, followers: 100, });
expect(stats).toStrictEqual({ contributedTo: 61, name: "Anurag Hazra", totalCommits: 100, totalIssues: 200, totalPRs: 300, totalPRsMerged: 0, mergedPRsPercentage: 0, totalReviews: 50, totalStars: 300, totalDiscussionsStarted: 0, totalDiscussionsAnswered: 0, rank, }); });
it("should fetch one page of stars if 'FETCH_MULTI_PAGE_STARS' env variable is not set", async () => { process.env.FETCH_MULTI_PAGE_STARS = undefined;
let stats = await fetchStats("anuraghazra"); const rank = calculateRank({ all_commits: false, commits: 100, prs: 300, reviews: 50, issues: 200, repos: 5, stars: 300, followers: 100, });
expect(stats).toStrictEqual({ contributedTo: 61, name: "Anurag Hazra", totalCommits: 100, totalIssues: 200, totalPRs: 300, totalPRsMerged: 0, mergedPRsPercentage: 0, totalReviews: 50, totalStars: 300, totalDiscussionsStarted: 0, totalDiscussionsAnswered: 0, rank, }); });
it("should not fetch additional stats data when it not requested", async () => { let stats = await fetchStats("anuraghazra"); const rank = calculateRank({ all_commits: false, commits: 100, prs: 300, reviews: 50, issues: 200, repos: 5, stars: 300, followers: 100, });
expect(stats).toStrictEqual({ contributedTo: 61, name: "Anurag Hazra", totalCommits: 100, totalIssues: 200, totalPRs: 300, totalPRsMerged: 0, mergedPRsPercentage: 0, totalReviews: 50, totalStars: 300, totalDiscussionsStarted: 0, totalDiscussionsAnswered: 0, rank, }); });
it("should fetch additional stats when it requested", async () => { let stats = await fetchStats("anuraghazra", false, [], true, true, true); const rank = calculateRank({ all_commits: false, commits: 100, prs: 300, reviews: 50, issues: 200, repos: 5, stars: 300, followers: 100, });
expect(stats).toStrictEqual({ contributedTo: 61, name: "Anurag Hazra", totalCommits: 100, totalIssues: 200, totalPRs: 300, totalPRsMerged: 240, mergedPRsPercentage: 80, totalReviews: 50, totalStars: 300, totalDiscussionsStarted: 10, totalDiscussionsAnswered: 40, rank, }); });
it("should get commits of provided year", async () => { let stats = await fetchStats( "anuraghazra", false, [], false, false, false, 2003, );
const rank = calculateRank({ all_commits: false, commits: 428, prs: 300, reviews: 50, issues: 200, repos: 5, stars: 300, followers: 100, });
expect(stats).toStrictEqual({ contributedTo: 61, name: "Anurag Hazra", totalCommits: 428, totalIssues: 200, totalPRs: 300, totalPRsMerged: 0, mergedPRsPercentage: 0, totalReviews: 50, totalStars: 300, totalDiscussionsStarted: 0, totalDiscussionsAnswered: 0, rank, }); });
it("should return correct data when user don't have any pull requests", async () => { mock.reset(); mock .onPost("https://api.github.com/graphql") .reply(200, data_without_pull_requests); const stats = await fetchStats("anuraghazra", false, [], true); const rank = calculateRank({ all_commits: false, commits: 100, prs: 0, reviews: 50, issues: 200, repos: 5, stars: 300, followers: 100, });
expect(stats).toStrictEqual({ contributedTo: 61, name: "Anurag Hazra", totalCommits: 100, totalIssues: 200, totalPRs: 0, totalPRsMerged: 0, mergedPRsPercentage: 0, totalReviews: 50, totalStars: 300, totalDiscussionsStarted: 0, totalDiscussionsAnswered: 0, rank, }); });});