-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_p15_emit_markdown.py
More file actions
148 lines (123 loc) · 5.35 KB
/
Copy pathtest_p15_emit_markdown.py
File metadata and controls
148 lines (123 loc) · 5.35 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
import yaml
from makoralle.serialization.markdown import (
_deadline_legend,
_render_sd_table,
yaml_to_markdown,
)
def test_yaml_to_markdown() -> None:
yaml_content = """
process:
id: lieferbeginn
name: Lieferbeginn
source: "GPKE Teil 2, Kapitel 2.1"
category: Zuordnungsprozesse
use_case:
goal: Zuordnung eines LF
description: Anmeldung
roles: [LF, NB]
"""
md = yaml_to_markdown(yaml_content)
assert "# Lieferbeginn" in md
assert "Zuordnung eines LF" in md
assert "LF" in md
_SD_YAML = """
process:
id: lieferbeginn
name: Lieferbeginn
source: "GPKE Teil 2"
sequence_diagram:
participants: [LF, NB]
steps:
- {nr: 1, sender: LF, receiver: NB, message: Anmeldung}
"""
def test_markdown_embeds_svg_when_has_sequence() -> None:
md = yaml_to_markdown(_SD_YAML, has_sequence=True)
# faithful SVG embedded + interactive viewer link, no Mermaid block
assert "](../../sequence/lieferbeginn.html)" in md
)
assert "```mermaid" not in md
def test_markdown_falls_back_to_mermaid_without_sequence() -> None:
md = yaml_to_markdown(_SD_YAML, has_sequence=False)
assert "```mermaid" in md
assert "../../sequence/" not in md
def test_pid_table_links_each_pid_to_ahb() -> None:
content = yaml.safe_dump(
{
"id": "demo",
"name": "Demo",
"category": "GPKE",
"sequence_diagram": {
"participants": ["LF", "NB"],
"steps": [
{
"nr": 1,
"sender": "LF",
"receiver": "NB",
"message": "Sperrauftrag",
"format": "ORDERS",
"pid_refs": [17115],
},
{
"nr": 2,
"sender": "NB",
"receiver": "LF",
"message": "Antwort",
"format": "ORDRSP",
"pid_refs": [19116, 19117],
},
{"nr": 3, "sender": "NB", "receiver": "NB", "message": "ref Sub", "pid_refs": []},
],
},
},
allow_unicode=True,
)
md = yaml_to_markdown(content, has_sequence=True)
assert "https://ahb-tabellen.hochfrequenz.de/ahb/FV2604/17115" in md
assert "[19116](https://ahb-tabellen.hochfrequenz.de/ahb/FV2604/19116)" in md
assert "[19117](https://ahb-tabellen.hochfrequenz.de/ahb/FV2604/19117)" in md
assert "Prüfidentifikator" in md # table present
def test_deadline_legend_emitted_only_when_tags_present() -> None:
sd_with = {"steps": [{"nr": 1, "deadline_rule": {"type": "parallel", "reference_step": 2}}]}
sd_without = {"steps": [{"nr": 1, "deadline_rule": {"type": "none"}}]}
assert any("∥#" in line for line in _deadline_legend(sd_with))
# pylint: disable-next=use-implicit-booleaness-not-comparison # assert the exact empty-list shape
assert _deadline_legend(sd_without) == []
def test_deadline_legend_emitted_for_complex_only() -> None:
sd = {"steps": [{"nr": 1, "deadline_rule": {"type": "complex", "raw": "x"}}]}
# complex deadlines render as a (!) [REVIEW] note on the image, so the legend applies
assert any("REVIEW" in line for line in _deadline_legend(sd))
def test_deadline_legend_explains_vocabulary() -> None:
sd = {"steps": [{"nr": 1, "deadline_rule": {"type": "unverzüglich", "business_days": 1}}]}
text = "\n".join(_deadline_legend(sd))
assert "{u}" in text
assert "WT" in text # business days
assert "ÜZ" in text or "ÜT" in text
def test_deadline_legend_emitted_for_terminiert() -> None:
sd = {"steps": [{"nr": 1, "deadline_rule": {"type": "terminiert", "anchor": "Zahlungsziel"}}]}
text = "\n".join(_deadline_legend(sd))
assert text # legend shown
assert "vor" in text and "nach" in text # explains the terminiert direction vocabulary
def test_deadline_legend_emitted_for_reference_note() -> None:
sd = {"steps": [{"nr": 1, "deadline_rule": {"type": "reference", "raw": "Gemäß Rahmenvertrag."}}]}
text = "\n".join(_deadline_legend(sd))
assert "(i)" in text # explains the info note
assert "REVIEW" not in text # a pure-reference SD needs no [REVIEW] legend line
def test_sd_table_keeps_full_complex_deadline() -> None:
long_raw = "spätestens 5 Werktage vor dem geplanten Zuordnungsbeginn der Marktlokation X"
sd = {"steps": [{"nr": 1, "sender": "NB", "receiver": "LF", "message": "Prüfung", "deadline": long_raw}]}
out = "\n".join(_render_sd_table(sd))
assert long_raw in out # not truncated with "..."
def test_sd_table_escapes_pipe_and_newline_in_deadline() -> None:
sd = {
"steps": [{"nr": 1, "sender": "NB", "receiver": "LF", "message": "X", "deadline": "5 WT | spätestens\n07:00"}]
}
row = next(l for l in _render_sd_table(sd) if l.strip().startswith("| 1 "))
assert "\\|" in row # literal pipe escaped
assert "\n" not in row # newline collapsed
# the table structure stays a single 8-column row
assert row.count(" | ") >= 1