File: test_flatten_attribute_groups.py

package info (click to toggle)
python-xsdata 24.1-2
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 2,936 kB
  • sloc: python: 29,257; xml: 404; makefile: 27; sh: 6
file content (97 lines) | stat: -rw-r--r-- 3,775 bytes parent folder | download
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
from unittest import mock

from xsdata.codegen.container import ClassContainer
from xsdata.codegen.handlers import FlattenAttributeGroups
from xsdata.codegen.models import Attr, Status
from xsdata.codegen.utils import ClassUtils
from xsdata.exceptions import AnalyzerValueError
from xsdata.models.config import GeneratorConfig
from xsdata.models.enums import Tag
from xsdata.utils.testing import AttrFactory, ClassFactory, FactoryTestCase


class FlattenAttributeGroupsTests(FactoryTestCase):
    def setUp(self):
        super().setUp()

        container = ClassContainer(config=GeneratorConfig())
        self.processor = FlattenAttributeGroups(container=container)

    @mock.patch.object(Attr, "is_group", new_callable=mock.PropertyMock)
    @mock.patch.object(FlattenAttributeGroups, "process_attribute")
    def test_process(self, mock_process_attribute, mock_is_group):
        mock_is_group.side_effect = [
            True,
            False,
            True,
            True,
            False,
            False,
        ]
        target = ClassFactory.elements(2)

        self.processor.process(target)
        self.assertEqual(6, mock_is_group.call_count)

        mock_process_attribute.assert_has_calls(
            [
                mock.call(target, target.attrs[0]),
                mock.call(target, target.attrs[0]),
                mock.call(target, target.attrs[1]),
            ]
        )

    @mock.patch.object(ClassUtils, "copy_group_attributes")
    def test_process_attribute_with_group(self, mock_copy_group_attributes):
        complex_bar = ClassFactory.create(qname="bar", tag=Tag.COMPLEX_TYPE)
        group_bar = ClassFactory.create(qname="bar", tag=Tag.ATTRIBUTE_GROUP)
        group_attr = AttrFactory.attribute_group(name="bar")
        target = ClassFactory.create()
        target.attrs.append(group_attr)

        self.processor.container.add(complex_bar)
        self.processor.container.add(group_bar)
        self.processor.container.add(target)

        self.processor.process_attribute(target, group_attr)
        mock_copy_group_attributes.assert_called_once_with(
            group_bar, target, group_attr
        )

    @mock.patch.object(ClassUtils, "copy_group_attributes")
    def test_process_attribute_with_attribute_group(self, mock_copy_group_attributes):
        complex_bar = ClassFactory.create(qname="bar", tag=Tag.COMPLEX_TYPE)
        group_bar = ClassFactory.create(qname="bar", tag=Tag.ATTRIBUTE_GROUP)
        group_attr = AttrFactory.attribute_group(name="bar")
        target = ClassFactory.create()
        target.attrs.append(group_attr)

        self.processor.container.add(complex_bar)
        self.processor.container.add(group_bar)
        self.processor.container.add(target)

        self.processor.process_attribute(target, group_attr)
        mock_copy_group_attributes.assert_called_once_with(
            group_bar, target, group_attr
        )

    def test_process_attribute_with_circular_reference(self):
        group_attr = AttrFactory.attribute_group(name="bar")
        target = ClassFactory.create(qname="bar", tag=Tag.ATTRIBUTE_GROUP)
        target.attrs.append(group_attr)

        target.status = Status.FLATTENING
        self.processor.container.add(target)

        self.processor.process_attribute(target, group_attr)
        self.assertFalse(group_attr in target.attrs)

    def test_process_attribute_with_unknown_source(self):
        group_attr = AttrFactory.attribute_group(name="bar")
        target = ClassFactory.create()
        target.attrs.append(group_attr)

        with self.assertRaises(AnalyzerValueError) as cm:
            self.processor.process_attribute(target, group_attr)

        self.assertEqual("Group attribute not found: `bar`", str(cm.exception))