mirror of
https://github.com/AmruthPillai/Reactive-Resume.git
synced 2026-10-04 02:33:47 +10:00
196 lines
7.5 KiB
TypeScript
196 lines
7.5 KiB
TypeScript
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
|
|
const mocks = vi.hoisted(() => ({
|
|
handleAuth: vi.fn(),
|
|
handleOAuth: vi.fn(),
|
|
handleRpc: vi.fn(),
|
|
handleOpenApi: vi.fn(),
|
|
handleHealth: vi.fn(),
|
|
handleUpload: vi.fn(),
|
|
handleMcp: vi.fn(),
|
|
handleResumePdfDownload: vi.fn(),
|
|
handlePublicResumePdf: vi.fn(),
|
|
handleMcpServerCard: vi.fn(),
|
|
handleOAuthAuthorizationServer: vi.fn(),
|
|
handleOAuthProtectedResource: vi.fn(),
|
|
handleOpenIdConfiguration: vi.fn(),
|
|
handleWellKnownFallback: vi.fn(),
|
|
handleRobots: vi.fn(),
|
|
handleSitemap: vi.fn(),
|
|
handleLlms: vi.fn(),
|
|
serveWebDistStatic: vi.fn(),
|
|
handleWebApp: vi.fn(),
|
|
}));
|
|
|
|
vi.mock("./auth", () => ({
|
|
handleAuth: mocks.handleAuth,
|
|
handleOAuth: mocks.handleOAuth,
|
|
}));
|
|
|
|
vi.mock("./health", () => ({
|
|
handleHealth: mocks.handleHealth,
|
|
}));
|
|
|
|
vi.mock("../rpc/handler", () => ({
|
|
handleRpc: mocks.handleRpc,
|
|
}));
|
|
|
|
vi.mock("../openapi/handler", () => ({
|
|
handleOpenApi: mocks.handleOpenApi,
|
|
}));
|
|
|
|
vi.mock("../openapi/metadata", () => ({
|
|
handleMcpServerCard: mocks.handleMcpServerCard,
|
|
handleOAuthAuthorizationServer: mocks.handleOAuthAuthorizationServer,
|
|
handleOAuthProtectedResource: mocks.handleOAuthProtectedResource,
|
|
handleOpenIdConfiguration: mocks.handleOpenIdConfiguration,
|
|
handleWellKnownFallback: mocks.handleWellKnownFallback,
|
|
}));
|
|
|
|
vi.mock("../static/uploads", () => ({
|
|
handleUpload: mocks.handleUpload,
|
|
}));
|
|
|
|
vi.mock("../static/seo", () => ({
|
|
handleRobots: mocks.handleRobots,
|
|
handleSitemap: mocks.handleSitemap,
|
|
handleLlms: mocks.handleLlms,
|
|
}));
|
|
|
|
vi.mock("../static/web", () => ({
|
|
serveWebDistStatic: mocks.serveWebDistStatic,
|
|
handleWebApp: mocks.handleWebApp,
|
|
}));
|
|
|
|
vi.mock("../mcp/handler", () => ({
|
|
handleMcp: mocks.handleMcp,
|
|
}));
|
|
|
|
vi.mock("./resume-pdf", () => ({
|
|
handleResumePdfDownload: mocks.handleResumePdfDownload,
|
|
}));
|
|
|
|
vi.mock("./public-resume-pdf", () => ({
|
|
handlePublicResumePdf: mocks.handlePublicResumePdf,
|
|
}));
|
|
|
|
const transportEnv = (remoteAddress: string) =>
|
|
({
|
|
incoming: { socket: { remoteAddress } },
|
|
}) as never;
|
|
|
|
beforeEach(() => {
|
|
vi.clearAllMocks();
|
|
mocks.handleAuth.mockResolvedValue(new Response("auth"));
|
|
mocks.handleOAuth.mockResolvedValue(new Response("oauth"));
|
|
mocks.handleRpc.mockResolvedValue(new Response("rpc"));
|
|
mocks.handleOpenApi.mockResolvedValue(new Response("openapi"));
|
|
mocks.handleHealth.mockReturnValue(new Response("health"));
|
|
mocks.handleUpload.mockResolvedValue(new Response("upload"));
|
|
mocks.handleMcp.mockResolvedValue(new Response("mcp"));
|
|
mocks.handleResumePdfDownload.mockResolvedValue(new Response("pdf"));
|
|
mocks.handlePublicResumePdf.mockResolvedValue(new Response("public-pdf"));
|
|
mocks.handleMcpServerCard.mockReturnValue(new Response("server-card"));
|
|
mocks.handleOAuthAuthorizationServer.mockReturnValue(new Response("oauth-authorization-server"));
|
|
mocks.handleOAuthProtectedResource.mockReturnValue(new Response("oauth-protected-resource"));
|
|
mocks.handleOpenIdConfiguration.mockReturnValue(new Response("openid-configuration"));
|
|
mocks.handleWellKnownFallback.mockReturnValue(new Response("well-known"));
|
|
mocks.handleRobots.mockReturnValue(new Response("robots"));
|
|
mocks.handleSitemap.mockReturnValue(new Response("sitemap"));
|
|
mocks.handleLlms.mockReturnValue(new Response("llms"));
|
|
mocks.serveWebDistStatic.mockResolvedValue(undefined);
|
|
mocks.handleWebApp.mockResolvedValue(new Response("web"));
|
|
});
|
|
|
|
describe("createApp", () => {
|
|
it("routes /api/auth/oauth to the OAuth bridge before the Better Auth wildcard", async () => {
|
|
const { createApp } = await import("./app");
|
|
const app = createApp();
|
|
const request = new Request("http://localhost:3001/api/auth/oauth?client_id=test-client");
|
|
|
|
const response = await app.fetch(request);
|
|
|
|
await expect(response.text()).resolves.toBe("oauth");
|
|
expect(mocks.handleOAuth).toHaveBeenCalledWith(request);
|
|
expect(mocks.handleAuth).not.toHaveBeenCalled();
|
|
});
|
|
|
|
it("routes signed resume PDF downloads before the web fallback", async () => {
|
|
const { createApp } = await import("./app");
|
|
const app = createApp();
|
|
const request = new Request("http://localhost:3001/api/resumes/resume-1/pdf?token=signed");
|
|
|
|
const response = await app.fetch(request);
|
|
|
|
await expect(response.text()).resolves.toBe("pdf");
|
|
expect(mocks.handleResumePdfDownload).toHaveBeenCalledWith(request, "resume-1");
|
|
expect(mocks.serveWebDistStatic).not.toHaveBeenCalled();
|
|
expect(mocks.handleWebApp).not.toHaveBeenCalled();
|
|
});
|
|
|
|
it("uses the transport address for public PDF fallback despite rotated forwarding headers", async () => {
|
|
const { createApp } = await import("./app");
|
|
const app = createApp();
|
|
const first = new Request("http://localhost:3001/api/resumes/jane/resume/pdf?reason=render-data-hash", {
|
|
headers: { "x-forwarded-for": "198.51.100.1" },
|
|
});
|
|
const rotated = new Request("http://localhost:3001/api/resumes/jane/resume/pdf?reason=render-data-hash", {
|
|
headers: { "x-forwarded-for": "198.51.100.2" },
|
|
});
|
|
const env = transportEnv("203.0.113.9");
|
|
|
|
const response = await app.fetch(first, env);
|
|
await app.fetch(rotated, env);
|
|
|
|
await expect(response.text()).resolves.toBe("public-pdf");
|
|
expect(mocks.handlePublicResumePdf).toHaveBeenNthCalledWith(1, first, "jane", "resume", "203.0.113.9");
|
|
expect(mocks.handlePublicResumePdf).toHaveBeenNthCalledWith(2, rotated, "jane", "resume", "203.0.113.9");
|
|
expect(mocks.handleResumePdfDownload).not.toHaveBeenCalled();
|
|
expect(mocks.serveWebDistStatic).not.toHaveBeenCalled();
|
|
expect(mocks.handleWebApp).not.toHaveBeenCalled();
|
|
});
|
|
|
|
it("passes the transport address to RPC and OpenAPI and fails closed when it is unavailable", async () => {
|
|
const { createApp } = await import("./app");
|
|
const app = createApp();
|
|
const trustedRpcRequest = new Request("http://localhost:3001/api/rpc", {
|
|
headers: { "cf-connecting-ip": "198.51.100.1" },
|
|
});
|
|
const unknownRpcRequest = new Request("http://localhost:3001/api/rpc", {
|
|
headers: { "cf-connecting-ip": "198.51.100.2" },
|
|
});
|
|
const trustedOpenApiRequest = new Request("http://localhost:3001/api/openapi/resumes/jane/resume/style-projection");
|
|
const unknownOpenApiRequest = new Request("http://localhost:3001/api/openapi/resumes/jane/resume/style-projection");
|
|
|
|
await app.fetch(trustedRpcRequest, transportEnv("203.0.113.9"));
|
|
await app.fetch(unknownRpcRequest);
|
|
await app.fetch(trustedOpenApiRequest, transportEnv("203.0.113.9"));
|
|
await app.fetch(unknownOpenApiRequest);
|
|
|
|
expect(mocks.handleRpc).toHaveBeenNthCalledWith(1, trustedRpcRequest, "203.0.113.9");
|
|
expect(mocks.handleRpc).toHaveBeenNthCalledWith(2, unknownRpcRequest, "unknown");
|
|
expect(mocks.handleOpenApi).toHaveBeenNthCalledWith(1, trustedOpenApiRequest, "203.0.113.9");
|
|
expect(mocks.handleOpenApi).toHaveBeenNthCalledWith(2, unknownOpenApiRequest, "unknown");
|
|
});
|
|
|
|
it.each([
|
|
["GET", "/robots.txt", "robots", mocks.handleRobots],
|
|
["HEAD", "/robots.txt", "", mocks.handleRobots],
|
|
["GET", "/sitemap.xml", "sitemap", mocks.handleSitemap],
|
|
["HEAD", "/sitemap.xml", "", mocks.handleSitemap],
|
|
["GET", "/llms.txt", "llms", mocks.handleLlms],
|
|
["HEAD", "/llms.txt", "", mocks.handleLlms],
|
|
])("routes %s %s before the static fallback", async (method, pathname, expectedBody, handler) => {
|
|
const { createApp } = await import("./app");
|
|
const app = createApp();
|
|
const request = new Request(`http://localhost:3001${pathname}`, { method });
|
|
|
|
const response = await app.fetch(request);
|
|
|
|
await expect(response.text()).resolves.toBe(expectedBody);
|
|
expect(handler).toHaveBeenCalledWith({ head: method === "HEAD" });
|
|
expect(mocks.serveWebDistStatic).not.toHaveBeenCalled();
|
|
expect(mocks.handleWebApp).not.toHaveBeenCalled();
|
|
});
|
|
});
|