AML 測試指引
" + "可疑交易監控測試需涵蓋大額交易與分散交易兩種樣態。
" * 8 + """"Phase 2 自檢:程式化產生各格式最小測試檔,驗證轉換器與 convert.py 端到端。
執行:.venv/Scripts/python tools/convert/selfcheck.py
邏輯壞掉時 assert 會失敗(AGENTS.md §13.4:一個可執行的檢查,不用框架)。
"""
import contextlib
import io
import json
import pathlib
import shutil
import sys
import tempfile
sys.path.insert(0, str(pathlib.Path(__file__).resolve().parents[1])) # tools/ 供 import kb
sys.path.insert(0, str(pathlib.Path(__file__).parent)) # tools/convert
import convert
import from_docx
import from_pdf
import from_pptx
import from_vision
import from_web
import from_xlsx
import kb
import to_image
# 測資檔名一律用「中文 + 空格」——真實來源檔就長這樣,而 git status --porcelain
# 對這兩者都會加引號轉義。ASCII 檔名的測資曾讓 ingest 的 preflight bug 溜過(§12)。
DOCX, XLSX, PDF, SCAN = ("壓測 報告(1).docx", "測試案例 清單.xlsx",
"規格 說明.pdf", "掃描件(2 期.pdf")
PPTX, HTML, TXT, DOC = ("結案 簡報.pptx", "指引 快照.html",
"不支援 筆記.txt", "舊版 報告.doc")
def assert_links_ok(md, base):
"""每個圖片連結都要真的 render 成 、且目標檔存在。
只斷言 "![" 在不在會讓損毀連結矇混過關——含空格/不平衡括號的檔名會產出
語法有效但解析失敗的連結,圖檔明明在磁碟上卻整行退化成純文字(§13.4)。
"""
import re
import urllib.parse
from markdown_it import MarkdownIt
want = md.count("![")
html = MarkdownIt("commonmark").render(md)
got = html.count("
可疑交易監控測試需涵蓋大額交易與分散交易兩種樣態。
" * 8 + "