Clamp projectScheduleToBoard.date to today only when schedule dateFrom is out-of-window

This commit is contained in:
2026-04-21 18:34:20 +03:00
parent b910fd058c
commit ef33b557f6
2 changed files with 44 additions and 8 deletions
@@ -186,10 +186,11 @@ describe("4.1.8-R1/R2: projectBoardToSchedule", () => {
});
describe("4.1.8-R1/R2: projectScheduleToBoard", () => {
it("carries departure + arrival, sets date=today, clears time", () => {
it("carries departure + arrival, preserves in-window dateFrom, clears time", () => {
// Clock frozen at 2026-05-15. dateFrom = 2026-05-14 (yesterday, within Board window [-1,+14])
const sched: ScheduleFilterSnapshot = {
mode: "route", departure: "MOW", arrival: "LED",
dateFrom: "20260511", dateTo: "20260517",
dateFrom: "20260514", dateTo: "20260520",
timeFrom: "0600", timeTo: "2200",
onlyDirect: true, showReturn: false,
searchExecuted: true,
@@ -197,12 +198,38 @@ describe("4.1.8-R1/R2: projectScheduleToBoard", () => {
const p = projectScheduleToBoard(sched);
expect(p.departure).toBe("MOW");
expect(p.arrival).toBe("LED");
expect(p.date).toBe("20260515"); // today (frozen clock)
expect(p.date).toBe("20260514"); // in-window → preserved
expect(p.timeFrom).toBe("0000");
expect(p.timeTo).toBe("2400");
expect(p.searchExecuted).toBe(false);
});
it("4.1.8-R2: preserves dateFrom when schedule dateFrom is today (in-window)", () => {
// Clock frozen at 2026-05-15. dateFrom = today is definitely in window.
const sched: ScheduleFilterSnapshot = {
mode: "route", departure: "MOW", arrival: "LED",
dateFrom: "20260515", dateTo: "20260521",
timeFrom: "0000", timeTo: "2400",
onlyDirect: false, showReturn: false,
searchExecuted: true,
};
const p = projectScheduleToBoard(sched);
expect(p.date).toBe("20260515"); // in-window → preserved (also equals today)
});
it("4.1.8-R2: preserves dateFrom when schedule dateFrom is within +14 days", () => {
// Clock frozen at 2026-05-15. +7 days = 2026-05-22, within the +14 window.
const sched: ScheduleFilterSnapshot = {
mode: "route", departure: "MOW", arrival: "LED",
dateFrom: "20260522", dateTo: "20260528",
timeFrom: "0000", timeTo: "2400",
onlyDirect: false, showReturn: false,
searchExecuted: true,
};
const p = projectScheduleToBoard(sched);
expect(p.date).toBe("20260522"); // in-window → preserved
});
it("does not carry optional departure when schedule has only arrival", () => {
const p = projectScheduleToBoard({
mode: "route", arrival: "LED",
@@ -226,7 +253,7 @@ describe("4.1.8-R1/R2: projectScheduleToBoard", () => {
expect(p.mode).toBe("route");
});
it("4.1.8-R2: projectScheduleToBoard clamps to today when schedule dateFrom is > board window", () => {
it("4.1.8-R2: projectScheduleToBoard clamps to today when schedule dateFrom is outside board window (future)", () => {
// Clock frozen at 2026-05-15. Schedule dateFrom = 2026-07-01 (47 days forward, outside board's +14 window)
const schedule: ScheduleFilterSnapshot = {
mode: "route",
@@ -244,8 +271,8 @@ describe("4.1.8-R1/R2: projectScheduleToBoard", () => {
expect(projected.date).toBe("20260515"); // clamps to today
});
it("4.1.8-R2: projectScheduleToBoard uses today even when schedule dateFrom is before today-1", () => {
// Schedule dateFrom in the distant past
it("4.1.8-R2: projectScheduleToBoard clamps to today when schedule dateFrom is outside board window (past)", () => {
// Schedule dateFrom in the distant past, outside the -1 day board window
const schedule: ScheduleFilterSnapshot = {
mode: "route",
departure: "MOW",
+11 -2
View File
@@ -6,6 +6,8 @@
* projected from / to Board or Schedule (per TZ §4.1.1 ¶12).
*/
import { isInBoardWindow } from "@/shared/dateWindow.js";
export interface BoardFilterSnapshot {
mode: "route" | "flight-number" | "departure" | "arrival";
departure?: string;
@@ -97,13 +99,20 @@ export function projectBoardToSchedule(b: BoardFilterSnapshot): ScheduleFilterSn
};
}
/** TZ Table 10: Schedule → Board projection. Preserves cities + date=today. */
/**
* TZ Table 10: Schedule → Board projection. Preserves cities.
* Date: use schedule's dateFrom if it falls within the Board window
* ([-1, +14] days from today); otherwise clamp to today. This preserves
* user intent when the schedule date is near-term but avoids showing a
* date the Board cannot display.
*/
export function projectScheduleToBoard(s: ScheduleFilterSnapshot): BoardFilterSnapshot {
const date = isInBoardWindow(s.dateFrom) ? s.dateFrom : todayYyyymmdd();
return {
mode: "route",
...(s.departure ? { departure: s.departure } : {}),
...(s.arrival ? { arrival: s.arrival } : {}),
date: todayYyyymmdd(),
date,
timeFrom: "0000",
timeTo: "2400",
searchExecuted: false,