Skip to content

Commit 7cb8279

Browse files
committed
Tests for observer patt. can run in random order
1 parent 358953d commit 7cb8279

File tree

1 file changed

+29
-58
lines changed

1 file changed

+29
-58
lines changed

tests/behavioral/test_observer.py

Lines changed: 29 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,58 +1,29 @@
1-
import unittest
2-
from unittest.mock import patch
3-
4-
from patterns.behavioral.observer import Subject, Data, DecimalViewer, HexViewer
5-
6-
7-
class TestSubject(unittest.TestCase):
8-
@classmethod
9-
def setUpClass(cls):
10-
cls.s = Subject()
11-
cls.dec_obs = DecimalViewer()
12-
cls.hex_obs = HexViewer()
13-
14-
def test_a_observer_list_shall_be_empty_initially(cls):
15-
cls.assertEqual(len(cls.s._observers), 0)
16-
17-
def test_b_observers_shall_be_attachable(cls):
18-
cls.s.attach(cls.dec_obs)
19-
cls.assertEqual(isinstance(cls.s._observers[0], DecimalViewer), True)
20-
cls.assertEqual(len(cls.s._observers), 1)
21-
cls.s.attach(cls.hex_obs)
22-
cls.assertEqual(isinstance(cls.s._observers[1], HexViewer), True)
23-
cls.assertEqual(len(cls.s._observers), 2)
24-
25-
def test_c_observers_shall_be_detachable(cls):
26-
cls.s.detach(cls.dec_obs)
27-
# hex viewer shall be remaining if dec viewer is detached first
28-
cls.assertEqual(isinstance(cls.s._observers[0], HexViewer), True)
29-
cls.assertEqual(len(cls.s._observers), 1)
30-
cls.s.detach(cls.hex_obs)
31-
cls.assertEqual(len(cls.s._observers), 0)
32-
33-
34-
class TestData(unittest.TestCase):
35-
@classmethod
36-
def setUpClass(cls):
37-
cls.dec_obs = DecimalViewer()
38-
cls.hex_obs = HexViewer()
39-
cls.sub = Data('Data')
40-
# inherited behavior already tested with TestSubject
41-
cls.sub.attach(cls.dec_obs)
42-
cls.sub.attach(cls.hex_obs)
43-
44-
def test_data_change_shall_notify_all_observers_once(cls):
45-
with patch.object(cls.dec_obs, 'update') as mock_dec_obs_update, patch.object(
46-
cls.hex_obs, 'update'
47-
) as mock_hex_obs_update:
48-
cls.sub.data = 10
49-
cls.assertEqual(mock_dec_obs_update.call_count, 1)
50-
cls.assertEqual(mock_hex_obs_update.call_count, 1)
51-
52-
def test_data_value_shall_be_changeable(cls):
53-
cls.sub.data = 20
54-
cls.assertEqual(cls.sub._data, 20)
55-
56-
def test_data_name_shall_be_changeable(cls):
57-
cls.sub.name = 'New Data Name'
58-
cls.assertEqual(cls.sub.name, 'New Data Name')
1+
from unittest.mock import patch, Mock
2+
3+
import pytest
4+
5+
from patterns.behavioral.observer import Data, DecimalViewer, HexViewer
6+
7+
8+
@pytest.fixture
9+
def observable():
10+
return Data('some data')
11+
12+
def test_attach_detach(observable):
13+
decimal_viewer = DecimalViewer()
14+
assert len(observable._observers) == 0
15+
16+
observable.attach(decimal_viewer)
17+
assert decimal_viewer in observable._observers
18+
19+
observable.detach(decimal_viewer)
20+
assert decimal_viewer not in observable._observers
21+
22+
def test_one_data_change_notifies_each_observer_once(observable):
23+
observable.attach(DecimalViewer())
24+
observable.attach(HexViewer())
25+
26+
with patch('patterns.behavioral.observer.DecimalViewer.update', new_callable=Mock()) as mocked_update:
27+
assert mocked_update.call_count == 0
28+
observable.data = 10
29+
assert mocked_update.call_count == 1

0 commit comments

Comments
 (0)