diff --git a/src/app/event/__tests__/EventCard.test.tsx b/src/app/event/__tests__/EventCard.test.tsx index 9012b1d..c0d7535 100644 --- a/src/app/event/__tests__/EventCard.test.tsx +++ b/src/app/event/__tests__/EventCard.test.tsx @@ -1,6 +1,11 @@ -import { describe, it, expect, vi } from "vitest"; +import { describe, it, expect, vi, beforeEach } from "vitest"; import { render, screen } from "@testing-library/react"; import EventCard from "../EventCard"; +import { useDestinationStation } from "@/hooks/useDestinationStation"; +import { useJourneys } from "@/hooks/useJourneys"; + +// vi.mock hoists, so these imports are the mocked versions +// We can inspect their call arguments directly // Mock all hooks that EventCard depends on vi.mock("@/hooks/useGeolocation", () => ({ @@ -12,11 +17,11 @@ vi.mock("@/hooks/useGeolocation", () => ({ })); vi.mock("@/hooks/useDestinationStation", () => ({ - useDestinationStation: () => ({ + useDestinationStation: vi.fn(() => ({ station: { name: "Wien Hbf", extId: "0WB0F0001500" }, loading: false, error: null, - }), + })), })); vi.mock("@/hooks/useGeocode", () => ({ @@ -28,11 +33,11 @@ vi.mock("@/hooks/useGeocode", () => ({ })); vi.mock("@/hooks/useJourneys", () => ({ - useJourneys: () => ({ + useJourneys: vi.fn(() => ({ journeys: [], loading: false, error: null, - }), + })), })); vi.mock("@/hooks/useBikeRoute", () => ({ @@ -43,6 +48,13 @@ vi.mock("@/hooks/useBikeRoute", () => ({ }), })); +vi.mock("@/hooks/useClock", () => ({ + useClock: () => ({ + countdown: { label: "No deadline set", color: "text-gray-400", urgent: false }, + status: "upcoming", + }), +})); + vi.mock("@/lib/countdown-utils", () => ({ calculateCountdown: () => ({ label: "No deadline set", @@ -52,6 +64,22 @@ vi.mock("@/lib/countdown-utils", () => ({ })); describe("EventCard", () => { + beforeEach(() => { + (useDestinationStation as ReturnType).mockReset(); + (useDestinationStation as ReturnType).mockImplementation(() => ({ + station: { name: "Wien Hbf", extId: "0WB0F0001500" }, + loading: false, + error: null, + })); + + (useJourneys as ReturnType).mockReset(); + (useJourneys as ReturnType).mockImplementation(() => ({ + journeys: [], + loading: false, + error: null, + })); + }); + it("renders event title and destination", () => { const mockEvent = { id: "test-1", @@ -67,4 +95,40 @@ describe("EventCard", () => { expect(screen.getByText("Team Meeting")).toBeInTheDocument(); expect(screen.getByText("Wien Hbf")).toBeInTheDocument(); }); + + it("passes destStation.station.extId to useJourneys as the destination argument", () => { + const mockEvent = { + id: "test-2", + title: "Lunch at Hofburg", + destination: "Hofburg", + eventTime: new Date("2025-12-01T12:00:00"), + source: "manual" as const, + }; + + const mockStation = { name: "Graz Hbf", extId: "0WB0F0000600" }; + + render(); + + // useDestinationStation should be called with the event's destination string + expect(useDestinationStation).toHaveBeenCalledWith("Hofburg"); + + // useJourneys should be called with origin extId as first arg + // and the destination station's extId as second arg (NOT null) + expect(useJourneys).toHaveBeenCalledWith("0WB0F0000600", "0WB0F0001500", new Date("2025-12-01T12:00:00"), 0); + }); + + it("passes null as originStation extId to useJourneys when originStation is null", () => { + const mockEvent = { + id: "test-3", + title: "Meeting without origin", + destination: "Parapluie", + eventTime: new Date("2025-12-01T10:00:00"), + source: "manual" as const, + }; + + render(); + + // When originStation is null, the first arg to useJourneys should be null + expect(useJourneys).toHaveBeenCalledWith(null, "0WB0F0001500", new Date("2025-12-01T10:00:00"), 0); + }); });