Skip to content

Commit 935afc3

Browse files
authored
Bugfixes & test coverage (#3)
1 parent 030c593 commit 935afc3

File tree

15 files changed

+316
-68
lines changed

15 files changed

+316
-68
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,4 @@
66
/build/
77
/xmlgenerator.egg-info/
88
/_schemas/
9+
/dist_native/

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,7 @@ In the `value_override` sections, you can specify either a string value or speci
218218
| `output_filename` | String described by the `output_filename_template` configuration parameter |
219219
| `uuid` | Random UUIDv4 |
220220
| `regex("pattern")` | Random string value matching the specified regular expression |
221+
| `any('A', "B", C)` | Random value from enumeration |
221222
| `number(A, B)` | Random number between A and B |
222223
| `date("2010-01-01", "2025-01-01")` | Random date within the specified range |
223224
| `last_name` | Last Name |

README_RU.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,7 @@ specific:
218218
| `output_filename` | Строка, описываемая параметром конфигурации `output_filename` |
219219
| `uuid` | Случайный UUIDv4 |
220220
| `regex("pattern")` | Случайное строковое значение по указанному регулярному выражению |
221+
| `any('A', "B", C)` | Случайное значение из перечисленных |
221222
| `number(A, B)` | Случайное число от A до B |
222223
| `date("2010-01-01", "2025-01-01")` | Случайная дата в указанном диапазоне |
223224
| `last_name` | Фамилия |

pytest.ini

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,6 @@ log_cli_date_format = %Y-%m-%d %H:%M:%S
1515
markers =
1616
flaky: mark test as flaky (may fail occasionally)
1717
integration: mark test as integration test
18-
slow: mark test as slow (may take longer to run)
18+
slow: mark test as slow (may take longer to run)
19+
20+
disable_test_id_escaping_and_forfeit_all_rights_to_community_support = True

requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ shtab
77

88
# dev
99
pytest==8.3.5
10+
pytest-repeat
1011
setuptools==77.0.3
1112
nuitka
1213
twine

tests/data/complex/attributes/types_built_in/ggyearmonth.xsd renamed to tests/data/complex/attributes/types_built_in/gyearmonth.xsd

File renamed without changes.
File renamed without changes.

tests/unit/test_configuration.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1+
import logging
12
import os
23

34
import tests
45
import xmlgenerator.configuration as conf
56

67
os.chdir(os.path.dirname(os.path.abspath(tests.__file__)))
8+
conf.logger.setLevel(logging.DEBUG)
79

810

911
def test_load_config_no_file():

tests/unit/test_generator.py

Lines changed: 142 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,14 @@
33
from datetime import datetime
44

55
import pytest
6-
import tests
76
from lxml import etree
7+
from xmlschema import XMLSchema
8+
9+
import tests
810
from xmlgenerator.configuration import GeneratorConfig
911
from xmlgenerator.generator import XmlGenerator
1012
from xmlgenerator.randomization import Randomizer
1113
from xmlgenerator.substitution import Substitutor
12-
from xmlschema import XMLSchema
1314

1415
os.chdir(os.path.dirname(os.path.abspath(tests.__file__)))
1516

@@ -75,7 +76,7 @@ def test_string(self, generator, config):
7576
log_xml(generated_xml)
7677
generated_value = generated_xml.xpath("/root/text()")
7778
assert generated_value
78-
assert re.match("\\w+", generated_value[0])
79+
assert re.match(r"\w+", generated_value[0])
7980

8081
def test_boolean(self, generator, config):
8182
"""Проверяет генерацию булевых значений."""
@@ -84,43 +85,99 @@ def test_boolean(self, generator, config):
8485
log_xml(generated_xml)
8586
generated_value = generated_xml.xpath("/root/text()")
8687
assert generated_value
87-
assert re.match("true|false", generated_value[0])
88+
assert re.match(r"true|false", generated_value[0])
8889

8990
def test_decimal(self, generator, config):
9091
xsd_schema = XMLSchema(f"data/simple/types_built_in/decimal.xsd")
9192
generated_xml = generator.generate_xml(xsd_schema, config)
9293
log_xml(generated_xml)
9394
generated_value = generated_xml.xpath("/root/text()")
9495
assert generated_value
95-
assert re.match("[0-9-.]+", generated_value[0])
96+
assert re.match(r"[0-9-.]+", generated_value[0])
9697

9798
def test_float(self, generator, config):
9899
xsd_schema = XMLSchema(f"data/simple/types_built_in/float.xsd")
99100
generated_xml = generator.generate_xml(xsd_schema, config)
100101
log_xml(generated_xml)
101102
generated_value = generated_xml.xpath("/root/text()")
102103
assert generated_value
103-
assert re.match("[0-9-.]+", generated_value[0])
104+
assert re.match(r"[0-9-.]+", generated_value[0])
104105

105106
def test_double(self, generator, config):
106107
xsd_schema = XMLSchema(f"data/simple/types_built_in/double.xsd")
107108
generated_xml = generator.generate_xml(xsd_schema, config)
108109
log_xml(generated_xml)
109110
generated_value = generated_xml.xpath("/root/text()")
110111
assert generated_value
111-
assert re.match("[0-9-.]+", generated_value[0])
112+
assert re.match(r"[0-9-.]+", generated_value[0])
113+
114+
def test_datetime(self, generator, config):
115+
xsd_schema = XMLSchema(f"data/simple/types_built_in/datetime.xsd")
116+
generated_xml = generator.generate_xml(xsd_schema, config)
117+
log_xml(generated_xml)
118+
generated_value = generated_xml.xpath("/root/text()")
119+
assert generated_value
120+
assert re.match(r"[1,2][9,0]\d\d-\d\d-\d\dT\d\d:\d\d:\d\d$", generated_value[0])
121+
122+
def test_date(self, generator, config):
123+
xsd_schema = XMLSchema(f"data/simple/types_built_in/date.xsd")
124+
generated_xml = generator.generate_xml(xsd_schema, config)
125+
log_xml(generated_xml)
126+
generated_value = generated_xml.xpath("/root/text()")
127+
assert generated_value
128+
assert re.match(r"[1,2][9,0]\d\d-\d\d-\d\d$", generated_value[0])
129+
130+
def test_time(self, generator, config):
131+
xsd_schema = XMLSchema(f"data/simple/types_built_in/time.xsd")
132+
generated_xml = generator.generate_xml(xsd_schema, config)
133+
log_xml(generated_xml)
134+
generated_value = generated_xml.xpath("/root/text()")
135+
assert generated_value
136+
assert re.match(r"^\d\d:\d\d:\d\d$", generated_value[0])
137+
138+
def test_gyearmonth(self, generator, config):
139+
xsd_schema = XMLSchema(f"data/simple/types_built_in/gyearmonth.xsd")
140+
generated_xml = generator.generate_xml(xsd_schema, config)
141+
log_xml(generated_xml)
142+
generated_value = generated_xml.xpath("/root/text()")
143+
assert generated_value
144+
assert re.match(r"^\d\d\d\d-\d\d$", generated_value[0])
145+
146+
def test_gyear(self, generator, config):
147+
xsd_schema = XMLSchema(f"data/simple/types_built_in/gyear.xsd")
148+
generated_xml = generator.generate_xml(xsd_schema, config)
149+
log_xml(generated_xml)
150+
generated_value = generated_xml.xpath("/root/text()")
151+
assert generated_value
152+
assert re.match(r"^\d\d\d\d$", generated_value[0])
153+
154+
def test_gmonthday(self, generator, config):
155+
xsd_schema = XMLSchema(f"data/simple/types_built_in/gmonthday.xsd")
156+
generated_xml = generator.generate_xml(xsd_schema, config)
157+
log_xml(generated_xml)
158+
generated_value = generated_xml.xpath("/root/text()")
159+
assert generated_value
160+
assert re.match(r"^--\d\d-\d\d$", generated_value[0])
161+
162+
def test_gday(self, generator, config):
163+
xsd_schema = XMLSchema(f"data/simple/types_built_in/gday.xsd")
164+
generated_xml = generator.generate_xml(xsd_schema, config)
165+
log_xml(generated_xml)
166+
generated_value = generated_xml.xpath("/root/text()")
167+
assert generated_value
168+
assert re.match(r"^---\d\d$", generated_value[0])
169+
170+
def test_gmonth(self, generator, config):
171+
xsd_schema = XMLSchema(f"data/simple/types_built_in/gmonth.xsd")
172+
generated_xml = generator.generate_xml(xsd_schema, config)
173+
log_xml(generated_xml)
174+
generated_value = generated_xml.xpath("/root/text()")
175+
assert generated_value
176+
assert re.match(r"^--\d\d--$", generated_value[0])
112177

113178
@pytest.mark.skip(reason="not yet implemented")
114179
@pytest.mark.parametrize("xsd", [
115180
'duration.xsd',
116-
'datetime.xsd',
117-
'time.xsd',
118-
'date.xsd',
119-
'gyearmonth.xsd',
120-
'gyear.xsd',
121-
'gmonthday.xsd',
122-
'gday.xsd',
123-
'gmonth.xsd',
124181
'hexbinary.xsd',
125182
'base64binary.xsd',
126183
'anyuri.xsd',
@@ -146,51 +203,107 @@ def test_string(self, generator, config):
146203
log_xml(generated_xml)
147204
generated_value = generated_xml.xpath("/root/@attributeValue")
148205
assert generated_value
149-
assert re.match("\\w+", generated_value[0])
206+
assert re.match(r"\w+", generated_value[0])
150207

151208
def test_boolean(self, generator, config):
152209
xsd_schema = XMLSchema("data/complex/attributes/types_built_in/boolean.xsd")
153210
generated_xml = generator.generate_xml(xsd_schema, config)
154211
log_xml(generated_xml)
155212
generated_value = generated_xml.xpath("/root/@attributeValue")
156213
assert generated_value
157-
assert re.match("true|false", generated_value[0])
214+
assert re.match(r"true|false", generated_value[0])
158215

159216
def test_decimal(self, generator, config):
160217
xsd_schema = XMLSchema("data/complex/attributes/types_built_in/decimal.xsd")
161218
generated_xml = generator.generate_xml(xsd_schema, config)
162219
log_xml(generated_xml)
163220
generated_value = generated_xml.xpath("/root/@attributeValue")
164221
assert generated_value
165-
assert re.match("[0-9-.]+", generated_value[0])
222+
assert re.match(r"[0-9-.]+", generated_value[0])
166223

167224
def test_float(self, generator, config):
168225
xsd_schema = XMLSchema("data/complex/attributes/types_built_in/float.xsd")
169226
generated_xml = generator.generate_xml(xsd_schema, config)
170227
log_xml(generated_xml)
171228
generated_value = generated_xml.xpath("/root/@attributeValue")
172229
assert generated_value
173-
assert re.match("[0-9-.]+", generated_value[0])
230+
assert re.match(r"[0-9-.]+", generated_value[0])
174231

175232
def test_double(self, generator, config):
176233
xsd_schema = XMLSchema("data/complex/attributes/types_built_in/double.xsd")
177234
generated_xml = generator.generate_xml(xsd_schema, config)
178235
log_xml(generated_xml)
179236
generated_value = generated_xml.xpath("/root/@attributeValue")
180237
assert generated_value
181-
assert re.match("[0-9-.]+", generated_value[0])
238+
assert re.match(r"[0-9-.]+", generated_value[0])
239+
240+
def test_datetime(self, generator, config):
241+
xsd_schema = XMLSchema(f"data/complex/attributes/types_built_in/datetime.xsd")
242+
generated_xml = generator.generate_xml(xsd_schema, config)
243+
log_xml(generated_xml)
244+
generated_value = generated_xml.xpath("/root/@attributeValue")
245+
assert generated_value
246+
assert re.match(r"[1,2][9,0]\d\d-\d\d-\d\dT\d\d:\d\d:\d\d$", generated_value[0])
247+
248+
def test_date(self, generator, config):
249+
xsd_schema = XMLSchema(f"data/complex/attributes/types_built_in/date.xsd")
250+
generated_xml = generator.generate_xml(xsd_schema, config)
251+
log_xml(generated_xml)
252+
generated_value = generated_xml.xpath("/root/@attributeValue")
253+
assert generated_value
254+
assert re.match(r"[1,2][9,0]\d\d-\d\d-\d\d$", generated_value[0])
255+
256+
def test_time(self, generator, config):
257+
xsd_schema = XMLSchema(f"data/complex/attributes/types_built_in/time.xsd")
258+
generated_xml = generator.generate_xml(xsd_schema, config)
259+
log_xml(generated_xml)
260+
generated_value = generated_xml.xpath("/root/@attributeValue")
261+
assert generated_value
262+
assert re.match(r"^\d\d:\d\d:\d\d$", generated_value[0])
263+
264+
def test_gyearmonth(self, generator, config):
265+
xsd_schema = XMLSchema(f"data/complex/attributes/types_built_in/gyearmonth.xsd")
266+
generated_xml = generator.generate_xml(xsd_schema, config)
267+
log_xml(generated_xml)
268+
generated_value = generated_xml.xpath("/root/@attributeValue")
269+
assert generated_value
270+
assert re.match(r"^\d\d\d\d-\d\d$", generated_value[0])
271+
272+
def test_gyear(self, generator, config):
273+
xsd_schema = XMLSchema(f"data/complex/attributes/types_built_in/gyear.xsd")
274+
generated_xml = generator.generate_xml(xsd_schema, config)
275+
log_xml(generated_xml)
276+
generated_value = generated_xml.xpath("/root/@attributeValue")
277+
assert generated_value
278+
assert re.match(r"^\d\d\d\d$", generated_value[0])
279+
280+
def test_gmonthday(self, generator, config):
281+
xsd_schema = XMLSchema(f"data/complex/attributes/types_built_in/gmonthday.xsd")
282+
generated_xml = generator.generate_xml(xsd_schema, config)
283+
log_xml(generated_xml)
284+
generated_value = generated_xml.xpath("/root/@attributeValue")
285+
assert generated_value
286+
assert re.match(r"^--\d\d-\d\d$", generated_value[0])
287+
288+
def test_gday(self, generator, config):
289+
xsd_schema = XMLSchema(f"data/complex/attributes/types_built_in/gday.xsd")
290+
generated_xml = generator.generate_xml(xsd_schema, config)
291+
log_xml(generated_xml)
292+
generated_value = generated_xml.xpath("/root/@attributeValue")
293+
assert generated_value
294+
assert re.match(r"^---\d\d$", generated_value[0])
295+
296+
def test_gmonth(self, generator, config):
297+
xsd_schema = XMLSchema(f"data/complex/attributes/types_built_in/gmonth.xsd")
298+
generated_xml = generator.generate_xml(xsd_schema, config)
299+
log_xml(generated_xml)
300+
generated_value = generated_xml.xpath("/root/@attributeValue")
301+
assert generated_value
302+
assert re.match(r"^--\d\d--$", generated_value[0])
182303

183304
@pytest.mark.skip(reason="not yet implemented")
184305
@pytest.mark.parametrize("xsd", [
185306
'duration.xsd',
186-
'datetime.xsd',
187-
'time.xsd',
188-
'date.xsd',
189-
'gyearmonth.xsd',
190-
'gyear.xsd',
191-
'gmonthday.xsd',
192-
'gday.xsd',
193-
'gmonth.xsd',
194307
'hexbinary.xsd',
195308
'base64binary.xsd',
196309
'anyuri.xsd',
@@ -630,7 +743,7 @@ def test_group_1_unbounded__element_1_1__0_1(self, generator, config):
630743

631744
assert min(counts_by_occurs_item_opt) == 0
632745
assert max(counts_by_occurs_item_opt) <= 10
633-
assert len(counts_by_occurs_item_opt) < 10
746+
assert len(counts_by_occurs_item_opt) <= 10
634747

635748
def test_group_1_1__element_0_0__0_1(self, generator, config):
636749
xsd_schema = XMLSchema("data/complex/sequence/scenario_07_forbidden_element.xsd")

tests/unit/test_randomization.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import logging
2+
3+
import pytest
4+
5+
from xmlgenerator import randomization
6+
from xmlgenerator.randomization import Randomizer
7+
8+
randomization.logger.setLevel(logging.DEBUG)
9+
10+
11+
@pytest.mark.repeat(10)
12+
def test_random_no_seed():
13+
randomizer1 = Randomizer()
14+
randomizer2 = Randomizer()
15+
for _ in range(10):
16+
assert randomizer1.rnd.randint(0, 1000) != randomizer2.rnd.randint(0, 1000)
17+
18+
19+
@pytest.mark.repeat(10)
20+
def test_fake_no_seed():
21+
randomizer1 = Randomizer()
22+
randomizer2 = Randomizer()
23+
for _ in range(10):
24+
assert randomizer1.fake.name() != randomizer2.fake.name()
25+
26+
27+
@pytest.mark.repeat(10)
28+
def test_random_has_seed():
29+
randomizer1 = Randomizer(seed=123)
30+
randomizer2 = Randomizer(seed=123)
31+
for _ in range(10):
32+
assert randomizer1.rnd.randint(0, 1000) == randomizer2.rnd.randint(0, 1000)
33+
34+
35+
@pytest.mark.repeat(10)
36+
def test_fake_has_seed():
37+
randomizer1 = Randomizer(seed=123)
38+
randomizer2 = Randomizer(seed=123)
39+
for _ in range(10):
40+
assert randomizer1.fake.name() == randomizer2.fake.name()

0 commit comments

Comments
 (0)