from __future__ import annotations import pytest import main from job import run_batch from mall_config import YAOEX_MALL_NAME, YBM_MALL_NAME from repo import MappingRow, MemorySelectRepo from rules import Candidate, normalize_vendor from search_yaoex import YaoexAuth def test_old_excel_and_cart_flags_are_gone(): with pytest.raises(SystemExit): main.parse_args(["--execute-cart"]) with pytest.raises(SystemExit): main.parse_args(["--input", "x.xlsx"]) with pytest.raises(SystemExit): main.parse_args(["--dry-run"]) def test_main_writes_cart_rows_from_mapping(monkeypatch): repo = MemorySelectRepo( [ MappingRow( fid=1, oms_id=2026100201, bar_code="06901234567890", sale_price=100.0, plan_purchase_qty=10, approval_no="国药准字H20100001", goods_name="药A", goods_spec="0.25g", manufacturer="示例", org_code="901", deal_flag=0, ) ] ) def fake_login_yaoex(*_args, **_kwargs): return YaoexAuth(token="t", user_id="u", buyer_code="b") def fake_login_ybm(*_args, **_kwargs): return {"sid": "1"} def fake_search_yaoex(*_args, **_kwargs): vendor = "广东壹号药业有限公司" return [ Candidate( mall_name=YAOEX_MALL_NAME, sku_id="S1", name="药A", spec="0.25g", price=90.0, expiry_raw="13", expiry_months=13.0, vendor_raw=vendor, vendor_norm=normalize_vendor(vendor), stock=20.0, ) ] def fake_search_ybm(*_args, **_kwargs): vendor = "某第三方" return [ Candidate( mall_name=YBM_MALL_NAME, sku_id="Y1", name="药A", spec="0.25g", price=70.0, expiry_raw="13", expiry_months=13.0, vendor_raw=vendor, vendor_norm=normalize_vendor(vendor), stock=20.0, ) ] monkeypatch.setattr(main, "login_yaoex", fake_login_yaoex) monkeypatch.setattr(main, "login_ybm", fake_login_ybm) monkeypatch.setattr(main, "search_yaoex_candidates", fake_search_yaoex) monkeypatch.setattr(main, "search_ybm_candidates", fake_search_ybm) main.main(["--fresh-login"], repo=repo) assert repo.mapping[2026100201].deal_flag == 1 assert len(repo.cart) == 1 assert repo.cart[0]["platform_type"] == 66 assert repo.cart[0]["status"] == 1 assert repo.cart[0]["bar_code"] == "06901234567890" def test_run_batch_empty_claim_is_noop(): repo = MemorySelectRepo([]) summary = run_batch( repo, platforms=[YAOEX_MALL_NAME], searchers={}, login_errors={}, ) assert summary.claimed == 0 assert repo.cart == []