from rpa_yisaiqi.contract_flow_steps import ( ContractFlowContext, ContractGoodsLine, run_contract_create_flow, ) class FakeBrowser: def __init__(self): self.calls = [] self.read_values = { "contract_number": "HT-20260811-REAL-001", } def open_url(self, url): self.calls.append(("open_url", url)) def fill_first(self, selectors, value): self.calls.append(("fill_first", tuple(selectors), value)) def click_first(self, selectors): self.calls.append(("click_first", tuple(selectors))) def wait_for_text(self, text, timeout_seconds=15): self.calls.append(("wait_for_text", text, timeout_seconds)) def select_first(self, selectors, value): self.calls.append(("select_first", tuple(selectors), value)) def upload_file_first(self, selectors, file_path): self.calls.append(("upload_file_first", tuple(selectors), file_path)) def read_first(self, selectors, value_name): self.calls.append(("read_first", tuple(selectors), value_name)) return self.read_values[value_name] def screenshot(self, name): self.calls.append(("screenshot", name)) return f"/tmp/{name}.png" def test_contract_flow_logs_in_with_real_contract_login_selectors(): browser = FakeBrowser() ctx = ContractFlowContext( contract_url="http://contract-test.gzmpc.com:8080/", username="test002", password="1", supplier_name="合同节点联调供应商", order_date="2026-08-11", source_type="XYY", template_type="FORMAT", goods_lines=[], ) run_contract_create_flow(browser, ctx) assert browser.calls[:5] == [ ("open_url", "http://contract-test.gzmpc.com:8080/"), ("fill_first", ('input[name="j_username"]', 'input[placeholder="用户名"]'), "test002"), ("fill_first", ('input[name="j_password"]', 'input[placeholder="密码"]'), "1"), ("click_first", ('input[name="btn_submit"]', 'a[href*="btn_submit"]', 'text=登录')), ("wait_for_text", "合同", 20), ] def test_contract_flow_uses_order_date_and_uploads_yyc_merged_pdf(): browser = FakeBrowser() ctx = ContractFlowContext( contract_url="http://contract-test.gzmpc.com:8080/", username="test002", password="1", supplier_name="合同节点联调供应商", order_date="2026-08-11", source_type="YYC", template_type="FORMAT", goods_lines=[ ContractGoodsLine( operation_code="ADD", goods_code="YP-001", goods_name="阿卡波糖片", approval_no="国药准字H00000001", spec="50mg*30片", unit="盒", quantity=12, ) ], merged_pdf_path="C:/rpa/jobs/JOB-1/contract-merged.pdf", ) contract_no = run_contract_create_flow(browser, ctx) assert contract_no == "HT-20260811-REAL-001" assert ("fill_first", ('label=合同签订日期', 'input[name="fdSignDate"]', 'input[placeholder*="合同签订"]'), "2026-08-11") in browser.calls assert ("fill_first", ('label=合同开始日期', 'input[name="fdStartDate"]', 'input[placeholder*="合同开始"]'), "2026-08-11") in browser.calls assert ("upload_file_first", ('input[type="file"]', 'label=合同证文上传'), "C:/rpa/jobs/JOB-1/contract-merged.pdf") in browser.calls def test_contract_flow_skips_pdf_upload_for_xyy(): browser = FakeBrowser() ctx = ContractFlowContext( contract_url="http://contract-test.gzmpc.com:8080/", username="test002", password="1", supplier_name="小药药供应商", order_date="2026-08-11", source_type="XYY", template_type="FORMAT", goods_lines=[], merged_pdf_path="C:/should-not-upload.pdf", ) run_contract_create_flow(browser, ctx) assert not [call for call in browser.calls if call[0] == "upload_file_first"] def test_contract_flow_enters_real_draft_menu_and_recent_template(): browser = FakeBrowser() ctx = ContractFlowContext( contract_url="http://contract-test.gzmpc.com:8080/", username="test002", password="1", supplier_name="重庆亿昊药业", order_date="2026-08-11", source_type="YYC", template_type="NON_FORMAT", template_name="非格式--采购协议", goods_lines=[], merged_pdf_path="C:/rpa/jobs/JOB-1/contract-merged.pdf", ) run_contract_create_flow(browser, ctx) assert ("click_first", ("text=合同管理", "aria=合同管理")) in browser.calls assert ("click_first", ("text=合同起草", "aria=合同起草")) in browser.calls assert ("wait_for_text", "最近使用模板", 20) in browser.calls assert ( "click_first", ("text=非格式--采购协议", "text=非格式--采购协议...", "title=非格式--采购协议"), ) in browser.calls def test_contract_flow_fills_real_contract_draft_form_fields_from_screenshot(): browser = FakeBrowser() ctx = ContractFlowContext( contract_url="http://contract-test.gzmpc.com:8080/", username="test002", password="1", supplier_name="重庆亿昊药业", order_date="2026-08-11", source_type="XYY", template_type="NON_FORMAT", template_name="非格式--采购协议", customer_code="CUST-001", customer_name="重庆亿昊药业", contract_category="采购协议", settlement_type="付款", contract_background="按订单自动起草采购协议", contract_nature="主合同", amount_currency="人民币", amount="12000.50", contract_end_date="2026-12-31", is_major_contract="否", is_prepayment="否", belong_year="2026", payment_method="账期支付", payment_days="30", contract_status="正式合同", contains_blood_products="否", goods_lines=[], ) run_contract_create_flow(browser, ctx) assert ("fill_first", ('label=客户编码', 'input[name="fdCustomerCode"]', 'input[placeholder*="客户编码"]'), "CUST-001") in browser.calls assert ("fill_first", ('label=客户名称', 'input[name="fdCustomerName"]', 'input[placeholder*="客户名称"]'), "重庆亿昊药业") in browser.calls assert ("select_first", ('label=合同类别', 'select[name="fdContractCategory"]'), "采购协议") in browser.calls assert ("select_first", ('label=结算类型', 'select[name="fdSettlementType"]'), "付款") in browser.calls assert ("fill_first", ('label=合同背景概述', 'textarea[name="fdContractBackground"]'), "按订单自动起草采购协议") in browser.calls assert ("click_first", ("label=主合同", "text=主合同")) in browser.calls assert ("select_first", ('label=合同金额', 'select[name="fdCurrency"]'), "人民币") in browser.calls assert ("fill_first", ('label=金额(元)', 'input[name="fdAmount"]'), "12000.50") in browser.calls assert ("fill_first", ('label=合同签订日期', 'input[name="fdSignDate"]', 'input[placeholder*="合同签订"]'), "2026-08-11") in browser.calls assert ("fill_first", ('label=合同开始日期', 'input[name="fdStartDate"]', 'input[placeholder*="合同开始"]'), "2026-08-11") in browser.calls assert ("fill_first", ('label=合同结束日期', 'input[name="fdEndDate"]', 'input[placeholder*="合同结束"]'), "2026-12-31") in browser.calls assert ("select_first", ('label=是否重大合同', 'select[name="fdIsMajorContract"]'), "否") in browser.calls assert ("select_first", ('label=是否预付款', 'select[name="fdIsPrepayment"]'), "否") in browser.calls assert ("fill_first", ('label=合同归属年份', 'input[name="fdBelongYear"]'), "2026") in browser.calls assert ("select_first", ('label=付款方式', 'select[name="fdPaymentMethod"]', 'select[name="paymentMethod"]'), "账期支付") in browser.calls assert ("fill_first", ('label=付款期限', 'input[name="fdPaymentDays"]', 'input[name="paymentDays"]'), "30") in browser.calls assert ("select_first", ('label=合同状态', 'select[name="fdContractStatus"]'), "正式合同") in browser.calls assert ("select_first", ('label=是否包含血液制品', 'select[name="fdContainsBloodProducts"]'), "否") in browser.calls def test_contract_flow_dry_run_skips_submit_but_still_reads_page_state(): browser = FakeBrowser() ctx = ContractFlowContext( contract_url="http://contract-test.gzmpc.com:8080/", username="test002", password="1", supplier_name="重庆亿昊药业", order_date="2026-08-11", source_type="XYY", template_type="NON_FORMAT", template_name="非格式--采购协议", submit_mode="dry_run", goods_lines=[], ) contract_no = run_contract_create_flow(browser, ctx) assert not [call for call in browser.calls if call[0] == "click_first" and "text=提交" in call[1]] assert ("screenshot", "contract-dry-run-ready") in browser.calls assert contract_no == "" assert not [call for call in browser.calls if call[0] == "read_first"]