TestDiscoverClasses.test_discover_private_attributes()   A
last analyzed

Complexity

Conditions 1

Size

Total Lines 11
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 6
nop 1
dl 0
loc 11
rs 10
c 0
b 0
f 0
1
from pathlib import Path
2
from unittest import TestCase
3
4
from barentsz._discover import (
5
    discover_attributes,
6
    _match_attribute,
7
    _find_attribute_docstring,
8
)
9
from test_resources.examples_for_tests import module1
10
11
12
class TestDiscoverClasses(TestCase):
13
14
    def test_match_attribute(self):
15
        # EXECUTE
16
        match1 = _match_attribute('  some_attr   =     2  ')
17
        match2 = _match_attribute('  some_attr  :  int  =   2  ')
18
        match3 = _match_attribute(
19
            '  some_attr  :  int  =   2  #   bla bla bla!   ')
20
        match4 = _match_attribute(
21
            '  some_attr    int  =   2  #   bla bla bla!   ')
22
        match5 = _match_attribute(
23
            '  some attr     =   2  #   bla bla bla!   ')
24
        match6 = _match_attribute(
25
            'some attr == 2')
26
27
        # VERIFY
28
        self.assertTupleEqual(('some_attr', None, '2', None), match1)
29
        self.assertTupleEqual(('some_attr', 'int', '2', None), match2)
30
        self.assertTupleEqual(('some_attr', 'int', '2', 'bla bla bla!'), match3)
31
        self.assertEqual(None, match4)
32
        self.assertEqual(None, match5)
33
        self.assertEqual(None, match6)
34
35
    def test_discover_attributes_in_path(self):
36
        # SETUP
37
        path_to_resources = (Path(__file__).parent.parent / 'test_resources'
38
                             / 'examples_for_tests')
39
40
        # EXECUTE
41
        attributes = discover_attributes(path_to_resources)
42
        attribute_names = [attribute.name for attribute in attributes]
43
44
        # VERIFY
45
        self.assertEqual(2, len(attributes))
46
        self.assertListEqual(['ATTR1', 'ATTR1'], attribute_names)
47
48
    def test_discover_attributes_in_module(self):
49
        # EXECUTE
50
        attributes = discover_attributes(module1)
51
52
        # VERIFY
53
        self.assertEqual(1, len(attributes))
54
        self.assertEqual('ATTR1', attributes[0].name)
55
        self.assertEqual(int, attributes[0].type_)
56
        self.assertEqual(42, attributes[0].value)
57
        self.assertEqual('Lets put some\ncomments for ATTR1 here\n\nwith '
58
                         'multiple lines...', attributes[0].doc)
59
        self.assertEqual('And some more comments here...', attributes[0].comment)
60
61
    def test_discover_attributes_in_private_modules(self):
62
        # SETUP
63
        path_to_resources = (Path(__file__).parent.parent / 'test_resources'
64
                             / 'examples_for_tests')
65
66
        # EXECUTE
67
        attributes = discover_attributes(path_to_resources, in_private_modules=True)
68
69
        # VERIFY
70
        self.assertEqual(3, len(attributes))
71
        self.assertTrue(all([attribute.is_public for attribute in attributes]))
72
73
    def test_discover_private_attributes(self):
74
        # SETUP
75
        path_to_resources = (Path(__file__).parent.parent / 'test_resources'
76
                             / 'examples_for_tests')
77
78
        # EXECUTE
79
        attributes = discover_attributes(path_to_resources, include_privates=True)
80
81
        # VERIFY
82
        self.assertEqual(4, len(attributes))
83
        self.assertTrue(any([attribute.is_private for attribute in attributes]))
84
85
    def test_discover_attributes_with_signature(self):
86
        # SETUP
87
        path_to_resources = (Path(__file__).parent.parent / 'test_resources'
88
                             / 'examples_for_tests')
89
90
        # EXECUTE
91
        attributes_str = discover_attributes(path_to_resources, signature=str)
92
        attributes_int = discover_attributes(path_to_resources, signature=int)
93
94
        # VERIFY
95
        self.assertEqual(1, len(attributes_str))
96
        self.assertEqual(1, len(attributes_int))
97
        self.assertEqual(str, attributes_str[0].type_)
98
        self.assertEqual(int, attributes_int[0].type_)
99
100
    def test_discover_attributes_with_wrong_argument(self):
101
        # EXECUTE & VALIDATE
102
        with self.assertRaises(ValueError):
103
            discover_attributes(123)
104
105
    def test_find_docstring(self):
106
        # SETUP
107
        expected1 = 'Some\ndocstring...'
108
        lines1 = [
109
            '    """   \n',
110
            '\n',
111
            'Some\n'
112
            'docstring...\n',
113
            '   """     \n',
114
        ]
115
        expected2 = 'Another\ndocstring...'
116
        lines2 = [
117
            "    '''   Another\n",
118
            'docstring...\n',
119
            "   '''     \n",
120
        ]
121
        expected3 = 'A\ndocstring, that\nhovers a bit'
122
        lines3 = [
123
            '"""A\n',
124
            'docstring, that\n',
125
            'hovers a bit"""\n',
126
            ' \n',
127
            ' \n',
128
        ]
129
        expected4 = None
130
        lines4 = [
131
            '""Almost a docstring"""'
132
        ]
133
        expected5 = None
134
        lines5 = [
135
            '"""Also almost..."""\n# Nope'
136
        ]
137
138
        # EXECUTE
139
        docstring1 = _find_attribute_docstring(lines1)
140
        docstring2 = _find_attribute_docstring(lines2)
141
        docstring3 = _find_attribute_docstring(lines3)
142
        docstring4 = _find_attribute_docstring(lines4)
143
        docstring5 = _find_attribute_docstring(lines5)
144
145
        # VERIFY
146
        self.assertEqual(expected1, docstring1)
147
        self.assertEqual(expected2, docstring2)
148
        self.assertEqual(expected3, docstring3)
149
        self.assertEqual(expected4, docstring4)
150
        self.assertEqual(expected5, docstring5)
151