web: add test for the compact event api
This commit is contained in:
@@ -0,0 +1,138 @@
|
||||
import { NextRequest } from "next/server";
|
||||
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
||||
|
||||
const queryMock = vi.fn();
|
||||
vi.mock("@/app/client", () => ({
|
||||
getClient: () => ({ query: queryMock }),
|
||||
}));
|
||||
|
||||
import { GET } from "./route.ts";
|
||||
|
||||
const request = (path: string) => new NextRequest(`http://localhost${path}`);
|
||||
|
||||
const occurrence = (id: string, start: string) => ({
|
||||
id,
|
||||
start,
|
||||
end: null,
|
||||
venue: {
|
||||
id: "v1",
|
||||
slug: "storsalen",
|
||||
title: "Storsalen",
|
||||
preposition: "i",
|
||||
url: "/lokaler/storsalen",
|
||||
},
|
||||
});
|
||||
|
||||
const data = (futureEvents: unknown[]) => ({
|
||||
index: { id: "idx" },
|
||||
events: { futureEvents },
|
||||
eventCategories: [],
|
||||
eventOrganizers: [],
|
||||
venues: [],
|
||||
});
|
||||
|
||||
// "now" is 2026-07-07 12:00 in Oslo
|
||||
beforeEach(() => {
|
||||
vi.useFakeTimers();
|
||||
vi.setSystemTime(new Date("2026-07-07T10:00:00Z"));
|
||||
vi.stubEnv("URL", "https://neuf.no");
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
vi.useRealTimers();
|
||||
vi.unstubAllEnvs();
|
||||
vi.clearAllMocks();
|
||||
});
|
||||
|
||||
describe("GET /api/v1/events", () => {
|
||||
it("rejects a missing or unknown view parameter", async () => {
|
||||
for (const path of ["/api/v1/events", "/api/v1/events?view=full"]) {
|
||||
const res = await GET(request(path));
|
||||
expect(res.status).toBe(400);
|
||||
expect(await res.json()).toEqual({
|
||||
error: "must provide valid view parameter",
|
||||
});
|
||||
}
|
||||
expect(queryMock).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it("returns compact events with the earliest future occurrence", async () => {
|
||||
queryMock.mockResolvedValue({
|
||||
data: data([
|
||||
{
|
||||
id: "a",
|
||||
slug: "konsert",
|
||||
title: "Konsert",
|
||||
subtitle: "Med kor",
|
||||
occurrences: [
|
||||
occurrence("a-0", "2026-07-01T18:00:00Z"), // past, dropped
|
||||
occurrence("a-1", "2026-07-12T18:00:00Z"),
|
||||
occurrence("a-2", "2026-07-08T18:00:00Z"),
|
||||
],
|
||||
},
|
||||
]),
|
||||
});
|
||||
|
||||
const res = await GET(request("/api/v1/events?view=compact-app"));
|
||||
|
||||
expect(res.status).toBe(200);
|
||||
expect(await res.json()).toEqual({
|
||||
events: [
|
||||
{
|
||||
id: "a",
|
||||
slug: "konsert",
|
||||
title: "Konsert",
|
||||
subtitle: "Med kor",
|
||||
nextOccurrence: occurrence("a-2", "2026-07-08T18:00:00Z"),
|
||||
url: "https://neuf.no/arrangementer/konsert",
|
||||
futureOccurrencesCount: 2,
|
||||
},
|
||||
],
|
||||
total: 1,
|
||||
});
|
||||
});
|
||||
|
||||
it("keeps events with no future occurrences, with a null nextOccurrence", async () => {
|
||||
queryMock.mockResolvedValue({
|
||||
data: data([
|
||||
{
|
||||
id: "b",
|
||||
slug: "fortid",
|
||||
title: "Fortid",
|
||||
subtitle: "",
|
||||
occurrences: [occurrence("b-0", "2026-07-01T18:00:00Z")],
|
||||
},
|
||||
]),
|
||||
});
|
||||
|
||||
const res = await GET(request("/api/v1/events?view=compact-app"));
|
||||
|
||||
expect(res.status).toBe(200);
|
||||
expect(await res.json()).toEqual({
|
||||
events: [
|
||||
{
|
||||
id: "b",
|
||||
slug: "fortid",
|
||||
title: "Fortid",
|
||||
subtitle: "",
|
||||
nextOccurrence: null,
|
||||
url: "https://neuf.no/arrangementer/fortid",
|
||||
futureOccurrencesCount: 0,
|
||||
},
|
||||
],
|
||||
total: 1,
|
||||
});
|
||||
});
|
||||
|
||||
it("throws on a query error or missing data", async () => {
|
||||
queryMock.mockResolvedValue({ error: { message: "cms nede" } });
|
||||
await expect(GET(request("/api/v1/events?view=compact-app"))).rejects.toThrow(
|
||||
"cms nede"
|
||||
);
|
||||
|
||||
queryMock.mockResolvedValue({ data: { index: { id: "idx" } } });
|
||||
await expect(GET(request("/api/v1/events?view=compact-app"))).rejects.toThrow(
|
||||
"Failed to fetch events"
|
||||
);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user