From 21f84e2fb6c9ae29882eb135f8ece86b804fcc16 Mon Sep 17 00:00:00 2001 From: Edward Betts Date: Tue, 26 May 2026 12:55:39 +0100 Subject: [PATCH] Select outbound date first for returns --- templates/index.html | 12 +++++++----- tests/test_playwright_return_fares.py | 26 ++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/templates/index.html b/templates/index.html index 20882e8..8d29dfe 100644 --- a/templates/index.html +++ b/templates/index.html @@ -163,7 +163,7 @@ /* ── state ───────────────────────────────────────────────────────── */ let viewYear = TODAY.getFullYear(); let viewMonth = TODAY.getMonth(); // 0-based - let outDate = new Date(TODAY); // default: today selected + let outDate = new Date(TODAY); // default for single journeys let retDate = null; let hoverDate = null; let isReturn = false; @@ -409,12 +409,12 @@ ? 'Date: ' + dispDate(outDate) + '' : 'Select a travel date'; } else if (!outDate) { - el.innerHTML = 'Select departure date'; + el.innerHTML = 'Select outbound date'; } else if (retPhase) { - el.innerHTML = 'Depart: ' + dispDate(outDate) + + el.innerHTML = 'Outbound: ' + dispDate(outDate) + '  ·  Now select return date'; } else { - el.innerHTML = 'Depart: ' + dispDate(outDate) + + el.innerHTML = 'Outbound: ' + dispDate(outDate) + '  ·  Return: ' + dispDate(retDate) + ''; } } @@ -439,9 +439,11 @@ var wasReturn = isReturn; isReturn = this.value === 'return'; if (isReturn && !wasReturn) { + outDate = null; retDate = null; - retPhase = outDate !== null; + retPhase = false; } else if (!isReturn) { + if (!outDate) outDate = new Date(TODAY); retDate = null; retPhase = false; } diff --git a/tests/test_playwright_return_fares.py b/tests/test_playwright_return_fares.py index ee4eeae..01205ff 100644 --- a/tests/test_playwright_return_fares.py +++ b/tests/test_playwright_return_fares.py @@ -506,6 +506,32 @@ def test_return_advance_first_standard_premier_totals(local_server: str) -> None browser.close() +def test_return_calendar_selects_outbound_before_return(local_server: str) -> None: + with sync_playwright() as p: + browser = _launch_browser(p) + page = browser.new_page() + page.goto(f"{local_server}/", wait_until="domcontentloaded") + + page.locator("#journey-return").check(force=True) + assert page.locator("#cal-hint").inner_text() == "Select outbound date" + assert page.locator("#travel_date").input_value() == "" + assert page.locator("#return_date").input_value() == "" + + page.get_by_role("button", name="10 June 2026").click() + assert page.locator("#travel_date").input_value() == "2026-06-10" + assert page.locator("#return_date").input_value() == "" + assert "Now select return date" in page.locator("#cal-hint").inner_text() + + page.get_by_role("button", name="17 June 2026").click() + assert page.locator("#travel_date").input_value() == "2026-06-10" + assert page.locator("#return_date").input_value() == "2026-06-17" + assert "Return: Wed 17 Jun" in page.locator("#cal-hint").inner_text() + + page.locator('button[type="submit"]').click() + page.wait_for_url("**/results/BRI/paris/2026-06-10/return/2026-06-17", timeout=10000) + browser.close() + + def test_return_advance_first_standard_premier_totals_on_initial_url( local_server: str, ) -> None: