mirror of
https://github.com/better-auth/better-auth.git
synced 2026-10-18 11:32:15 -05:00
181 lines
5.2 KiB
TypeScript
181 lines
5.2 KiB
TypeScript
import type { JSONValue } from "ai";
|
|
import { describe, expect, it, vi } from "vitest";
|
|
import { createGitHubReader, parseGitHubRepository } from "../src/github.ts";
|
|
|
|
function jsonResponse(
|
|
body: JSONValue,
|
|
status = 200,
|
|
headers: HeadersInit = {},
|
|
): Response {
|
|
return new Response(JSON.stringify(body), {
|
|
status,
|
|
headers: { "content-type": "application/json", ...headers },
|
|
});
|
|
}
|
|
|
|
function createFetch(): typeof fetch {
|
|
const request = async (
|
|
input: Parameters<typeof fetch>[0],
|
|
): Promise<Response> => {
|
|
const url = input instanceof Request ? input.url : String(input);
|
|
if (url.endsWith("/repos/better-auth/better-auth/pulls/42")) {
|
|
return jsonResponse({
|
|
number: 42,
|
|
title: "fix(session): prevent duplicate refreshes",
|
|
body: "User-visible fix",
|
|
user: { login: "octocat" },
|
|
head: {
|
|
ref: "fix/session",
|
|
repo: { full_name: "better-auth/better-auth" },
|
|
},
|
|
base: { ref: "main" },
|
|
labels: [{ name: "core" }],
|
|
});
|
|
}
|
|
if (url.includes("/repos/better-auth/better-auth/pulls/42/files")) {
|
|
if (new URL(url).searchParams.get("page") === "2") {
|
|
return jsonResponse([
|
|
{
|
|
filename: "packages/core/src/session.ts",
|
|
status: "modified",
|
|
additions: 1,
|
|
deletions: 0,
|
|
patch: "+export const refresh = true;",
|
|
},
|
|
]);
|
|
}
|
|
return jsonResponse(
|
|
[
|
|
{
|
|
filename: "packages/better-auth/src/session.ts",
|
|
status: "modified",
|
|
additions: 1,
|
|
deletions: 1,
|
|
patch: "-oldSession();\n+newSession();",
|
|
},
|
|
],
|
|
200,
|
|
{
|
|
link: '<https://api.github.test/repos/better-auth/better-auth/pulls/42/files?per_page=100&page=2>; rel="next"',
|
|
},
|
|
);
|
|
}
|
|
if (url.includes("/repos/better-auth/better-auth/pulls/404/files")) {
|
|
return jsonResponse([]);
|
|
}
|
|
if (url.endsWith("/repos/better-auth/better-auth/pulls/404")) {
|
|
return jsonResponse({ message: "Not Found" }, 404);
|
|
}
|
|
if (url.includes("/repos/better-auth/better-auth/pulls/500/files")) {
|
|
return jsonResponse([]);
|
|
}
|
|
if (url.endsWith("/repos/better-auth/better-auth/pulls/500")) {
|
|
return jsonResponse({ message: "Server Error" }, 500);
|
|
}
|
|
if (url.endsWith("/repos/better-auth/better-auth/releases/tags/v1.2.3")) {
|
|
return jsonResponse({ body: "Release body" });
|
|
}
|
|
if (url.endsWith("/repos/better-auth/better-auth/releases/tags/v0.0.0")) {
|
|
return jsonResponse({ message: "Not Found" }, 404);
|
|
}
|
|
return jsonResponse({ message: `Unexpected URL: ${url}` }, 500);
|
|
};
|
|
return request;
|
|
}
|
|
|
|
describe("GitHubReader", () => {
|
|
it("aborts GitHub requests after the configured timeout", async () => {
|
|
const fetch: typeof globalThis.fetch = (_input, init) =>
|
|
new Promise((_resolve, reject) => {
|
|
init?.signal?.addEventListener(
|
|
"abort",
|
|
() => reject(init.signal?.reason),
|
|
{ once: true },
|
|
);
|
|
});
|
|
const github = createGitHubReader({
|
|
repository: parseGitHubRepository("better-auth/better-auth"),
|
|
token: "test-token",
|
|
baseUrl: "https://api.github.test",
|
|
fetch,
|
|
requestTimeoutMs: 10,
|
|
});
|
|
|
|
await expect(github.getReleaseBody("v1.2.3")).rejects.toMatchObject({
|
|
status: 500,
|
|
});
|
|
});
|
|
|
|
it("maps pull requests and paginated files into release data", async () => {
|
|
const github = createGitHubReader({
|
|
repository: parseGitHubRepository("better-auth/better-auth"),
|
|
token: "test-token",
|
|
baseUrl: "https://api.github.test",
|
|
fetch: createFetch(),
|
|
});
|
|
|
|
await expect(github.getPullRequest(42)).resolves.toEqual({
|
|
number: 42,
|
|
title: "fix(session): prevent duplicate refreshes",
|
|
body: "User-visible fix",
|
|
author: "octocat",
|
|
headRef: "fix/session",
|
|
baseRef: "main",
|
|
labels: ["core"],
|
|
isFork: false,
|
|
changedFiles: [
|
|
"packages/better-auth/src/session.ts",
|
|
"packages/core/src/session.ts",
|
|
],
|
|
diff: [
|
|
"packages/better-auth/src/session.ts (modified, +1/-1)",
|
|
"-oldSession();",
|
|
"+newSession();",
|
|
"",
|
|
"packages/core/src/session.ts (modified, +1/-0)",
|
|
"+export const refresh = true;",
|
|
].join("\n"),
|
|
});
|
|
});
|
|
|
|
it("returns null only for missing releases", async () => {
|
|
vi.spyOn(console, "warn").mockImplementation(() => undefined);
|
|
vi.spyOn(console, "error").mockImplementation(() => undefined);
|
|
const github = createGitHubReader({
|
|
repository: parseGitHubRepository("better-auth/better-auth"),
|
|
token: "test-token",
|
|
baseUrl: "https://api.github.test",
|
|
fetch: createFetch(),
|
|
});
|
|
|
|
await expect(github.getReleaseBody("v1.2.3")).resolves.toBe("Release body");
|
|
await expect(github.getReleaseBody("v0.0.0")).resolves.toBeNull();
|
|
await expect(github.getReleaseBody("v9.9.9")).rejects.toMatchObject({
|
|
status: 500,
|
|
});
|
|
});
|
|
|
|
it("returns null only for missing pull requests", async () => {
|
|
const github = createGitHubReader({
|
|
repository: parseGitHubRepository("better-auth/better-auth"),
|
|
token: "test-token",
|
|
baseUrl: "https://api.github.test",
|
|
fetch: createFetch(),
|
|
});
|
|
|
|
await expect(github.getPullRequest(404)).resolves.toBeNull();
|
|
await expect(github.getPullRequest(500)).rejects.toMatchObject({
|
|
status: 500,
|
|
});
|
|
});
|
|
|
|
it("rejects ambiguous repository slugs", () => {
|
|
expect(() => parseGitHubRepository("better-auth")).toThrow(
|
|
"Invalid GitHub repository",
|
|
);
|
|
expect(() =>
|
|
parseGitHubRepository("better-auth/better-auth/extra"),
|
|
).toThrow("Invalid GitHub repository");
|
|
});
|
|
});
|