Skip to content

Commit 07338f2

Browse files
committed
ci
1 parent d064881 commit 07338f2

File tree

5 files changed

+209
-0
lines changed

5 files changed

+209
-0
lines changed
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
name: pytest
2+
3+
on:
4+
push:
5+
branches: [ master ]
6+
# pull_request:
7+
# branches: [ master ]
8+
9+
jobs:
10+
build:
11+
runs-on: ubuntu-latest
12+
13+
steps:
14+
- name: Check out repository code
15+
uses: actions/checkout@v4
16+
17+
- name: Set up Python
18+
uses: actions/setup-python@v4
19+
with:
20+
python-version: '3.13'
21+
22+
- name: Install dependencies
23+
run: |
24+
python -m pip install --upgrade pip
25+
pip install -r requirements.txt
26+
pip install -e . # Устанавливаем пакет в режиме редактирования для корректных импортов в тестах
27+
28+
- name: Run tests with pytest
29+
run: |
30+
pytest
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
3+
<xs:element name="root">
4+
<xs:complexType>
5+
<xs:sequence>
6+
<xs:element name="person" maxOccurs="unbounded">
7+
<xs:complexType>
8+
<xs:sequence>
9+
<xs:element name="name" type="xs:string"/>
10+
<xs:element name="age" type="xs:integer"/>
11+
<xs:element name="address">
12+
<xs:complexType>
13+
<xs:sequence>
14+
<xs:element name="street" type="xs:string"/>
15+
<xs:element name="city" type="xs:string"/>
16+
<xs:element name="zip" type="xs:string"/>
17+
<xs:element name="country" type="xs:string"/>
18+
</xs:sequence>
19+
</xs:complexType>
20+
</xs:element>
21+
<xs:element name="contacts" minOccurs="0">
22+
<xs:complexType>
23+
<xs:sequence>
24+
<xs:element name="phone" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
25+
<xs:element name="email" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
26+
</xs:sequence>
27+
</xs:complexType>
28+
</xs:element>
29+
</xs:sequence>
30+
<xs:attribute name="id" type="xs:ID" use="required"/>
31+
</xs:complexType>
32+
</xs:element>
33+
</xs:sequence>
34+
</xs:complexType>
35+
</xs:element>
36+
</xs:schema>
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
3+
<xs:element name="root">
4+
<xs:complexType>
5+
<xs:sequence>
6+
<xs:element name="person">
7+
<xs:complexType>
8+
<xs:sequence>
9+
<xs:element name="name" type="xs:string"/>
10+
<xs:element name="age" type="xs:integer"/>
11+
</xs:sequence>
12+
</xs:complexType>
13+
</xs:element>
14+
</xs:sequence>
15+
</xs:complexType>
16+
</xs:element>
17+
</xs:schema>
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
3+
<xs:element name="root">
4+
<xs:complexType>
5+
<xs:sequence>
6+
<xs:element name="value">
7+
<xs:simpleType>
8+
<xs:restriction base="xs:string">
9+
<xs:enumeration value="A"/>
10+
<xs:enumeration value="B"/>
11+
<xs:enumeration value="C"/>
12+
<xs:enumeration value="D"/>
13+
<xs:enumeration value="E"/>
14+
<xs:enumeration value="F"/>
15+
<xs:enumeration value="G"/>
16+
<xs:enumeration value="H"/>
17+
<xs:enumeration value="I"/>
18+
<xs:enumeration value="J"/>
19+
<xs:enumeration value="K"/>
20+
<xs:enumeration value="L"/>
21+
<xs:enumeration value="M"/>
22+
<xs:enumeration value="N"/>
23+
<xs:enumeration value="O"/>
24+
<xs:enumeration value="P"/>
25+
<xs:enumeration value="Q"/>
26+
<xs:enumeration value="R"/>
27+
<xs:enumeration value="S"/>
28+
<xs:enumeration value="T"/>
29+
</xs:restriction>
30+
</xs:simpleType>
31+
</xs:element>
32+
</xs:sequence>
33+
</xs:complexType>
34+
</xs:element>
35+
</xs:schema>
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
import os
2+
3+
import pytest
4+
import tests
5+
from xmlgenerator.configuration import GeneratorConfig
6+
from xmlgenerator.generator import XmlGenerator
7+
from xmlgenerator.randomization import Randomizer
8+
from xmlgenerator.substitution import Substitutor
9+
from xmlschema import XMLSchema
10+
11+
os.chdir(os.path.dirname(os.path.abspath(tests.__file__)))
12+
13+
@pytest.fixture
14+
def randomizer():
15+
"""Фикстура для создания генератора случайных значений."""
16+
return Randomizer()
17+
18+
@pytest.fixture
19+
def substitutor(randomizer):
20+
"""Фикстура для создания подстановщика значений."""
21+
return Substitutor(randomizer)
22+
23+
@pytest.fixture
24+
def generator(randomizer, substitutor):
25+
"""Фикстура для создания генератора XML."""
26+
return XmlGenerator(randomizer, substitutor)
27+
28+
@pytest.fixture
29+
def config():
30+
"""Фикстура для создания конфигурации генератора."""
31+
return GeneratorConfig()
32+
33+
@pytest.mark.skip(reason="not yet implemented")
34+
class TestIntegration:
35+
"""Интеграционные тесты для проверки взаимодействия компонентов."""
36+
37+
def test_complex_schema_generation(self, generator, config):
38+
"""
39+
Проверяет генерацию XML для сложной схемы с множеством типов данных
40+
и вложенных элементов.
41+
"""
42+
xsd_schema = XMLSchema("data/complex/integration/complex_schema.xsd")
43+
generated_xml = generator.generate_xml(xsd_schema, config)
44+
45+
# Проверяем наличие всех обязательных элементов
46+
assert generated_xml.xpath("/root/person/name")
47+
assert generated_xml.xpath("/root/person/age")
48+
assert generated_xml.xpath("/root/person/address")
49+
50+
# Проверяем валидность сгенерированных значений
51+
age = int(generated_xml.xpath("/root/person/age/text()")[0])
52+
assert 0 <= age <= 120
53+
54+
# Проверяем корректность вложенных элементов
55+
address_elements = generated_xml.xpath("/root/person/address/*")
56+
assert len(address_elements) >= 1
57+
58+
def test_configuration_override(self, generator, config):
59+
"""
60+
Проверяет корректность переопределения конфигурации
61+
при генерации XML.
62+
"""
63+
# Создаем конфигурацию с переопределенными значениями
64+
custom_config = GeneratorConfig()
65+
custom_config.set_value("person.name", "John Doe")
66+
custom_config.set_value("person.age", "30")
67+
68+
xsd_schema = XMLSchema("data/complex/integration/person_schema.xsd")
69+
generated_xml = generator.generate_xml(xsd_schema, custom_config)
70+
71+
# Проверяем, что значения были переопределены
72+
assert generated_xml.xpath("/root/person/name/text()")[0] == "John Doe"
73+
assert generated_xml.xpath("/root/person/age/text()")[0] == "30"
74+
75+
def test_randomization_distribution(self, generator, config):
76+
"""
77+
Проверяет равномерность распределения случайных значений
78+
при генерации XML.
79+
"""
80+
xsd_schema = XMLSchema("data/complex/integration/random_schema.xsd")
81+
values = []
82+
83+
# Генерируем множество значений
84+
for _ in range(1000):
85+
generated_xml = generator.generate_xml(xsd_schema, config)
86+
value = generated_xml.xpath("/root/value/text()")[0]
87+
values.append(value)
88+
89+
# Проверяем распределение значений
90+
unique_values = set(values)
91+
assert len(unique_values) > 10 # Должно быть достаточно уникальных значений

0 commit comments

Comments
 (0)