diff --git a/scripts/fill_redefine_cart.py b/scripts/fill_redefine_cart.py index 7ba2bd1..4983fbb 100644 --- a/scripts/fill_redefine_cart.py +++ b/scripts/fill_redefine_cart.py @@ -79,6 +79,9 @@ def main(argv: list[str] | None = None) -> int: menu_html = fetch_menu_html(args.menu_url) products = extract_catalog_products(menu_html) plan = build_plan(csv_text, products) + except UnicodeDecodeError: + print("CSV must be UTF-8.", file=sys.stderr) + return 1 except (OSError, FillCartError, MenuParseError) as exc: print(exc, file=sys.stderr) return 1 @@ -102,14 +105,23 @@ def _fill(plan: FillPlan, menu_url: str) -> int: file=sys.stderr, ) return 1 - page = browser.new_page() + return _fill_browser(browser, plan, menu_url) + + +def _fill_browser(browser, plan: FillPlan, menu_url: str) -> int: + try: try: - return _fill_page(page, plan, menu_url) - finally: - try: - browser.close() - except PlaywrightError: - pass + page = browser.new_page() + except PlaywrightError as exc: + print(f"Failed: {exc}") + print(f"Added 0. Failed 1. Skipped {len(plan.skipped)}.") + return 1 + return _fill_page(page, plan, menu_url) + finally: + try: + browser.close() + except PlaywrightError: + pass def _fill_page(page, plan: FillPlan, menu_url: str) -> int: diff --git a/tests/test_fill_cart.py b/tests/test_fill_cart.py index a9b4038..ac8011a 100644 --- a/tests/test_fill_cart.py +++ b/tests/test_fill_cart.py @@ -148,6 +148,43 @@ class _CartPage: return response +def test_main_rejects_a_non_utf8_csv(tmp_path, capsys): + path = tmp_path / "order.csv" + path.write_bytes(b"Item,Quantity\nCaf\xe9 Bowl,1\n") + + code = fill_redefine_cart.main([str(path)]) + error = capsys.readouterr().err + + assert code == 1 + assert error.strip() == "CSV must be UTF-8." + assert "Traceback" not in error + + +def test_fill_browser_prints_a_summary_when_the_page_cannot_open(capsys): + plan = build_plan("Item,Quantity\nKorean Steak Bowl,1\n", PRODUCTS) + + class ClosedBrowser: + def __init__(self): + self.closed = False + + def new_page(self): + raise PlaywrightError("browser has been closed") + + def close(self): + self.closed = True + + browser = ClosedBrowser() + code = fill_redefine_cart._fill_browser( + browser, plan, "https://www.redefinemeals.com/menu" + ) + output = capsys.readouterr().out + + assert code == 1 + assert browser.closed + assert "Traceback" not in output + assert "Added 0. Failed 1. Skipped 0." in output + + def test_fill_page_prints_a_summary_when_the_window_closes_mid_add(capsys): plan = build_plan("Item,Quantity\nKorean Steak Bowl,1\n", PRODUCTS) page = _CartPage(