Skip to content

Commit fe9d562

Browse files
committed
[test/parser_json] Add yaml analog tests
1 parent 322df86 commit fe9d562

File tree

1 file changed

+190
-1
lines changed

1 file changed

+190
-1
lines changed

test/test_parser_json.py

Lines changed: 190 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
1+
"""
2+
This module supplies basic tests for the odml.dict_parser.DictReader
3+
reading from json files.
4+
"""
5+
16
import json
27
import os
8+
import tempfile
39
import unittest
410

511
from odml.tools import dict_parser
@@ -12,7 +18,26 @@ def setUp(self):
1218
dir_path = os.path.dirname(os.path.realpath(__file__))
1319
self.basepath = os.path.join(dir_path, "resources")
1420

15-
self.json_reader = dict_parser.DictReader()
21+
self.json_reader = dict_parser.DictReader(show_warnings=False)
22+
23+
dir_name = os.path.basename(os.path.splitext(__file__)[0])
24+
tmp_dir_path = os.path.join(tempfile.gettempdir(), "odml_test", dir_name)
25+
26+
if not os.path.exists(tmp_dir_path):
27+
os.mkdir(tmp_dir_path)
28+
29+
self.tmp_dir_path = tmp_dir_path
30+
31+
def _prepare_doc(self, file_name, file_content):
32+
file_path = os.path.join(self.tmp_dir_path, file_name)
33+
34+
with open(file_path, "w") as dump_file:
35+
dump_file.write(file_content)
36+
37+
with open(file_path) as raw_data:
38+
parsed_doc = json.load(raw_data)
39+
40+
return parsed_doc
1641

1742
def test_missing_root(self):
1843
filename = "missing_root.json"
@@ -46,3 +71,167 @@ def test_invalid_version(self):
4671

4772
with self.assertRaises(InvalidVersionException):
4873
_ = self.json_reader.to_odml(parsed_doc)
74+
75+
def test_invalid_attribute_handling(self):
76+
filename = "invalid_attributes.yaml"
77+
78+
inv_doc_attr = "invalid_doc_attr"
79+
inv_sec_attr = "invalid_sec_attr"
80+
inv_prop_attr = "invalid_prop_attr"
81+
82+
file_content = """{
83+
"Document": {
84+
"id": "6af2a3ec-9f3a-42d6-a59d-95f3ccbaa383",
85+
"%s": "i_do_not_exist_on_doc_level",
86+
"sections": [
87+
{
88+
"id": "51f3c79c-a7d7-471e-be16-e085caa851fb",
89+
"%s": "i_do_not_exist_on_sec_level",
90+
"type": "test",
91+
"name": "sec",
92+
"sections": [],
93+
"properties": [
94+
{
95+
"id": "c5aed35a-d9ff-437d-82d6-68f0cda8ea94",
96+
"%s": "i_do_not_exist_on_prop_level",
97+
"name": "prop",
98+
"value": [
99+
1,
100+
2,
101+
3
102+
],
103+
"type": "int"
104+
}
105+
]
106+
}
107+
]
108+
},
109+
"odml-version": "1.1"
110+
}
111+
""" % (inv_doc_attr, inv_sec_attr, inv_prop_attr)
112+
parsed_doc = self._prepare_doc(filename, file_content)
113+
114+
# Test ParserException on default parse
115+
exc_msg = "Invalid element"
116+
with self.assertRaises(ParserException) as exc:
117+
_ = self.json_reader.to_odml(parsed_doc)
118+
self.assertIn(exc_msg, str(exc.exception))
119+
120+
# Test success on ignore_error parse
121+
self.json_reader.ignore_errors = True
122+
doc = self.json_reader.to_odml(parsed_doc)
123+
124+
self.assertEqual(len(doc.sections), 1)
125+
self.assertEqual(len(doc.sections["sec"].properties), 1)
126+
127+
self.assertEqual(len(self.json_reader.warnings), 3)
128+
for msg in self.json_reader.warnings:
129+
self.assertIn("Error", msg)
130+
self.assertTrue(inv_doc_attr in msg or inv_sec_attr in msg or inv_prop_attr in msg)
131+
132+
def test_sec_creation_error(self):
133+
filename = "broken_section.yaml"
134+
135+
valid = "valid_sec"
136+
invalid = "invalid_sec"
137+
138+
file_content = """{
139+
"Document": {
140+
"id": "6af2a3ec-9f3a-42d6-a59d-95f3ccbaa383",
141+
"sections": [
142+
{
143+
"id": "1113c79c-a7d7-471e-be16-e085caa851fb",
144+
"name": "sec",
145+
"type": "test",
146+
"sections": [
147+
{
148+
"id": "1213c79c-a7d7-471e-be16-e085caa851fb",
149+
"name": "%s",
150+
"type": "test"
151+
},
152+
{
153+
"id": [
154+
"I-am-so-kaputt"
155+
],
156+
"name": "%s",
157+
"type": "test"
158+
}
159+
]
160+
}
161+
]
162+
},
163+
"odml-version": "1.1"
164+
}
165+
""" % (valid, invalid)
166+
parsed_doc = self._prepare_doc(filename, file_content)
167+
168+
# Test ParserException on default parse
169+
exc_msg = "Section not created"
170+
with self.assertRaises(ParserException) as exc:
171+
_ = self.json_reader.to_odml(parsed_doc)
172+
self.assertIn(exc_msg, str(exc.exception))
173+
174+
# Test success on ignore_error parse
175+
self.json_reader.ignore_errors = True
176+
doc = self.json_reader.to_odml(parsed_doc)
177+
178+
self.assertEqual(len(doc.sections["sec"].sections), 1)
179+
self.assertIn(valid, doc.sections["sec"].sections)
180+
self.assertNotIn(invalid, doc.sections["sec"].sections)
181+
182+
self.assertEqual(len(self.json_reader.warnings), 1)
183+
for msg in self.json_reader.warnings:
184+
self.assertIn("Error", msg)
185+
self.assertIn(exc_msg, msg)
186+
187+
def test_prop_creation_error(self):
188+
filename = "broken_property.yaml"
189+
file_content = """{
190+
"Document": {
191+
"id": "6af2a3ec-9f3a-42d6-a59d-95f3ccbaa383",
192+
"sections": [
193+
{
194+
"id": "51f3c79c-a7d7-471e-be16-e085caa851fb",
195+
"type": "test",
196+
"name": "sec",
197+
"properties": [
198+
{
199+
"id": "121ed35a-d9ff-437d-82d6-68f0cda8ea94",
200+
"name": "valid_prop"
201+
},
202+
{
203+
"id": "122ed35a-d9ff-437d-82d6-68f0cda8ea94",
204+
"name": "invalid_prop",
205+
"value": [
206+
"a",
207+
"b"
208+
],
209+
"type": "int"
210+
}
211+
]
212+
}
213+
]
214+
},
215+
"odml-version": "1.1"
216+
}
217+
"""
218+
parsed_doc = self._prepare_doc(filename, file_content)
219+
220+
# Test ParserException on default parse
221+
exc_msg = "Property not created"
222+
with self.assertRaises(ParserException) as exc:
223+
_ = self.json_reader.to_odml(parsed_doc)
224+
self.assertIn(exc_msg, str(exc.exception))
225+
226+
# Test success on ignore_error parse
227+
self.json_reader.ignore_errors = True
228+
doc = self.json_reader.to_odml(parsed_doc)
229+
230+
self.assertEqual(len(doc.sections["sec"].properties), 1)
231+
self.assertIn("valid_prop", doc.sections["sec"].properties)
232+
self.assertNotIn("invalid_prop", doc.sections["sec"].properties)
233+
234+
self.assertEqual(len(self.json_reader.warnings), 1)
235+
for msg in self.json_reader.warnings:
236+
self.assertIn("Error", msg)
237+
self.assertIn(exc_msg, msg)

0 commit comments

Comments
 (0)