"""差旅明细:交通费行按实际乘车日填开始/结束日期(控件 #ksrq/#jsrq 为联机实测)。""" from typing import Any from src.infra.browser import travel class _Page: def __init__(self) -> None: self.fills: dict[str, str] = {} self.selects: list[tuple[str, str]] = [] self.clicks: list[str] = [] def click(self, selector: str, timeout: int | None = None) -> None: self.clicks.append(selector) def select_option(self, selector: str, value: str) -> None: self.selects.append((selector, value)) def fill(self, selector: str, value: str) -> None: self.fills[selector] = value def wait_for_timeout(self, ms: int) -> None: pass class _Bot: def __init__(self) -> None: self.page = _Page() def open_tab(self, name: str, timeout_ms: int = 20000) -> bool: return True def tab_ready(self, name: str) -> bool: return True def click_if_visible(self, selector: str, timeout_ms: int = 4000) -> bool: return True def _wait_for(self, selector: str, timeout: int | None = None) -> None: pass def _screenshot(self, name: str) -> str: return "" def _transport(start: str, end: str) -> dict[str, Any]: return { "vehicle_type": "火车", "start_date": start, "end_date": end, "departure_place": "阜阳", "arrival_place": "合肥", "amount": "233", "bill_count": "2", "remark": "两张高铁票", } def test_transport_dates_use_ride_dates() -> None: bot = _Bot() travel.add_travel_items( bot, # type: ignore[arg-type] {"transport_fee": [_transport("2026-06-05", "2026-06-05")], "hotel_fee": [], "conference_fee": []}, ) assert bot.page.fills["#ksrq"] == "2026-06-05" assert bot.page.fills["#jsrq"] == "2026-06-05" assert ("#jtgj", "01") in bot.page.selects # 交通工具仍然照选 assert bot.page.fills["#ksdd"] == "阜阳" and bot.page.fills["#jsdd"] == "合肥" def test_missing_dates_keep_page_defaults() -> None: bot = _Bot() travel.add_travel_items( bot, # type: ignore[arg-type] {"transport_fee": [_transport("", "")], "hotel_fee": [], "conference_fee": []}, ) assert "#ksrq" not in bot.page.fills and "#jsrq" not in bot.page.fills # 不覆盖页面带出的出差起止 assert bot.page.fills["#ksdd"] == "阜阳"