Skip to content

Commit 2bce2aa

Browse files
authored
Fix build (#70)
2 parents 83b6d4e + 79254ab commit 2bce2aa

File tree

2 files changed

+154
-13
lines changed

2 files changed

+154
-13
lines changed

app/api/github/webhook/route.test.ts

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
import { describe, it, expect, vi, beforeEach } from "vitest";
2+
import { NextRequest, NextResponse } from "next/server";
3+
import { POST } from "./route";
4+
import { getOctokit } from "@/lib/github";
5+
import { revalidateTag } from "next/cache";
6+
import type { Mock } from "vitest";
7+
8+
vi.mock("@/lib/github", () => ({
9+
getOctokit: vi.fn(),
10+
}));
11+
12+
vi.mock("next/cache", () => ({
13+
revalidateTag: vi.fn(),
14+
}));
15+
16+
describe("POST", () => {
17+
let mockRequest: NextRequest;
18+
let mockOctokit: any;
19+
20+
beforeEach(() => {
21+
vi.clearAllMocks();
22+
mockOctokit = {};
23+
(getOctokit as Mock).mockResolvedValue(mockOctokit);
24+
mockRequest = {
25+
json: vi.fn(),
26+
headers: {
27+
get: vi.fn(),
28+
},
29+
} as unknown as NextRequest;
30+
});
31+
32+
it("should handle push event", async () => {
33+
const mockJson = vi.fn().mockResolvedValue({
34+
repository: { full_name: "test/repo" },
35+
commits: [],
36+
});
37+
const mockGet = vi.fn().mockReturnValue("push");
38+
39+
mockRequest.json = mockJson;
40+
mockRequest.headers.get = mockGet;
41+
42+
const response = await POST(mockRequest);
43+
44+
expect(response).toBeInstanceOf(NextResponse);
45+
expect(response.status).toBe(200);
46+
expect(getOctokit).toHaveBeenCalled();
47+
// Add more specific assertions based on the expected behavior
48+
});
49+
50+
it("should handle pull request event", async () => {
51+
const mockJson = vi.fn().mockResolvedValue({
52+
action: "opened",
53+
pull_request: { id: "123" },
54+
repository: { full_name: "test/repo" },
55+
});
56+
const mockGet = vi.fn().mockReturnValue("pull_request");
57+
58+
mockRequest.json = mockJson;
59+
mockRequest.headers.get = mockGet;
60+
61+
const response = await POST(mockRequest);
62+
63+
expect(response).toBeInstanceOf(NextResponse);
64+
expect(response.status).toBe(200);
65+
expect(getOctokit).toHaveBeenCalled();
66+
expect(revalidateTag).toHaveBeenCalledWith("pullRequest-123");
67+
});
68+
69+
it("should handle check run event", async () => {
70+
const mockJson = vi.fn().mockResolvedValue({
71+
action: "completed",
72+
check_run: { pull_requests: [{ id: "456" }] },
73+
repository: { full_name: "test/repo" },
74+
});
75+
const mockGet = vi.fn().mockReturnValue("check_run");
76+
77+
mockRequest.json = mockJson;
78+
mockRequest.headers.get = mockGet;
79+
80+
const response = await POST(mockRequest);
81+
82+
expect(response).toBeInstanceOf(NextResponse);
83+
expect(response.status).toBe(200);
84+
expect(getOctokit).toHaveBeenCalled();
85+
expect(revalidateTag).toHaveBeenCalledWith("pullRequest-456");
86+
});
87+
88+
it("should handle check suite event", async () => {
89+
const mockJson = vi.fn().mockResolvedValue({
90+
action: "completed",
91+
check_suite: { pull_requests: [{ id: "789" }] },
92+
repository: { full_name: "test/repo" },
93+
});
94+
const mockGet = vi.fn().mockReturnValue("check_suite");
95+
96+
mockRequest.json = mockJson;
97+
mockRequest.headers.get = mockGet;
98+
99+
const response = await POST(mockRequest);
100+
101+
expect(response).toBeInstanceOf(NextResponse);
102+
expect(response.status).toBe(200);
103+
expect(getOctokit).toHaveBeenCalled();
104+
expect(revalidateTag).toHaveBeenCalledWith("pullRequest-789");
105+
});
106+
107+
it("should handle unhandled event types", async () => {
108+
const mockJson = vi.fn().mockResolvedValue({});
109+
const mockGet = vi.fn().mockReturnValue("unhandled_event");
110+
111+
mockRequest.json = mockJson;
112+
mockRequest.headers.get = mockGet;
113+
114+
const response = await POST(mockRequest);
115+
116+
expect(response).toBeInstanceOf(NextResponse);
117+
expect(response.status).toBe(200);
118+
expect(getOctokit).toHaveBeenCalled();
119+
expect(revalidateTag).not.toHaveBeenCalled();
120+
});
121+
122+
it("should handle errors", async () => {
123+
const mockJson = vi.fn().mockImplementation(() => {
124+
throw new Error("Test error");
125+
});
126+
mockRequest.json = mockJson;
127+
128+
const response = await POST(mockRequest);
129+
130+
expect(response).toBeInstanceOf(NextResponse);
131+
expect(response.status).toBe(500);
132+
});
133+
});

app/api/github/webhook/route.ts

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,22 @@
11
import { NextResponse } from "next/server";
22
import { getOctokit } from "@/lib/github";
33
import { revalidateTag } from "next/cache";
4+
import { type NextRequest } from "next/server";
45

5-
const octokit = getOctokit();
6+
export async function POST(request: NextRequest) {
7+
const octokit = await getOctokit();
68

7-
// Webhooks documentation: https://docs.github.com/en/webhooks
9+
let payload;
10+
try {
11+
payload = await request.json();
12+
} catch (error) {
13+
console.error("Failed to parse webhook payload:", error);
14+
return NextResponse.json(
15+
{ error: "Failed to parse webhook payload" },
16+
{ status: 500 }
17+
);
18+
}
819

9-
export async function POST(request: Request) {
10-
const payload = await request.json();
1120
const githubEvent = request.headers.get("x-github-event");
1221

1322
if (!githubEvent) {
@@ -20,16 +29,16 @@ export async function POST(request: Request) {
2029
try {
2130
switch (githubEvent) {
2231
case "push":
23-
await handlePushEvent(payload);
32+
await handlePushEvent(payload, octokit);
2433
break;
2534
case "pull_request":
26-
await handlePullRequestEvent(payload);
35+
await handlePullRequestEvent(payload, octokit);
2736
break;
2837
case "check_run":
29-
await handleCheckRunEvent(payload);
38+
await handleCheckRunEvent(payload, octokit);
3039
break;
3140
case "check_suite":
32-
await handleCheckSuiteEvent(payload);
41+
await handleCheckSuiteEvent(payload, octokit);
3342
break;
3443
default:
3544
console.log(`Unhandled event type: ${githubEvent}`);
@@ -45,19 +54,18 @@ export async function POST(request: Request) {
4554
}
4655
}
4756

48-
async function handlePushEvent(payload: any) {
57+
async function handlePushEvent(payload: any, octokit: any) {
4958
const { repository, commits } = payload;
5059
console.log(`New push to ${repository.full_name}`);
51-
// Process commits
5260
}
5361

54-
async function handlePullRequestEvent(payload: any) {
62+
async function handlePullRequestEvent(payload: any, octokit: any) {
5563
const { action, pull_request, repository } = payload;
5664
console.log(`Pull request ${action} in ${repository.full_name}`);
5765
revalidateTag(`pullRequest-${pull_request.id}`);
5866
}
5967

60-
async function handleCheckRunEvent(payload: any) {
68+
async function handleCheckRunEvent(payload: any, octokit: any) {
6169
const { action, check_run, repository } = payload;
6270
console.log(`Check run ${action} in ${repository.full_name}`);
6371
if (check_run.pull_requests && check_run.pull_requests.length > 0) {
@@ -67,7 +75,7 @@ async function handleCheckRunEvent(payload: any) {
6775
}
6876
}
6977

70-
async function handleCheckSuiteEvent(payload: any) {
78+
async function handleCheckSuiteEvent(payload: any, octokit: any) {
7179
const { action, check_suite, repository } = payload;
7280
console.log(`Check suite ${action} in ${repository.full_name}`);
7381
if (check_suite.pull_requests && check_suite.pull_requests.length > 0) {

0 commit comments

Comments
 (0)