near-protocol-rewards
Version:
A transparent, metric-based rewards system for NEAR projects
159 lines (158 loc) • 6.48 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const github_1 = require("../../../src/collectors/github");
const rate_limiter_1 = require("../../../src/utils/rate-limiter");
jest.mock("@octokit/rest");
jest.mock("../../../src/utils/rate-limiter");
jest.mock("@octokit/rest", () => {
return {
Octokit: jest.fn().mockImplementation(() => ({
rest: {
repos: {
get: jest.fn(),
},
},
paginate: jest.fn(),
})),
};
});
jest.mock('../../../src/utils/logger', () => {
return {
ConsoleLogger: jest.fn().mockReturnValue({
info: jest.fn(),
error: jest.fn(),
debug: jest.fn(),
warn: jest.fn()
})
};
});
const logger_1 = require("../../../src/utils/logger");
describe("GitHubCollector", () => {
const token = "test-token";
const repo = "owner/repo";
let logger;
let rateLimiter;
let collector;
beforeEach(() => {
jest.clearAllMocks();
logger = new logger_1.ConsoleLogger();
rateLimiter = new rate_limiter_1.RateLimiter({ maxRequestsPerSecond: 10 });
collector = new github_1.GitHubCollector({
token,
repo,
logger,
rateLimiter,
});
});
it("should throw an error for invalid repository format", () => {
expect(() => new github_1.GitHubCollector({ token, repo: "invalidRepo", logger })).toThrow("Invalid repository format. Expected 'owner/repo'");
});
it("should test GitHub connection successfully", async () => {
const mockReposGet = jest.fn().mockResolvedValue({});
collector.octokit.rest.repos.get = mockReposGet;
await collector.testConnection();
expect(mockReposGet).toHaveBeenCalledWith({ owner: "owner", repo: "repo" });
});
it("should handle GitHub connection failure", async () => {
const mockReposGet = jest.fn().mockRejectedValue(new Error("Connection error"));
collector.octokit.rest.repos.get = mockReposGet;
await expect(collector.testConnection()).rejects.toThrow("Connection error");
});
it("should collect commit metrics", async () => {
const mockCommits = [
{ author: { login: "user1" }, commit: { author: { date: "2025-01-01T00:00:00Z" } } },
{ author: { login: "user2" }, commit: { author: { date: "2025-01-02T00:00:00Z" } } },
];
const mockPaginate = jest.fn().mockResolvedValue(mockCommits);
collector.octokit.paginate = mockPaginate;
const result = await collector.collectCommitMetrics();
expect(result.count).toBe(2);
expect(result.authors).toEqual([
{ login: "user1", count: 1 },
{ login: "user2", count: 1 },
]);
expect(result.frequency.daily).toHaveLength(7);
});
it("should collect pull request metrics", async () => {
const openPRs = [{ user: { login: "user1" } }];
const closedPRs = [
{ user: { login: "user2" }, merged_at: "2025-01-01T00:00:00Z" },
{ user: { login: "user3" }, merged_at: null },
];
const mockPaginate = jest.fn()
.mockResolvedValueOnce(openPRs)
.mockResolvedValueOnce(closedPRs);
collector.octokit.paginate = mockPaginate;
const result = await collector.collectPullRequestMetrics();
expect(result.open).toBe(1);
expect(result.merged).toBe(1);
expect(result.closed).toBe(1);
expect(result.authors).toEqual(["user1", "user2", "user3"]);
});
it("should collect review metrics", async () => {
const mockPRs = [{ number: 1 }];
const mockReviews = [
{ user: { login: "reviewer1" } },
{ user: { login: "reviewer2" } },
];
const mockPaginate = jest.fn()
.mockResolvedValueOnce(mockPRs)
.mockResolvedValueOnce(mockReviews);
collector.octokit.paginate = mockPaginate;
const result = await collector.collectReviewMetrics();
expect(result.count).toBe(2);
expect(result.authors).toEqual(["reviewer1", "reviewer2"]);
});
it("should collect issue metrics", async () => {
const openIssues = [
{ user: { login: "user1" }, assignee: null, assignees: [] },
];
const closedIssues = [
{
user: { login: "user2" },
assignee: { login: "assignee1" },
assignees: [{ login: "assignee2" }],
},
];
const mockPaginate = jest.fn()
.mockResolvedValueOnce(openIssues)
.mockResolvedValueOnce(closedIssues);
collector.octokit.paginate = mockPaginate;
const result = await collector.collectIssueMetrics();
expect(result.open).toBe(1);
expect(result.closed).toBe(1);
expect(result.participants).toEqual(["user1", "user2", "assignee1", "assignee2"]);
});
it("should collect all metrics", async () => {
const mockCommitMetrics = jest.spyOn(collector, "collectCommitMetrics").mockResolvedValue({
count: 10,
frequency: { daily: [1, 1, 1, 1, 1, 1, 1], weekly: 7, monthly: 30 },
authors: [{ login: "user1", count: 10 }],
});
const mockPRMetrics = jest.spyOn(collector, "collectPullRequestMetrics").mockResolvedValue({
open: 5,
merged: 3,
closed: 2,
authors: ["user1", "user2"],
});
const mockReviewMetrics = jest.spyOn(collector, "collectReviewMetrics").mockResolvedValue({
count: 4,
authors: ["reviewer1"],
});
const mockIssueMetrics = jest.spyOn(collector, "collectIssueMetrics").mockResolvedValue({
open: 3,
closed: 7,
participants: ["user1", "user2"],
});
const result = await collector.collectMetrics();
expect(mockCommitMetrics).toHaveBeenCalled();
expect(mockPRMetrics).toHaveBeenCalled();
expect(mockReviewMetrics).toHaveBeenCalled();
expect(mockIssueMetrics).toHaveBeenCalled();
expect(result.commits.count).toBe(10);
expect(result.pullRequests.open).toBe(5);
expect(result.reviews.count).toBe(4);
expect(result.issues.open).toBe(3);
expect(result.metadata.source).toBe("github");
});
});