74 lines
2.5 KiB
Python
74 lines
2.5 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""测试 Excel 明细导入接口(multipart 上传)。"""
|
|
import io
|
|
import os
|
|
import re
|
|
import urllib.parse
|
|
import urllib.request
|
|
|
|
import openpyxl
|
|
|
|
BASE = "http://127.0.0.1:8080"
|
|
OUT = r"D:\2026-09-09-task-18\tools\out"
|
|
os.makedirs(OUT, exist_ok=True)
|
|
|
|
|
|
def new_session():
|
|
import http.cookiejar
|
|
cj = http.cookiejar.CookieJar()
|
|
return urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
|
|
|
|
|
|
def post_form(op, path, data):
|
|
body = urllib.parse.urlencode(data).encode()
|
|
r = op.open(urllib.request.Request(BASE + path, data=body), timeout=30)
|
|
return r.geturl(), r.read()
|
|
|
|
|
|
def multipart_upload(op, path, field, filename, content, extra=None):
|
|
boundary = "----PoTestBoundary1234"
|
|
buf = io.BytesIO()
|
|
for k, v in (extra or {}).items():
|
|
buf.write(("--%s\r\nContent-Disposition: form-data; name=\"%s\"\r\n\r\n%s\r\n"
|
|
% (boundary, k, v)).encode("utf-8"))
|
|
buf.write(("--%s\r\nContent-Disposition: form-data; name=\"%s\"; filename=\"%s\"\r\n"
|
|
"Content-Type: application/octet-stream\r\n\r\n" % (boundary, field, filename))
|
|
.encode("utf-8"))
|
|
buf.write(content)
|
|
buf.write(("\r\n--%s--\r\n" % boundary).encode())
|
|
req = urllib.request.Request(BASE + path, data=buf.getvalue(), method="POST")
|
|
req.add_header("Content-Type", "multipart/form-data; boundary=%s" % boundary)
|
|
r = op.open(req, timeout=30)
|
|
return r.geturl(), r.read().decode("utf-8", "replace")
|
|
|
|
|
|
def main():
|
|
op = new_session()
|
|
post_form(op, "/login", {"username": "maker", "password": "123456"})
|
|
|
|
wb = openpyxl.Workbook()
|
|
ws = wb.active
|
|
ws.append([u"物料代码", u"物料规格", u"单位", u"数量", u"含税单价", u"交期", u"备注"])
|
|
ws.append([u"X-001", u"导入测试件 & <一>", u"件", 10, 99.9, "2026-10-01", u"首件"])
|
|
ws.append([u"X-002", u"导入测试件 二", u"套", 3, 128.5, "2026-10-05", u""])
|
|
buf = io.BytesIO()
|
|
wb.save(buf)
|
|
xlsx = buf.getvalue()
|
|
|
|
url, _ = post_form(op, "/orders/new", {"doc_type": "purchase", "supplier_id": ""})
|
|
oid = int(re.search(r"/orders/(\d+)", url).group(1))
|
|
print("order id", oid)
|
|
|
|
url, html = multipart_upload(op, "/orders/%d/import_excel" % oid, "file",
|
|
"test.xlsx", xlsx, {"mode": "replace"})
|
|
ok = "已导入 2 行明细" in html
|
|
print("import rows ok:", ok)
|
|
ok2 = "99.90" in html or "99.9" in html
|
|
print("price present:", ok2)
|
|
assert ok and ok2
|
|
print("IMPORT TEST PASSED")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|