diff --git a/src/features/online-board/components/OnlineBoardStartPage.test.tsx b/src/features/online-board/components/OnlineBoardStartPage.test.tsx index 116478c3..011859b4 100644 --- a/src/features/online-board/components/OnlineBoardStartPage.test.tsx +++ b/src/features/online-board/components/OnlineBoardStartPage.test.tsx @@ -7,7 +7,7 @@ * @vitest-environment jsdom */ -import { describe, it, expect, vi, beforeEach, afterEach } from "vitest"; +import { describe, it, expect, vi, beforeEach, afterEach, afterAll } from "vitest"; import { render, screen, fireEvent, waitFor } from "@testing-library/react"; import { OnlineBoardStartPage, buildOnlineBoardPrefillState } from "./OnlineBoardStartPage.js"; import type { PopularRequest } from "@/features/popular-requests/types.js"; @@ -100,7 +100,16 @@ vi.mock("@/ui/city-autocomplete/index.js", () => ({ // --------------------------------------------------------------------------- describe("buildOnlineBoardPrefillState", () => { - it("builds state for FlightNumber mode", () => { + // Freeze clock so todayYyyymmdd() returns a deterministic value. + beforeEach(() => { + vi.useFakeTimers(); + vi.setSystemTime(new Date(2026, 4, 15, 12, 0, 0)); // 2026-05-15 + }); + afterAll(() => { + vi.useRealTimers(); + }); + + it("4.1.5-B1: FlightNumber click includes date=today, no time field", () => { const request: PopularRequest = { mode: "FlightNumber", carrier: "SU", @@ -110,30 +119,31 @@ describe("buildOnlineBoardPrefillState", () => { expect(buildOnlineBoardPrefillState(request)).toEqual({ tab: "flight", flightNumber: "SU0654", + date: "20260515", }); }); - it("builds state for Departure mode", () => { + it("4.1.5-B2: Departure click includes date=today", () => { expect( buildOnlineBoardPrefillState({ mode: "Departure", departure: "LED", type: "Onlineboard", }), - ).toEqual({ tab: "route", departure: "LED" }); + ).toEqual({ tab: "route", departure: "LED", date: "20260515" }); }); - it("builds state for Arrival mode", () => { + it("4.1.5-B3: Arrival click includes date=today", () => { expect( buildOnlineBoardPrefillState({ mode: "Arrival", arrival: "VKO", type: "Onlineboard", }), - ).toEqual({ tab: "route", arrival: "VKO" }); + ).toEqual({ tab: "route", arrival: "VKO", date: "20260515" }); }); - it("builds state for Route mode", () => { + it("4.1.5-B4: Route click includes date=today", () => { expect( buildOnlineBoardPrefillState({ mode: "Route", @@ -141,7 +151,7 @@ describe("buildOnlineBoardPrefillState", () => { arrival: "KRR", type: "Onlineboard", }), - ).toEqual({ tab: "route", departure: "LED", arrival: "KRR" }); + ).toEqual({ tab: "route", departure: "LED", arrival: "KRR", date: "20260515" }); }); }); diff --git a/src/features/online-board/components/OnlineBoardStartPage.tsx b/src/features/online-board/components/OnlineBoardStartPage.tsx index e1688b0d..84a24916 100644 --- a/src/features/online-board/components/OnlineBoardStartPage.tsx +++ b/src/features/online-board/components/OnlineBoardStartPage.tsx @@ -71,28 +71,42 @@ export interface OnlineBoardPrefillState { departure?: string; arrival?: string; flightNumber?: string; + /** yyyyMMdd — date to pre-populate in the filter calendar (TZ §4.1.5) */ + date?: string; +} + +function todayYyyymmdd(): string { + const d = new Date(); + const y = d.getFullYear().toString(); + const m = (d.getMonth() + 1).toString().padStart(2, "0"); + const day = d.getDate().toString().padStart(2, "0"); + return `${y}${m}${day}`; } export function buildOnlineBoardPrefillState( request: PopularRequest, dictionaries: IDictionaries | null = null, ): OnlineBoardPrefillState { + // TZ §4.1.5: all Board popular-request kinds prefill date = today. + const date = todayYyyymmdd(); switch (request.mode) { case "FlightNumber": return { tab: "flight", flightNumber: `${request.carrier}${request.flightNumber}`, + date, }; case "Departure": - return { tab: "route", departure: toCityCode(request.departure, dictionaries) }; + return { tab: "route", departure: toCityCode(request.departure, dictionaries), date }; case "Arrival": - return { tab: "route", arrival: toCityCode(request.arrival, dictionaries) }; + return { tab: "route", arrival: toCityCode(request.arrival, dictionaries), date }; case "Route": case "RouteWithBack": return { tab: "route", departure: toCityCode(request.departure, dictionaries), arrival: toCityCode(request.arrival, dictionaries), + date, }; } } @@ -164,6 +178,8 @@ export const OnlineBoardStartPage: FC = () => { ...(prefill.departure ? { initialDeparture: prefill.departure } : {}), ...(prefill.arrival ? { initialArrival: prefill.arrival } : {}), ...(prefill.flightNumber ? { initialFlightNumber: prefill.flightNumber } : {}), + // TZ §4.1.5: popular-request click prefills date=today for all Board modes. + ...(prefill.date ? { initialDate: prefill.date } : {}), initialTimeFrom: defaultTimeRange.timeFrom, initialTimeTo: defaultTimeRange.timeTo, }; diff --git a/src/features/schedule/components/ScheduleStartPage.test.tsx b/src/features/schedule/components/ScheduleStartPage.test.tsx index 0ec5d5cf..21d7a3df 100644 --- a/src/features/schedule/components/ScheduleStartPage.test.tsx +++ b/src/features/schedule/components/ScheduleStartPage.test.tsx @@ -7,7 +7,7 @@ * @vitest-environment jsdom */ -import { describe, it, expect, vi, beforeEach } from "vitest"; +import { describe, it, expect, vi, beforeEach, afterEach, afterAll } from "vitest"; import { render, screen, fireEvent } from "@testing-library/react"; import { ScheduleStartPage } from "./ScheduleStartPage.js"; import { sessionStore } from "@/shared/storage.js"; @@ -45,6 +45,12 @@ vi.mock("@/features/popular-requests/components/PopularRequestsPanel.js", () => > Route +