Skip to content

Commit ac91aea

Browse files
committed
Merge branch 'fkromer-test_publish_subscribe'
2 parents f3ed921 + f64dfea commit ac91aea

File tree

2 files changed

+81
-0
lines changed

2 files changed

+81
-0
lines changed

publish_subscribe.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,9 @@ def __init__(self, name, msg_center):
4848
def subscribe(self, msg):
4949
self.provider.subscribe(msg, self)
5050

51+
def unsubscribe(self, msg):
52+
self.provider.unsubscribe(msg, self)
53+
5154
def run(self, msg):
5255
print("{} got {}".format(self.name, msg))
5356

@@ -63,6 +66,9 @@ def main():
6366
jack.subscribe("music")
6467
gee = Subscriber("gee", message_center)
6568
gee.subscribe("movie")
69+
vani = Subscriber("vani", message_center)
70+
vani.subscribe("movie")
71+
vani.unsubscribe("movie")
6672

6773
fftv.publish("cartoon")
6874
fftv.publish("music")

test_publish_subscribe.py

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
#!/usr/bin/env python
2+
# -*- coding: utf-8 -*-
3+
4+
from sys import version_info
5+
from publish_subscribe import Provider, Publisher, Subscriber
6+
7+
if version_info < (2, 7):
8+
import unittest2 as unittest
9+
10+
else:
11+
import unittest
12+
13+
from unittest.mock import patch, call
14+
15+
class TestProvider(unittest.TestCase):
16+
"""
17+
Integration tests ~ provider class with as little mocking as possible.
18+
"""
19+
def test_subscriber_shall_be_attachable_to_subscriptions(cls):
20+
subscription = 'sub msg'
21+
pro = Provider()
22+
cls.assertEqual(len(pro.subscribers), 0)
23+
sub = Subscriber('sub name', pro)
24+
sub.subscribe(subscription)
25+
cls.assertEqual(len(pro.subscribers[subscription]), 1)
26+
27+
def test_subscriber_shall_be_detachable_from_subscriptions(cls):
28+
subscription = 'sub msg'
29+
pro = Provider()
30+
sub = Subscriber('sub name', pro)
31+
sub.subscribe(subscription)
32+
cls.assertEqual(len(pro.subscribers[subscription]), 1)
33+
sub.unsubscribe(subscription)
34+
cls.assertEqual(len(pro.subscribers[subscription]), 0)
35+
36+
def test_publisher_shall_append_subscription_message_to_queue(cls):
37+
''' msg_queue ~ Provider.notify(msg) ~ Publisher.publish(msg) '''
38+
expected_msg = 'expected msg'
39+
pro = Provider()
40+
pub = Publisher(pro)
41+
sub = Subscriber('sub name', pro)
42+
cls.assertEqual(len(pro.msg_queue), 0)
43+
pub.publish(expected_msg)
44+
cls.assertEqual(len(pro.msg_queue), 1)
45+
cls.assertEqual(pro.msg_queue[0], expected_msg)
46+
47+
def test_provider_shall_update_affected_subscribers_with_published_subscription(cls):
48+
pro = Provider()
49+
pub = Publisher(pro)
50+
sub1 = Subscriber('sub 1 name', pro)
51+
sub1.subscribe('sub 1 msg 1')
52+
sub1.subscribe('sub 1 msg 2')
53+
sub2 = Subscriber('sub 2 name', pro)
54+
sub2.subscribe('sub 2 msg 1')
55+
sub2.subscribe('sub 2 msg 2')
56+
with patch.object(sub1, 'run') as mock_subscriber1_run,\
57+
patch.object(sub2, 'run') as mock_subscriber2_run:
58+
pro.update()
59+
cls.assertEqual(mock_subscriber1_run.call_count, 0)
60+
cls.assertEqual(mock_subscriber2_run.call_count, 0)
61+
pub.publish('sub 1 msg 1')
62+
pub.publish('sub 1 msg 2')
63+
pub.publish('sub 2 msg 1')
64+
pub.publish('sub 2 msg 2')
65+
with patch.object(sub1, 'run') as mock_subscriber1_run,\
66+
patch.object(sub2, 'run') as mock_subscriber2_run:
67+
pro.update()
68+
expected_sub1_calls = [call('sub 1 msg 1'), call('sub 1 msg 2')]
69+
mock_subscriber1_run.assert_has_calls(expected_sub1_calls)
70+
expected_sub2_calls = [call('sub 2 msg 1'), call('sub 2 msg 2')]
71+
mock_subscriber2_run.assert_has_calls(expected_sub2_calls)
72+
73+
if __name__ == "__main__":
74+
unittest.main()
75+

0 commit comments

Comments
 (0)