Completed
Pull Request — master (#1127)
by Mischa
01:51
created

coalib.tests.bears.BearWithPrerequisites   A

Complexity

Total Complexity 3

Size/Duplication

Total Lines 12
Duplicated Lines 0 %
Metric Value
dl 0
loc 12
rs 10
wmc 3

3 Methods

Rating   Name   Duplication   Size   Complexity  
A run() 0 3 1
A __init__() 0 4 1
A check_prerequisites() 0 2 1
1
import sys
2
import multiprocessing
3
4
sys.path.insert(0, ".")
5
from coalib.settings.Section import Section
6
from coalib.settings.Setting import Setting
7
from coalib.processes.communication.LogMessage import LogMessage
8
from coalib.bears.Bear import Bear
9
from coalib.output.printers.LOG_LEVEL import LOG_LEVEL
10
import unittest
11
12
13
class TestBear(Bear):
14
    def __init__(self, section, queue):
15
        Bear.__init__(self, section, queue)
16
17
    def run(self):
18
        self.print("set", "up", delimiter="=")
19
        self.err("teardown")
20
        self.err()
21
22
    @staticmethod
23
    def get_dependencies():
24
        return [BadTestBear]
25
26
27
class BadTestBear(Bear):
0 ignored issues
show
Unused Code introduced by
This abstract class does not seem to be used anywhere.
Loading history...
28
    def __init__(self, section, queue):
29
        Bear.__init__(self, section, queue)
30
31
    def run(self):
32
        raise NotImplementedError
33
34
35
class TypedTestBear(Bear):
36
    def __init__(self, section, queue):
37
        Bear.__init__(self, section, queue)
38
        self.was_executed = False
39
40
    def run(self, something: int):
41
        self.was_executed = True
42
        return []
43
44
45
class BearWithPrerequisites(Bear):
46
    def __init__(self, section, queue, prerequisites_fulfilled):
47
        self.prerequisites_fulfilled = prerequisites_fulfilled
48
        Bear.__init__(self, section, queue)
49
        self.was_executed = False
50
51
    def run(self):
52
        self.was_executed = True
53
        return []
54
55
    def check_prerequisites(self):
56
        return self.prerequisites_fulfilled
57
58
59
class BearTest(unittest.TestCase):
60
    def setUp(self):
61
        self.queue = multiprocessing.Queue()
62
        self.settings = Section("test_settings")
63
        self.uut = TestBear(self.settings, self.queue)
64
65
    def test_simple_api(self):
66
        self.assertRaises(TypeError, TestBear, self.settings, 2)
67
        self.assertRaises(TypeError, TestBear, None, self.queue)
68
        self.assertRaises(NotImplementedError, self.uut.kind)
69
70
        base = Bear(self.settings, None)
71
        self.assertRaises(NotImplementedError, base.run)
72
        self.assertEqual(base.get_non_optional_settings(), {})
73
74
    def test_message_queue(self):
75
        self.uut.execute()
76
        self.check_message(LOG_LEVEL.DEBUG,
77
                           "Running bear {}...".format("TestBear"))
78
        self.check_message(LOG_LEVEL.DEBUG, "set=up")
79
        self.check_message(LOG_LEVEL.ERROR, "teardown")
80
81
    def test_bad_bear(self):
82
        self.uut = BadTestBear(self.settings, self.queue)
83
        self.uut.execute()
84
        self.check_message(LOG_LEVEL.DEBUG)
85
        self.check_message(LOG_LEVEL.WARNING,
86
                           "Bear BadTestBear failed to run. Take a look at "
87
                           "debug messages for further information.")
88
        # debug message contains custom content, dont test this here
89
        self.queue.get()
90
91
    def test_inconvertible(self):
92
        self.uut = TypedTestBear(self.settings, self.queue)
93
        self.settings.append(Setting("something", "5"))
94
        self.uut.execute()
95
        self.check_message(LOG_LEVEL.DEBUG)
96
        self.assertTrue(self.uut.was_executed)
97
98
        self.settings.append(Setting("something", "nonsense"))
99
        self.uut.was_executed = False
100
        self.uut.execute()
101
        self.check_message(LOG_LEVEL.DEBUG)
102
        self.check_message(LOG_LEVEL.WARNING)
103
        self.assertTrue(self.queue.empty())
104
        self.assertFalse(self.uut.was_executed)
105
106
    def check_message(self, log_level, message=None):
107
        msg = self.queue.get()
108
        self.assertIsInstance(msg, LogMessage)
109
        if message:
110
            self.assertEqual(msg.message, message)
111
112
        self.assertEqual(msg.log_level, log_level, msg)
113
114
    def test_no_queue(self):
115
        uut = TestBear(self.settings, None)
116
        uut.execute()  # No exceptions
117
118
    def test_dependencies(self):
119
        self.assertEqual(Bear.get_dependencies(), [])
120
        self.assertEqual(Bear.missing_dependencies([]), [])
121
        self.assertEqual(Bear.missing_dependencies([BadTestBear]), [])
122
123
        self.assertEqual(TestBear.missing_dependencies([]), [BadTestBear])
124
        self.assertEqual(TestBear.missing_dependencies([BadTestBear]), [])
125
        self.assertEqual(TestBear.missing_dependencies([TestBear]),
126
                         [BadTestBear])
127
        self.assertEqual(TestBear.missing_dependencies([TestBear,
128
                                                        BadTestBear]),
129
                         [])
130
131
    def test_check_prerequisites(self):
132
        uut = BearWithPrerequisites(self.settings, self.queue, True)
133
        uut.execute()
134
        self.check_message(LOG_LEVEL.DEBUG)
135
        self.assertTrue(self.queue.empty())
136
        self.assertTrue(uut.was_executed)
137
138
        self.assertRaisesRegex(RuntimeError,
139
                               "The bear BearWithPrerequisites does not "
140
                                   "fulfill all requirements\\.",
141
                               BearWithPrerequisites,
142
                               self.settings,
143
                               self.queue,
144
                               False)
145
146
        self.check_message(LOG_LEVEL.WARNING,
147
                           "The bear BearWithPrerequisites does not fulfill "
148
                               "all requirements.")
149
        self.assertTrue(self.queue.empty())
150
151
        self.assertRaisesRegex(RuntimeError,
152
                               "The bear BearWithPrerequisites does not "
153
                                   "fulfill all requirements\\. Just because "
154
                                   "I want to\\.",
155
                               BearWithPrerequisites,
156
                               self.settings,
157
                               self.queue,
158
                               "Just because I want to.")
159
160
        self.check_message(LOG_LEVEL.WARNING,
161
                           "The bear BearWithPrerequisites does not fulfill "
162
                               "all requirements. Just because I want to.")
163
        self.assertTrue(self.queue.empty())
164
165
166
if __name__ == '__main__':
167
    unittest.main(verbosity=2)
168