22import json
33
44from pubnub .enums import PNOperationType , PNStatusCategory
5- from pubnub .callbacks import SubscribeCallback
65from pubnub .models .consumer .common import PNStatus
76from pubnub .models .consumer .pubsub import PNMessageResult
87
@@ -90,33 +89,39 @@ async def test_publish_goto_state_with_hold(self, mocked_request):
9089 self .assertEqual (options .query_string ,
9190 f'auth=ACCESS_TOKEN&pnsdk=PubNub-Python-Asyncio%2F{ self .pubnub ._pubnub .SDK_VERSION } &uuid=UUID' )
9291
93- @patch ('pubnub.pubnub_core.PubNubCore.add_listener' )
9492 @patch ('pubnub.managers.SubscriptionManager.adapt_subscribe_builder' )
95- async def test_subscribe (self , mocked_subscribe_builder , mocked_add_listener ):
93+ async def test_subscribe_and_await_connect (self , mocked_subscribe_builder ):
9694 """Test subscribe"""
97- # Setup
98-
99- def add_listener_side_effect (listener : SubscribeCallback ):
100- # Call Connect Status.
101- pn_status = PNStatus ()
102- pn_status .category = PNStatusCategory .PNConnectedCategory
103- # Call after 1s: listener.status(self.pubnub._pubnub, pn_status)
104- self .loop .call_later (1 , listener .status , self .pubnub ._pubnub , pn_status ) # pylint: disable=protected-access
105-
106- mocked_add_listener .side_effect = add_listener_side_effect
95+ # pylint: disable=protected-access
96+ # Call Connect Status.
97+ pn_status = PNStatus ()
98+ pn_status .category = PNStatusCategory .PNConnectedCategory
99+ # Call after 1s: listener.status(self.pubnub._pubnub, pn_status)
100+ self .loop .call_later (1 , self .pubnub ._listener .status ,
101+ self .pubnub ._pubnub , pn_status )
107102
108- await self .pubnub .subscribe ()
103+ await self .pubnub .subscribe_and_await_connect ()
109104
110- mocked_add_listener .assert_called_once ()
111105 mocked_subscribe_builder .assert_called_once ()
112106 subscribe_operation = mocked_subscribe_builder .mock_calls [0 ][1 ][0 ]
113107 self .assertEqual (subscribe_operation .channels , ['ActivityState.SERIAL_NUMBER' ])
114108 self .assertEqual (subscribe_operation .channel_groups , [])
115109 self .assertEqual (subscribe_operation .presence_enabled , False )
116110 self .assertEqual (subscribe_operation .timetoken , 0 )
117111
112+ @patch ('pubnub.managers.SubscriptionManager.adapt_subscribe_builder' )
113+ def test_prevent_multiple_subscription (self , mocked_subscribe_builder ):
114+ """Test prevent multiple subscriptions"""
115+ # pylint: disable=protected-access
116+ # Set Listener as connected
117+ self .pubnub ._listener .connected_event .set ()
118+
119+ self .pubnub .subscribe ()
120+
121+ mocked_subscribe_builder .assert_not_called ()
122+
118123 @patch ('pubnub.managers.SubscriptionManager.adapt_unsubscribe_builder' )
119- async def test_unsubscribe (self , mocked_unsubscribe_builder ):
124+ async def test_unsubscribe_and_await_disconnect (self , mocked_unsubscribe_builder ):
120125 """Test unsubscribe"""
121126 # pylint: disable=protected-access
122127 # Call Connect Status.
@@ -125,14 +130,25 @@ async def test_unsubscribe(self, mocked_unsubscribe_builder):
125130 pn_status .operation = PNOperationType .PNUnsubscribeOperation
126131 # Call after 1s: listener.status(self.pubnub._pubnub, pn_status)
127132 self .loop .call_later (1 , self .pubnub ._listener .status , self .pubnub ._pubnub , pn_status )
133+ # Listener is connected:
134+ self .pubnub ._listener .connected_event .set ()
128135
129- await self .pubnub .unsubscribe ()
136+ await self .pubnub .unsubscribe_and_await_disconnect ()
130137
131138 mocked_unsubscribe_builder .assert_called_once ()
132139 unsubscribe_operation = mocked_unsubscribe_builder .mock_calls [0 ][1 ][0 ]
133140 self .assertEqual (unsubscribe_operation .channels , ['ActivityState.SERIAL_NUMBER' ])
134141 self .assertEqual (unsubscribe_operation .channel_groups , [])
135142
143+ @patch ('pubnub.managers.SubscriptionManager.adapt_unsubscribe_builder' )
144+ def test_prevent_multiple_unsubscription (self , mocked_unsubscribe_builder ):
145+ """Test prevent multiple unsubscriptions"""
146+
147+ # Listener is disconnected (initial state)
148+ self .pubnub .unsubscribe ()
149+
150+ mocked_unsubscribe_builder .assert_not_called ()
151+
136152 @patch ('pubnub.pubnub_asyncio.PubNubAsyncio.request_future' )
137153 async def test_history (self , mocked_request ):
138154 """Test history"""
0 commit comments