Files
md_to_gost/tests/test_pipeline.py
T
Igor20264 b38661f588
Python application / build (push) Has been cancelled
Update 0.4.0
- Add\Rework UI
- Add Split Table and Listing
- Add Support Customazeble schems
2026-09-04 22:28:39 +03:00

187 lines
6.2 KiB
Python

"""CLI/GUI shared pipeline helpers."""
import os
import sys
from md2gost.dnd import first_markdown, normalize_drop_paths, parse_tkdnd_files
from md2gost.pipeline import ConvertRequest, convert, default_output_path, should_launch_gui
from md2gost.__main__ import build_parser, request_from_args
def test_should_launch_gui():
assert should_launch_gui(None, False) is True
assert should_launch_gui("", False) is True
assert should_launch_gui("a.md", True) is True
assert should_launch_gui("a.md", False) is False
def test_default_output_path():
path = default_output_path(r"C:\docs\report.md")
assert path.endswith("report.docx")
def test_parse_tkdnd_files():
raw = r"{C:\My Files\a.md} C:\tmp\b.md"
assert parse_tkdnd_files(raw) == [r"C:\My Files\a.md", r"C:\tmp\b.md"]
def test_normalize_and_first_markdown(tmp_path):
md = tmp_path / "note.md"
png = tmp_path / "pic.png"
md.write_text("# hi\n", encoding="utf-8")
png.write_text("x", encoding="utf-8")
paths = normalize_drop_paths([str(png), str(md)])
assert first_markdown(paths) == os.path.normpath(str(md))
def test_convert_rejects_non_md(tmp_path):
txt = tmp_path / "file.txt"
txt.write_text("nope", encoding="utf-8")
result = convert(ConvertRequest(filename=str(txt)))
assert result.ok is False
assert result.exit_code == 1
def test_convert_missing_file():
result = convert(ConvertRequest(filename="definitely-missing.md"))
assert result.ok is False
assert result.exit_code == 2
def test_parser_gui_and_optional_file():
parser = build_parser()
args = parser.parse_args(["--gui", "report.md", "--type", "PIS_custom"])
assert args.gui is True
assert args.filename == "report.md"
req = request_from_args(args)
assert req.doc_type == "PIS_custom"
assert req.filename == "report.md"
def test_win32_drop_api_pointer_width():
if sys.platform != "win32":
return
import ctypes
from md2gost.dnd import _win32_drop_api
api = _win32_drop_api()
assert api.CallWindowProc.argtypes[0] is ctypes.c_void_p
huge = (1 << 40) | 0x1234
api.CallWindowProc.argtypes[0](huge) # must not OverflowError
def test_win32_drop_hook_survives_window_messages():
if sys.platform != "win32":
return
import tkinter as tk
from md2gost.dnd import enable_file_drop
root = tk.Tk()
try:
root.geometry("240x160+40+40")
root.update()
kind = enable_file_drop(root, lambda _paths: None)
root.update()
root.event_generate("<Motion>", x=12, y=12)
root.update()
assert kind in {"win32", "tkdnd", "none"}
finally:
root.destroy()
def test_argv_needs_console():
from md2gost.__main__ import _argv_needs_console
assert _argv_needs_console(["md2gost"]) is False
assert _argv_needs_console(["md2gost", "--gui"]) is False
assert _argv_needs_console(["md2gost", "--help"]) is True
assert _argv_needs_console(["md2gost", "report.md"]) is True
assert _argv_needs_console(["md2gost", "--gui", "report.md"]) is False
def test_gui_module_imports():
from md2gost import gui
assert hasattr(gui, "run_gui")
assert hasattr(gui, "main")
def test_hr_pagebreak_becomes_page_break():
import os
import docx
from md2gost import package_dir
from md2gost.parser_ import Parser
from md2gost.renderable.page_break import PageBreak
doc = docx.Document(os.path.join(package_dir(), "Template.docx"))
doc._body.clear_content()
text = "До разрыва.\n\n---\n\nПосле разрыва.\n"
items = list(Parser(doc, text, hr_pagebreak=True).parse())
assert any(isinstance(x, PageBreak) for x in items)
doc2 = docx.Document(os.path.join(package_dir(), "Template.docx"))
doc2._body.clear_content()
items_off = list(Parser(doc2, text, hr_pagebreak=False).parse())
assert not any(isinstance(x, PageBreak) for x in items_off)
texts = []
for item in items_off:
para = getattr(item, "_docx_paragraph", None)
if para is not None:
texts.append(para.text)
assert not any("ThematicBreak" in t for t in texts)
def test_prompt_catalog_loads():
from md2gost.help_content import load_prompt_catalog
catalog = load_prompt_catalog()
names = {name for name, _title, text in catalog}
assert "generate-mirea-report.md" in names
assert "generate-pis-custom-report.md" in names
assert all(text.strip() for _n, _t, text in catalog)
def test_listing_continuation_mode():
import os
import docx
from md2gost import package_dir
from md2gost.profiles import DEFAULT_LISTING_CONTINUATION
from md2gost.renderable.caption import CaptionInfo
from md2gost.renderable.listing import Listing
doc = docx.Document(os.path.join(package_dir(), "Template.docx"))
doc._body.clear_content()
listing = Listing(doc._body, "python", CaptionInfo("c1", "Код"))
listing.set_text("print(1)\n")
assert listing._continuation_mode == DEFAULT_LISTING_CONTINUATION
listing.set_continuation_mode("caption")
assert listing._continuation_mode == "caption"
try:
listing.set_continuation_mode("nope")
raise AssertionError("expected ValueError")
except ValueError:
pass
def test_parser_listing_continuation_flag():
parser = build_parser()
args = parser.parse_args(["report.md", "--listing-continuation", "legacy"])
req = request_from_args(args)
assert req.listing_continuation == "legacy"
args2 = parser.parse_args(["report.md"])
assert request_from_args(args2).listing_continuation == "word"
def test_parser_hr_pagebreak_flag():
parser = build_parser()
args = parser.parse_args(["report.md", "--no-hr-pagebreak"])
req = request_from_args(args)
assert req.hr_pagebreak is False
args2 = parser.parse_args(["report.md"])
assert request_from_args(args2).hr_pagebreak is False
assert request_from_args(args2).doc_type == "practice"
args3 = parser.parse_args(["report.md", "--hr-pagebreak"])
assert request_from_args(args3).hr_pagebreak is True
def test_parser_no_file_is_ok():
parser = build_parser()
args = parser.parse_args([])
assert args.filename is None
assert args.gui is False