AutoRpa/state_center/tests/test_yisaiqi_contract_flow_...

216 lines
9.1 KiB
Python

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"]