Completed
Pull Request — master (#1127)
by Mischa
03:55 queued 01:23
created

coalib.tests.bears.BearWithPrerequisites   A

Complexity

Total Complexity 3

Size/Duplication

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

3 Methods

Rating   Name   Duplication   Size   Complexity  
A run() 0 3 1
A __init__() 0 3 1
A check_prerequisites() 0 3 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
    prerequisites_fulfilled = True
47
48
    def __init__(self, section, queue):
49
        Bear.__init__(self, section, queue)
50
        self.was_executed = False
51
52
    def run(self):
53
        self.was_executed = True
54
        return []
55
56
    @staticmethod
57
    def check_prerequisites():
58
        return BearWithPrerequisites.prerequisites_fulfilled
59
60
61
class BearTest(unittest.TestCase):
62
    def setUp(self):
63
        self.queue = multiprocessing.Queue()
64
        self.settings = Section("test_settings")
65
        self.uut = TestBear(self.settings, self.queue)
66
67
    def test_simple_api(self):
68
        self.assertRaises(TypeError, TestBear, self.settings, 2)
69
        self.assertRaises(TypeError, TestBear, None, self.queue)
70
        self.assertRaises(NotImplementedError, self.uut.kind)
71
72
        base = Bear(self.settings, None)
73
        self.assertRaises(NotImplementedError, base.run)
74
        self.assertEqual(base.get_non_optional_settings(), {})
75
76
    def test_message_queue(self):
77
        self.uut.execute()
78
        self.check_message(LOG_LEVEL.DEBUG,
79
                           "Running bear {}...".format("TestBear"))
80
        self.check_message(LOG_LEVEL.DEBUG, "set=up")
81
        self.check_message(LOG_LEVEL.ERROR, "teardown")
82
83
    def test_bad_bear(self):
84
        self.uut = BadTestBear(self.settings, self.queue)
85
        self.uut.execute()
86
        self.check_message(LOG_LEVEL.DEBUG)
87
        self.check_message(LOG_LEVEL.WARNING,
88
                           "Bear BadTestBear failed to run. Take a look at "
89
                           "debug messages for further information.")
90
        # debug message contains custom content, dont test this here
91
        self.queue.get()
92
93
    def test_inconvertible(self):
94
        self.uut = TypedTestBear(self.settings, self.queue)
95
        self.settings.append(Setting("something", "5"))
96
        self.uut.execute()
97
        self.check_message(LOG_LEVEL.DEBUG)
98
        self.assertTrue(self.uut.was_executed)
99
100
        self.settings.append(Setting("something", "nonsense"))
101
        self.uut.was_executed = False
102
        self.uut.execute()
103
        self.check_message(LOG_LEVEL.DEBUG)
104
        self.check_message(LOG_LEVEL.WARNING)
105
        self.assertTrue(self.queue.empty())
106
        self.assertFalse(self.uut.was_executed)
107
108
    def check_message(self, log_level, message=None):
109
        msg = self.queue.get()
110
        self.assertIsInstance(msg, LogMessage)
111
        if message:
112
            self.assertEqual(msg.message, message)
113
114
        self.assertEqual(msg.log_level, log_level, msg)
115
116
    def test_no_queue(self):
117
        uut = TestBear(self.settings, None)
118
        uut.execute()  # No exceptions
119
120
    def test_dependencies(self):
121
        self.assertEqual(Bear.get_dependencies(), [])
122
        self.assertEqual(Bear.missing_dependencies([]), [])
123
        self.assertEqual(Bear.missing_dependencies([BadTestBear]), [])
124
125
        self.assertEqual(TestBear.missing_dependencies([]), [BadTestBear])
126
        self.assertEqual(TestBear.missing_dependencies([BadTestBear]), [])
127
        self.assertEqual(TestBear.missing_dependencies([TestBear]),
128
                         [BadTestBear])
129
        self.assertEqual(TestBear.missing_dependencies([TestBear,
130
                                                        BadTestBear]),
131
                         [])
132
133
    def test_check_prerequisites(self):
134
        uut = BearWithPrerequisites(self.settings, self.queue)
135
        BearWithPrerequisites.prerequisites_fulfilled = True
136
        uut.execute()
137
        self.check_message(LOG_LEVEL.DEBUG)
138
        self.assertTrue(self.queue.empty())
139
        self.assertTrue(uut.was_executed)
140
141
        BearWithPrerequisites.prerequisites_fulfilled = False
142
        self.assertRaisesRegex(RuntimeError,
143
                               "The bear BearWithPrerequisites does not "
144
                                   "fulfill all requirements\\.",
145
                               BearWithPrerequisites,
146
                               self.settings,
147
                               self.queue)
148
149
        self.assertTrue(self.queue.empty())
150
151
        BearWithPrerequisites.prerequisites_fulfilled = (
152
            "Just because I want to.")
153
        self.assertRaisesRegex(RuntimeError,
154
                               "The bear BearWithPrerequisites does not "
155
                                   "fulfill all requirements\\. Just because "
156
                                   "I want to\\.",
157
                               BearWithPrerequisites,
158
                               self.settings,
159
                               self.queue)
160
161
        self.assertTrue(self.queue.empty())
162
163
164
if __name__ == '__main__':
165
    unittest.main(verbosity=2)
166