Skip to content

Commit 51b9fc6

Browse files
committed
new test case when [content] is missing from macro body
1 parent 3280ec7 commit 51b9fc6

File tree

8 files changed

+163
-65
lines changed

8 files changed

+163
-65
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@ lib/output/*
44
!lib/output/.gitkeep
55
.coverage
66
.DS_Store
7+
acm

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,10 @@ The Cloud App equivalent will look like this:
6666
git clone https://github.com/codeclou/advanced-codeblocks-cloud-migration-helper.git
6767
cd advanced-codeblocks-cloud-migration-helper
6868
python3 -m pip install -r requirements.txt
69+
# or
70+
python3 -m venv ./acm
71+
source ./acm/bin/activate
72+
python3 -m pip install -r requirements.txt
6973
```
7074

7175
 

lib/input/ac-multi-test2.input.storage

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22
<p>test123</p><ac:structured-macro ac:name="advanced-codeblock-macro" ac:schema-version="1" ac:macro-id="544fd4da-43cf-4d4b-b675-34ee3cb50000"><ac:parameter ac:name="enableddl">true</ac:parameter><ac:parameter ac:name="theme">light-spring</ac:parameter><ac:parameter ac:name="lang">Apache</ac:parameter><ac:parameter ac:name="expandFirst">true</ac:parameter><ac:parameter ac:name="globaltitle">multi title</ac:parameter><ac:plain-text-body><![CDATA[[test a]
33
foo = bar
44

5-
[content]
5+
[MISSINGCONTENT]
66
<VirtualHost>
77
serverName = ${foo}
88
</VirtualHost> ]]></ac:plain-text-body></ac:structured-macro>
99
<p><br /></p>
1010
<p><br /></p>
11-
<p><br /></p>
11+
<p><br /></p>

lib/macro_storage_format_parser.py

Lines changed: 92 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,11 @@
33
from lib.macro_storage_format_builder import MacroStorageFormatBuilder
44
from lib.util import Util
55

6+
67
class MacroStorageFormatParser:
7-
def __init__(self, inputfile: str, outputfile: str, extensionkey: str, forceUUIDsZeroed: bool):
8+
def __init__(
9+
self, inputfile: str, outputfile: str, extensionkey: str, forceUUIDsZeroed: bool
10+
):
811
self.inputfile = inputfile
912
self.outputfile = outputfile
1013
self.extensionkey = extensionkey
@@ -16,19 +19,21 @@ def transform(self):
1619
print("START > reading storage format file from: " + self.inputfile)
1720
print(" ")
1821
with open(self.inputfile) as file:
19-
xml_string = file.read()
22+
xml_string = file.read()
2023
soup = self.util.get_xml_parser(xml_string)
2124
all_macros = soup.find_all("ac:structured-macro", recursive=True)
2225
page_has_ac_macro = False
2326
for macro_node in all_macros:
2427
#
2528
# STEP 1: Parse DC Advanced Codeblock Macros
2629
#
27-
if (macro_node.attrs['ac:name'] == 'advanced-single-codeblock-macro' or
28-
macro_node.attrs['ac:name'] == 'advanced-codeblock-macro' or
29-
macro_node.attrs['ac:name'] == 'advanced-remote-codeblock-macro'):
30+
if (
31+
macro_node.attrs["ac:name"] == "advanced-single-codeblock-macro"
32+
or macro_node.attrs["ac:name"] == "advanced-codeblock-macro"
33+
or macro_node.attrs["ac:name"] == "advanced-remote-codeblock-macro"
34+
):
3035
page_has_ac_macro = True
31-
macro_name = macro_node.attrs['ac:name']
36+
macro_name = macro_node.attrs["ac:name"]
3237
print(">> " + macro_name)
3338
# ----
3439
# all macros:
@@ -47,7 +52,7 @@ def transform(self):
4752
macro_param_enableddl = "false"
4853
#
4954
# multi and remote only:
50-
# <ac:parameter ac:name="expandFirst">true</ac:parameter>
55+
# <ac:parameter ac:name="expandFirst">true</ac:parameter>
5156
macro_param_expand_first = "false"
5257
#
5358
# remote only:
@@ -60,55 +65,103 @@ def transform(self):
6065
# ----
6166
macro_children = macro_node.findChildren()
6267
for child in macro_children:
63-
if (child.name == "ac:plain-text-body"):
64-
if (macro_name == 'advanced-single-codeblock-macro'):
68+
if child.name == "ac:plain-text-body":
69+
if macro_name == "advanced-single-codeblock-macro":
6570
macro_code = child.text
6671
macro_config = ""
67-
elif (macro_name == 'advanced-codeblock-macro'):
68-
config_and_code = child.text.split("[content]\n", 1)
69-
macro_code = config_and_code[1]
70-
macro_config = config_and_code[0]
71-
elif (macro_name == 'advanced-remote-codeblock-macro'):
72+
elif macro_name == "advanced-codeblock-macro":
73+
if "[content]\n" not in child.text:
74+
print(
75+
">> ERROR: no [content] element in macro body found!"
76+
)
77+
macro_code = "ERROR - COULD NOT PARSE"
78+
macro_config = "ERROR - COULD NOT PARSE"
79+
else:
80+
config_and_code = child.text.split("[content]\n", 1)
81+
macro_code = config_and_code[1]
82+
macro_config = config_and_code[0]
83+
elif macro_name == "advanced-remote-codeblock-macro":
7284
macro_code = ""
7385
macro_config = child.text
74-
print (" macro config (shortened): " + self.util.shorten_string_for_print(macro_config))
75-
print (" macro code (shortened) : " + self.util.shorten_string_for_print(macro_code))
76-
if (child.name == "ac:parameter"):
77-
ac_name = child.get('ac:name')
78-
if (ac_name == "lang"):
79-
macro_param_lang = self.util.replace_server_macro_lang_with_cloud_pendant(child.text)
80-
print (" macro param lang : " + macro_param_lang)
81-
if (ac_name == "enableddl"):
86+
print(
87+
" macro config (shortened): "
88+
+ self.util.shorten_string_for_print(macro_config)
89+
)
90+
print(
91+
" macro code (shortened) : "
92+
+ self.util.shorten_string_for_print(macro_code)
93+
)
94+
if child.name == "ac:parameter":
95+
ac_name = child.get("ac:name")
96+
if ac_name == "lang":
97+
macro_param_lang = (
98+
self.util.replace_server_macro_lang_with_cloud_pendant(
99+
child.text
100+
)
101+
)
102+
print(" macro param lang : " + macro_param_lang)
103+
if ac_name == "enableddl":
82104
macro_param_enableddl = child.text
83-
print (" macro param enableddl : " + macro_param_enableddl)
84-
if (ac_name == "globaltitle"):
105+
print(
106+
" macro param enableddl : " + macro_param_enableddl
107+
)
108+
if ac_name == "globaltitle":
85109
macro_param_globaltitle = child.text
86-
print (" macro param globaltitle : " + macro_param_globaltitle)
87-
if (ac_name == "theme"):
110+
print(
111+
" macro param globaltitle : "
112+
+ macro_param_globaltitle
113+
)
114+
if ac_name == "theme":
88115
macro_param_theme = child.text
89-
print (" macro param theme : " + macro_param_theme)
90-
if (ac_name == "expandFirst"):
116+
print(" macro param theme : " + macro_param_theme)
117+
if ac_name == "expandFirst":
91118
macro_param_expand_first = child.text
92-
print (" macro param expand first: " + macro_param_expand_first)
93-
if (ac_name == "remotefileurl"):
119+
print(
120+
" macro param expand first: "
121+
+ macro_param_expand_first
122+
)
123+
if ac_name == "remotefileurl":
94124
macro_param_remotefileurl = child.text
95-
print (" macro param remote url : " + macro_param_remotefileurl)
96-
if (ac_name == "remotefilehttpuser"):
125+
print(
126+
" macro param remote url : "
127+
+ macro_param_remotefileurl
128+
)
129+
if ac_name == "remotefilehttpuser":
97130
macro_param_remotefilehttpuser = child.text
98-
print (" macro param remote user : " + macro_param_remotefilehttpuser)
99-
if (ac_name == "remotefilehttppassword"):
131+
print(
132+
" macro param remote user : "
133+
+ macro_param_remotefilehttpuser
134+
)
135+
if ac_name == "remotefilehttppassword":
100136
macro_param_remotefilehttppassword = child.text
101-
print (" macro param remote pass : " + macro_param_remotefilehttppassword)
137+
print(
138+
" macro param remote pass : "
139+
+ macro_param_remotefilehttppassword
140+
)
102141
#
103142
# STEP 2: Generate Cloud Advanced Codeblock Macro storage formats
104143
#
105144
cloud_adf_attribute_local_id = self.util.generate_uuid()
106145
cloud_adf_parameter_local_id = self.util.generate_uuid()
107-
print (" macro attr local id : " + cloud_adf_attribute_local_id)
108-
print (" macro param local id : " + cloud_adf_parameter_local_id)
109-
cloud_macro_storage_format = builder.generate_ac_cloud_macro(macro_name, cloud_adf_attribute_local_id, cloud_adf_parameter_local_id, macro_config, macro_code, macro_param_lang, macro_param_enableddl, macro_param_globaltitle, macro_param_theme, macro_param_expand_first, macro_param_remotefileurl, macro_param_remotefilehttppassword, macro_param_remotefilehttpuser)
146+
print(" macro attr local id : " + cloud_adf_attribute_local_id)
147+
print(" macro param local id : " + cloud_adf_parameter_local_id)
148+
cloud_macro_storage_format = builder.generate_ac_cloud_macro(
149+
macro_name,
150+
cloud_adf_attribute_local_id,
151+
cloud_adf_parameter_local_id,
152+
macro_config,
153+
macro_code,
154+
macro_param_lang,
155+
macro_param_enableddl,
156+
macro_param_globaltitle,
157+
macro_param_theme,
158+
macro_param_expand_first,
159+
macro_param_remotefileurl,
160+
macro_param_remotefilehttppassword,
161+
macro_param_remotefilehttpuser,
162+
)
110163
macro_node.replaceWith(cloud_macro_storage_format)
111-
if (not page_has_ac_macro):
164+
if not page_has_ac_macro:
112165
print(">> no Advanced Codeblocks macros found in page")
113166
#
114167
# STEP 3: Write outputfile
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<p>test123</p>
2+
<ac:adf-extension>
3+
<ac:adf-node type="extension">
4+
<ac:adf-attribute key="extension-type">com.atlassian.ecosystem</ac:adf-attribute>
5+
<ac:adf-attribute key="extension-key">9a81c16f-31e6-4be7-be6e-dfc872fe4155/35d2082a-431b-46b7-90da-75a526882f2f/static/advancedcodeblockmacro</ac:adf-attribute>
6+
<ac:adf-attribute key="parameters"><ac:adf-parameter key="local-id">00000000-0000-0000-0000-000000000000</ac:adf-parameter><ac:adf-parameter key="extension-id">ari:cloud:ecosystem::extension/9a81c16f-31e6-4be7-be6e-dfc872fe4155/35d2082a-431b-46b7-90da-75a526882f2f/static/advancedcodeblockmacro</ac:adf-parameter><ac:adf-parameter key="extension-title">Advanced Codeblocks Multi</ac:adf-parameter><ac:adf-parameter key="guest-params"><ac:adf-parameter key="globaltitle">multi title</ac:adf-parameter><ac:adf-parameter key="code"><![CDATA[ERROR - COULD NOT PARSE]]></ac:adf-parameter><ac:adf-parameter key="config"><![CDATA[ERROR - COULD NOT PARSE]]></ac:adf-parameter><ac:adf-parameter key="enableddl"><ac:adf-parameter-value>true</ac:adf-parameter-value></ac:adf-parameter><ac:adf-parameter key="expandfirst"><ac:adf-parameter-value>true</ac:adf-parameter-value></ac:adf-parameter><ac:adf-parameter key="theme">light-spring</ac:adf-parameter><ac:adf-parameter key="lang">apache</ac:adf-parameter></ac:adf-parameter></ac:adf-attribute>
7+
<ac:adf-attribute key="text">Advanced Codeblocks Multi</ac:adf-attribute>
8+
<ac:adf-attribute key="layout">default</ac:adf-attribute>
9+
<ac:adf-attribute key="local-id">00000000-0000-0000-0000-000000000000</ac:adf-attribute>
10+
</ac:adf-node>
11+
<ac:adf-fallback>
12+
<ac:adf-node type="extension">
13+
<ac:adf-attribute key="extension-type">com.atlassian.ecosystem</ac:adf-attribute>
14+
<ac:adf-attribute key="extension-key">9a81c16f-31e6-4be7-be6e-dfc872fe4155/35d2082a-431b-46b7-90da-75a526882f2f/static/advancedcodeblockmacro</ac:adf-attribute>
15+
<ac:adf-attribute key="parameters"><ac:adf-parameter key="local-id">00000000-0000-0000-0000-000000000000</ac:adf-parameter><ac:adf-parameter key="extension-id">ari:cloud:ecosystem::extension/9a81c16f-31e6-4be7-be6e-dfc872fe4155/35d2082a-431b-46b7-90da-75a526882f2f/static/advancedcodeblockmacro</ac:adf-parameter><ac:adf-parameter key="extension-title">Advanced Codeblocks Multi</ac:adf-parameter><ac:adf-parameter key="guest-params"><ac:adf-parameter key="globaltitle">multi title</ac:adf-parameter><ac:adf-parameter key="code"><![CDATA[ERROR - COULD NOT PARSE]]></ac:adf-parameter><ac:adf-parameter key="config"><![CDATA[ERROR - COULD NOT PARSE]]></ac:adf-parameter><ac:adf-parameter key="enableddl"><ac:adf-parameter-value>true</ac:adf-parameter-value></ac:adf-parameter><ac:adf-parameter key="expandfirst"><ac:adf-parameter-value>true</ac:adf-parameter-value></ac:adf-parameter><ac:adf-parameter key="theme">light-spring</ac:adf-parameter><ac:adf-parameter key="lang">apache</ac:adf-parameter></ac:adf-parameter></ac:adf-attribute>
16+
<ac:adf-attribute key="text">Advanced Codeblocks Multi</ac:adf-attribute>
17+
<ac:adf-attribute key="layout">default</ac:adf-attribute>
18+
<ac:adf-attribute key="local-id">00000000-0000-0000-0000-000000000000</ac:adf-attribute>
19+
</ac:adf-node>
20+
</ac:adf-fallback>
21+
</ac:adf-extension>
22+
<p><br/></p>
23+
<p><br/></p>
24+
<p><br/></p>

lib/test_macro_storage_format_parser.py

Lines changed: 36 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,52 +2,68 @@
22

33
# https://docs.python.org/3/library/unittest.html
44

5-
import unittest
5+
import unittest
6+
67
from lib.macro_storage_format_parser import MacroStorageFormatParser
78

8-
class TestMacroStorageFormatParser(unittest.TestCase):
99

10+
class TestMacroStorageFormatParser(unittest.TestCase):
1011
def test_transform___valid_multi(self):
11-
self.maxDiff=None
12+
self.maxDiff = None
1213
# GIVEN
1314
input_file = "./lib/input/ac-multi-test1.input.storage"
1415
output_file = "./lib/output/ac-multi-test1.output.storage"
1516
expected_output_file = "./lib/output-expected/ac-multi-test1.output.storage"
16-
extension_key = "9a81c16f-31e6-4be7-be6e-dfc872fe4155/35d2082a-431b-46b7-90da-75a526882f2f"
17+
extension_key = (
18+
"9a81c16f-31e6-4be7-be6e-dfc872fe4155/35d2082a-431b-46b7-90da-75a526882f2f"
19+
)
20+
# WHEN
21+
parser = MacroStorageFormatParser(input_file, output_file, extension_key, True)
22+
parser.transform()
23+
# THEN
24+
self.assertListEqual(list(open(output_file)), list(open(expected_output_file)))
25+
26+
def test_transform___invalid_multi(self):
27+
self.maxDiff = None
28+
# GIVEN
29+
input_file = "./lib/input/ac-multi-test2.input.storage"
30+
output_file = "./lib/output/ac-multi-test2.output.storage"
31+
expected_output_file = "./lib/output-expected/ac-multi-test2.output.storage"
32+
extension_key = (
33+
"9a81c16f-31e6-4be7-be6e-dfc872fe4155/35d2082a-431b-46b7-90da-75a526882f2f"
34+
)
1735
# WHEN
1836
parser = MacroStorageFormatParser(input_file, output_file, extension_key, True)
19-
parser.transform();
37+
parser.transform()
2038
# THEN
21-
self.assertListEqual(
22-
list(open(output_file)),
23-
list(open(expected_output_file)))
39+
self.assertListEqual(list(open(output_file)), list(open(expected_output_file)))
2440

2541
def test_transform___valid_single(self):
26-
self.maxDiff=None
42+
self.maxDiff = None
2743
# GIVEN
2844
input_file = "./lib/input/ac-single-test1.input.storage"
2945
output_file = "./lib/output/ac-single-test1.output.storage"
3046
expected_output_file = "./lib/output-expected/ac-single-test1.output.storage"
31-
extension_key = "9a81c16f-31e6-4be7-be6e-dfc872fe4155/35d2082a-431b-46b7-90da-75a526882f2f"
47+
extension_key = (
48+
"9a81c16f-31e6-4be7-be6e-dfc872fe4155/35d2082a-431b-46b7-90da-75a526882f2f"
49+
)
3250
# WHEN
3351
parser = MacroStorageFormatParser(input_file, output_file, extension_key, True)
34-
parser.transform();
52+
parser.transform()
3553
# THEN
36-
self.assertListEqual(
37-
list(open(output_file)),
38-
list(open(expected_output_file)))
54+
self.assertListEqual(list(open(output_file)), list(open(expected_output_file)))
3955

4056
def test_transform___valid_remote(self):
41-
self.maxDiff=None
57+
self.maxDiff = None
4258
# GIVEN
4359
input_file = "./lib/input/ac-remote-test1.input.storage"
4460
output_file = "./lib/output/ac-remote-test1.output.storage"
4561
expected_output_file = "./lib/output-expected/ac-remote-test1.output.storage"
46-
extension_key = "9a81c16f-31e6-4be7-be6e-dfc872fe4155/35d2082a-431b-46b7-90da-75a526882f2f"
62+
extension_key = (
63+
"9a81c16f-31e6-4be7-be6e-dfc872fe4155/35d2082a-431b-46b7-90da-75a526882f2f"
64+
)
4765
# WHEN
4866
parser = MacroStorageFormatParser(input_file, output_file, extension_key, True)
49-
parser.transform();
67+
parser.transform()
5068
# THEN
51-
self.assertListEqual(
52-
list(open(output_file)),
53-
list(open(expected_output_file)))
69+
self.assertListEqual(list(open(output_file)), list(open(expected_output_file)))

pyproject.toml

Whitespace-only changes.

requirements.txt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
uuid7==0.1.0
2-
beautifulsoup4==4.12.2
3-
pytest==7.4.3
4-
pytest_cov==4.1.0
5-
lxml==4.9.4
2+
beautifulsoup4==4.14.3
3+
pytest==9.0.2
4+
pytest_cov==7.0.0
5+
lxml==6.0.2

0 commit comments

Comments
 (0)