mirror of
https://github.com/Sea-Haven-Industries/meal-order-manager.git
synced 2026-09-30 06:33:12 +00:00
fix(cart): fail cleanly on a bad CSV and a closed browser
A non-UTF-8 order list and a Playwright error while opening the page now print a short message and exit 1 instead of a traceback.
This commit is contained in:
parent
ca04a117f5
commit
9462ce0966
2 changed files with 56 additions and 7 deletions
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue