Files
frontend-helper/tests/feed-route.test.ts

41 lines
1.8 KiB
TypeScript

import { describe, expect, it, vi } from "vitest";
import { NextRequest } from "next/server";
import { GET } from "@/app/api/feed/route";
import { createSession } from "@/lib/session-store";
describe("GET /api/feed", () => {
it("no cookie -> 401 sign_in", async () => {
const res = await GET(new NextRequest("http://localhost/api/feed"));
expect(res.status).toBe(401);
expect(await res.json()).toEqual({ error: "sign_in" });
});
it("signed in: page then next page with cursor; limit capped at 50", async () => {
const sid = createSession({
profileAccessToken: "p", profileAccessTokenExpiresAt: null, profileRefreshToken: "r",
feedAccessToken: "T", feedAccessTokenExpiresAt: null,
person: { userId: "u", name: "A", email: "a@b.co", pictureUrl: null }, createdAt: Date.now(),
});
const urls: string[] = [];
const orig = globalThis.fetch;
globalThis.fetch = vi.fn(async (url: string) => {
urls.push(String(url));
const next = urls.length === 1 ? "C1" : null;
return new Response(JSON.stringify({ data: [{ n: urls.length }], metadata: { nextCursor: next } }), { status: 200 });
}) as unknown as typeof fetch;
try {
const h = { cookie: `mfb_session=${sid}` };
const r1 = await GET(new NextRequest("http://localhost/api/feed", { headers: h }));
expect(await r1.json()).toEqual({ items: [{ n: 1 }], nextCursor: "C1" });
const r2 = await GET(new NextRequest("http://localhost/api/feed?cursor=C1&limit=500", { headers: h }));
expect(await r2.json()).toEqual({ items: [{ n: 2 }], nextCursor: null });
expect(new URL(urls[0]).searchParams.has("cursor")).toBe(false);
const u2 = new URL(urls[1]);
expect(u2.searchParams.get("cursor")).toBe("C1");
expect(u2.searchParams.get("limit")).toBe("50");
} finally {
globalThis.fetch = orig;
}
});
});