1
0
forked from erp-dev/erp
Files
erpnew/printing/test_docx_template.py

56 lines
1.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import re
import zipfile
from pathlib import Path
from django.conf import settings
from django.test import SimpleTestCase
class DocxTemplateRenderTest(SimpleTestCase):
def _extract_doc_text(self, docx_path: str) -> str:
with zipfile.ZipFile(docx_path, "r") as zf:
xml = zf.read("word/document.xml").decode("utf-8", errors="replace")
# Extract only <w:t> text to avoid false positives in tags/attrs.
import xml.etree.ElementTree as ET
ns = {"w": "http://schemas.openxmlformats.org/wordprocessingml/2006/main"}
root = ET.fromstring(xml)
texts = [(el.text or "") for el in root.findall(".//w:t", ns)]
return "".join(texts)
def test_render_replaces_and_clears_placeholders(self):
template_path = str(Path(settings.BASE_DIR) / "print-template.docx")
self.assertTrue(Path(template_path).exists())
from printing.docx_template import render_docx_template
out_path = str(Path(settings.BASE_DIR) / ".tmp_docx" / "rendered-test.docx")
Path(out_path).parent.mkdir(parents=True, exist_ok=True)
render_docx_template(
template_path=template_path,
output_path=out_path,
context={
# hash placeholder inner key
"打印-销售单8*9.客户名称": "客户A",
# plain brace placeholder inner key
"备注": "这是备注",
},
clear_unresolved=True,
)
text = self._extract_doc_text(out_path)
self.assertIn("客户A", text)
self.assertIn("这是备注", text)
# No raw placeholders should remain when clear_unresolved=True
self.assertIsNone(
re.search(r"#\{.{1,300}?\}", text, flags=re.S),
msg="仍残留 #{...} 占位符",
)
self.assertIsNone(
re.search(r"(?<!#)\{[^{}\r\n]{1,200}\}", text),
msg="仍残留 {...} 占位符",
)