def test_simple_as_route_method(self): class WebsocketConsumer(websockets.WebsocketConsumer): def connect(self, message, **kwargs): self.send(text=message.get('order')) routes = [ WebsocketConsumer.as_route(attrs={"strict_ordering": True}, path='^/path$'), WebsocketConsumer.as_route(path='^/path/2$'), ] self.assertIsNot(routes[0].consumer, WebsocketConsumer) self.assertIs(routes[1].consumer, WebsocketConsumer) with apply_routes(routes): client = Client() client.send('websocket.connect', {'path': '/path', 'order': 1}) client.send('websocket.connect', {'path': '/path', 'order': 0}) client.consume('websocket.connect') client.consume('websocket.connect') client.consume('websocket.connect') self.assertEqual(client.receive(), {'text': 0}) self.assertEqual(client.receive(), {'text': 1}) client.send_and_consume('websocket.connect', {'path': '/path/2', 'order': 'next'}) self.assertEqual(client.receive(), {'text': 'next'})
def test_simple_as_route_method(self): class WebsocketConsumer(websockets.WebsocketConsumer): def connect(self, message, **kwargs): self.send(text=message.get('order')) routes = [ WebsocketConsumer.as_route(attrs={'slight_ordering': True}, path='^/path$'), WebsocketConsumer.as_route(path='^/path/2$'), ] self.assertIsNot(routes[0].consumer, WebsocketConsumer) self.assertIs(routes[1].consumer, WebsocketConsumer) with apply_routes(routes): client = Client() client.send('websocket.connect', {'path': '/path', 'order': 1}) client.send('websocket.connect', {'path': '/path', 'order': 0}) client.consume('websocket.connect') client.consume('websocket.connect') client.consume('websocket.connect') self.assertEqual(client.receive(), {'text': 0}) self.assertEqual(client.receive(), {'text': 1}) client.send_and_consume('websocket.connect', { 'path': '/path/2', 'order': 'next' }) self.assertEqual(client.receive(), {'text': 'next'})
def test_websocket_demultiplexer_send(self): class MyWebsocketConsumer(websockets.JsonWebsocketConsumer): def receive(self, content, multiplexer=None, **kwargs): import pdb pdb.set_trace() # breakpoint 69f2473b // self.send(content) class Demultiplexer(websockets.WebsocketDemultiplexer): consumers = {"mystream": MyWebsocketConsumer} with apply_routes([ route_class(Demultiplexer, path='/path/(?P<id>\d+)'), route_class(MyWebsocketConsumer), ]): client = Client() with self.assertRaises(SendNotAvailableOnDemultiplexer): client.send_and_consume( 'websocket.receive', { 'path': '/path/1', 'text': json.dumps({ "stream": "mystream", "payload": { "text_field": "mytext" } }) }) client.receive()
def test_consumer(self): client = Client() with apply_routes([MyConsumer.as_route()]): spy.reset_mock() client.send_and_consume(u'websocket.connect', {'path': '/'}) client.send_and_consume( u'websocket.receive', { 'path': '/', 'text': json.dumps({ 'type': 'INCREMENT_COUNTER', 'payload': 2, }), }) self.assertEqual(spy.call_count, 1) self.assertEqual( client.receive(), { 'text': json.dumps({ 'type': 'INCREMENTED_COUNTER', 'payload': 2, }), })
class TestStreamConsumerReceive(ChannelTestCase): @classmethod def setUpTestData(cls): super(TestStreamConsumerReceive, cls).setUpTestData() cls.content = ContentFactory() def setUp(self): super(TestStreamConsumerReceive, self).setUp() self.client = Client() def test_receive_sends_reply_content(self): self.client.send_and_consume( "websocket.receive", { "path": "/ch/streams/public/", "text": '{"action": "load_content", "ids": [%s]}' % self.content.id, }, ) receive = self.client.receive() text = json.loads(receive["text"]) self.assertEqual(text["event"], "content") self.assertEqual(text["contents"], [{ "id": self.content.id, "author": self.content.author.id, "rendered": self.content.rendered, }])
def test_as_route_method(self): class WebsocketConsumer(BaseConsumer): trigger = 'new' def test(self, message, **kwargs): self.message.reply_channel.send({'trigger': self.trigger}) method_mapping = {'mychannel': 'test'} with apply_routes([WebsocketConsumer.as_route( {'method_mapping': method_mapping, 'trigger': 'from_as_route'}, name='filter')]): client = Client() client.send_and_consume('mychannel', {'name': 'filter'}) self.assertEqual(client.receive(), {'trigger': 'from_as_route'})
def test_as_route_method(self): class WebsocketConsumer(BaseConsumer): trigger = 'new' def test(self, message, **kwargs): self.message.reply_channel.send({'trigger': self.trigger}) method_mapping = {'mychannel': 'test'} with apply_routes([ WebsocketConsumer.as_route( { 'method_mapping': method_mapping, 'trigger': 'from_as_route' }, name='filter') ]): client = Client() client.send_and_consume('mychannel', {'name': 'filter'}) self.assertEqual(client.receive(), {'trigger': 'from_as_route'})
class TestStreamConsumer(SocialhomeChannelTestCase): @classmethod def setUpTestData(cls): super().setUpTestData() cls.user = UserFactory() cls.content = ContentFactory() cls.content2 = ContentFactory() cls.child_content = ContentFactory(parent=cls.content) cls.tag = TagFactory() def setUp(self): super().setUp() self.client = Client() @patch.object(StreamConsumer, "__init__", return_value=None) @patch("socialhome.streams.consumers.PublicStream.get_queryset", return_value="spam") def test__get_base_qs(self, mock_qs, mock_consumer): consumer = StreamConsumer() consumer.kwargs = {"stream": "public"} self.assertEqual(consumer._get_base_qs(), "spam") @patch.object(StreamConsumer, "__init__", return_value=None) def test__get_stream_class(self, mock_consumer): consumer = StreamConsumer() with patch.object(consumer, "_get_stream_info", return_value=("public", None)): self.assertEqual(consumer._get_stream_class(), PublicStream) with patch.object(consumer, "_get_stream_info", return_value=("followed", None)): self.assertEqual(consumer._get_stream_class(), FollowedStream) with patch.object(consumer, "_get_stream_info", return_value=("tag", None)): self.assertEqual(consumer._get_stream_class(), TagStream) @patch.object(StreamConsumer, "__init__", return_value=None) def test__get_stream_info(self, mock_consumer): consumer = StreamConsumer() consumer.kwargs = {"stream": "spam"} self.assertEqual(consumer._get_stream_info(), ("spam", None)) consumer.kwargs = {"stream": "spam__eggs"} self.assertEqual(consumer._get_stream_info(), ("spam", "eggs")) @patch.object(StreamConsumer, "__init__", return_value=None) def test__get_stream_instance(self, mock_consumer): consumer = StreamConsumer() consumer.kwargs = {"stream": "public"} instance = consumer._get_stream_instance() self.assertTrue(isinstance(instance, PublicStream)) consumer.kwargs = {"stream": "followed"} consumer.message = Mock(user=self.user) instance = consumer._get_stream_instance() self.assertTrue(isinstance(instance, FollowedStream)) self.assertTrue(instance.user, self.user) consumer.kwargs = {"stream": "tag__%s" % self.tag.id} instance = consumer._get_stream_instance() self.assertTrue(isinstance(instance, TagStream)) self.assertEqual(instance.tag, self.tag) @patch.object(StreamConsumer, "__init__", return_value=None) @patch("socialhome.streams.consumers.PublicStream.get_content", return_value="spam") def test__get_stream_qs(self, mock_qs, mock_consumer): consumer = StreamConsumer() consumer.kwargs = {"stream": "public"} self.assertEqual(consumer._get_stream_qs(), "spam") def test_receive_load_content_sends_reply_content(self): self.client.send_and_consume( "websocket.receive", { "path": "/ch/streams/public/", "text": '{"action": "load_content", "ids": [%s]}' % self.content.id, }, ) receive = self.client.receive() text = json.loads(receive["text"]) self.assertEqual(text["event"], "content") self.assertEqual(text["placement"], "prepended") self.assertEqual(text["contents"], [self.content.dict_for_view(AnonymousUser())]) def test_receive_load_more_sends_more_content(self): self.client.send_and_consume( "websocket.receive", { "path": "/ch/streams/public/", "text": '{"action": "load_more", "last_id": %s}' % self.content2.id, }, ) receive = self.client.receive() text = json.loads(receive["text"]) self.assertEqual(text["event"], "content") self.assertEqual(text["placement"], "appended") self.assertEqual(text["contents"], [self.content.dict_for_view(AnonymousUser())]) def test_receive_load_children_sends_reply_content(self): self.client.send_and_consume( "websocket.receive", { "path": "/ch/streams/public/", "text": '{"action": "load_children", "content_id": %s}' % self.content.id, }, ) receive = self.client.receive() text = json.loads(receive["text"]) self.assertEqual(text["event"], "content") self.assertEqual(text["placement"], "children") self.assertEqual(text["parent_id"], self.content.id) self.assertEqual(text["contents"], [self.child_content.dict_for_view(AnonymousUser())]) @patch("socialhome.streams.consumers.Content.objects.public", return_value=Content.objects.none()) @patch("socialhome.streams.consumers.Content.objects.tag", return_value=Content.objects.none()) @patch("socialhome.streams.consumers.Content.objects.profile_by_id", return_value=Content.objects.none()) @patch("socialhome.streams.consumers.Content.objects.profile_pinned", return_value=Content.objects.none()) @patch("socialhome.streams.consumers.Content.objects.followed", return_value=Content.objects.none()) def test_get_stream_qs_per_stream(self, mock_followed, mock_pinned, mock_profile, mock_tag, mock_public): self.client.send_and_consume( "websocket.receive", { "path": "/ch/streams/public/", "text": '{"action": "load_more", "last_id": %s}' % self.content2.id, }, ) mock_public.assert_called_once_with() self.client.send_and_consume( "websocket.receive", { "path": "/ch/streams/tag__%s_%s/" % (self.tag.id, self.tag.name), "text": '{"action": "load_more", "last_id": %s}' % self.content2.id, }, ) self.assertEqual(mock_tag.call_count, 1) self.assertEqual(mock_tag.call_args[0][0], self.tag) self.client.send_and_consume( "websocket.receive", { "path": "/ch/streams/profile__1234/", "text": '{"action": "load_more", "last_id": %s}' % self.content2.id, }, ) self.assertEqual(mock_pinned.call_count, 1) self.assertEqual(mock_pinned.call_args[0][0], "1234") self.client.send_and_consume( "websocket.receive", { "path": "/ch/streams/profile_all__1234/", "text": '{"action": "load_more", "last_id": %s}' % self.content2.id, }, ) self.assertEqual(mock_profile.call_count, 1) self.assertEqual(mock_profile.call_args[0][0], "1234") self.client.send_and_consume( "websocket.receive", { "path": "/ch/streams/followed__foobar/", "text": '{"action": "load_more", "last_id": %s}' % self.content2.id, }, ) self.assertEqual(mock_followed.call_count, 1)
class TestStreamConsumerReceive(ChannelTestCase): maxDiff = None @classmethod def setUpTestData(cls): super(TestStreamConsumerReceive, cls).setUpTestData() cls.content = ContentFactory() cls.content2 = ContentFactory() cls.child_content = ContentFactory(parent=cls.content) cls.tag = TagFactory() def setUp(self): super(TestStreamConsumerReceive, self).setUp() self.client = Client() def test_receive_load_content_sends_reply_content(self): self.client.send_and_consume( "websocket.receive", { "path": "/ch/streams/public/", "text": '{"action": "load_content", "ids": [%s]}' % self.content.id, }, ) receive = self.client.receive() text = json.loads(receive["text"]) self.assertEqual(text["event"], "content") self.assertEqual(text["placement"], "prepended") self.assertEqual(text["contents"], [self.content.dict_for_view(AnonymousUser())]) def test_receive_load_more_sends_more_content(self): self.client.send_and_consume( "websocket.receive", { "path": "/ch/streams/public/", "text": '{"action": "load_more", "last_id": %s}' % self.content2.id, }, ) receive = self.client.receive() text = json.loads(receive["text"]) self.assertEqual(text["event"], "content") self.assertEqual(text["placement"], "appended") self.assertEqual(text["contents"], [self.content.dict_for_view(AnonymousUser())]) def test_receive_load_children_sends_reply_content(self): self.client.send_and_consume( "websocket.receive", { "path": "/ch/streams/public/", "text": '{"action": "load_children", "content_id": %s}' % self.content.id, }, ) receive = self.client.receive() text = json.loads(receive["text"]) self.assertEqual(text["event"], "content") self.assertEqual(text["placement"], "children") self.assertEqual(text["parent_id"], self.content.id) self.assertEqual(text["contents"], [self.child_content.dict_for_view(AnonymousUser())]) @patch("socialhome.streams.consumers.Content.objects.public", return_value=Content.objects.none()) @patch("socialhome.streams.consumers.Content.objects.tag", return_value=Content.objects.none()) @patch("socialhome.streams.consumers.Content.objects.profile_by_id", return_value=Content.objects.none()) @patch("socialhome.streams.consumers.Content.objects.profile_pinned", return_value=Content.objects.none()) @patch("socialhome.streams.consumers.Content.objects.followed", return_value=Content.objects.none()) def test_get_stream_qs_per_stream(self, mock_followed, mock_pinned, mock_profile, mock_tag, mock_public): self.client.send_and_consume( "websocket.receive", { "path": "/ch/streams/public/", "text": '{"action": "load_more", "last_id": %s}' % self.content2.id, }, ) mock_public.assert_called_once_with() self.client.send_and_consume( "websocket.receive", { "path": "/ch/streams/tag__%s_%s/" % (self.tag.id, self.tag.name), "text": '{"action": "load_more", "last_id": %s}' % self.content2.id, }, ) self.assertEqual(mock_tag.call_count, 1) self.assertEqual(mock_tag.call_args[0][0], self.tag) self.client.send_and_consume( "websocket.receive", { "path": "/ch/streams/profile__1234/", "text": '{"action": "load_more", "last_id": %s}' % self.content2.id, }, ) self.assertEqual(mock_pinned.call_count, 1) self.assertEqual(mock_pinned.call_args[0][0], "1234") self.client.send_and_consume( "websocket.receive", { "path": "/ch/streams/profile_all__1234/", "text": '{"action": "load_more", "last_id": %s}' % self.content2.id, }, ) self.assertEqual(mock_profile.call_count, 1) self.assertEqual(mock_profile.call_args[0][0], "1234") self.client.send_and_consume( "websocket.receive", { "path": "/ch/streams/followed__foobar/", "text": '{"action": "load_more", "last_id": %s}' % self.content2.id, }, ) self.assertEqual(mock_followed.call_count, 1)
class TestStreamConsumerReceive(ChannelTestCase): @classmethod def setUpTestData(cls): super(TestStreamConsumerReceive, cls).setUpTestData() cls.content = ContentFactory() cls.content2 = ContentFactory() def setUp(self): super(TestStreamConsumerReceive, self).setUp() self.client = Client() def test_receive_load_content_sends_reply_content(self): self.client.send_and_consume( "websocket.receive", { "path": "/ch/streams/public/", "text": '{"action": "load_content", "ids": [%s]}' % self.content.id, }, ) receive = self.client.receive() text = json.loads(receive["text"]) self.assertEqual(text["event"], "content") self.assertEqual(text["placement"], "prepended") self.assertEqual(text["contents"], [ { "id": self.content.id, "guid": self.content.guid, "author": self.content.author.id, "author_image": self.content.author.safer_image_url_small, "author_name": self.content.author.handle, "rendered": self.content.rendered, "humanized_timestamp": self.content.humanized_timestamp, "formatted_timestamp": self.content.formatted_timestamp, } ]) def test_receive_load_more_sends_more_content(self): self.client.send_and_consume( "websocket.receive", { "path": "/ch/streams/public/", "text": '{"action": "load_more", "last_id": %s}' % self.content2.id, }, ) receive = self.client.receive() text = json.loads(receive["text"]) self.assertEqual(text["event"], "content") self.assertEqual(text["placement"], "appended") self.assertEqual(text["contents"], [ { "id": self.content.id, "guid": self.content.guid, "author": self.content.author.id, "author_image": self.content.author.safer_image_url_small, "author_name": self.content.author.handle, "rendered": self.content.rendered, "humanized_timestamp": self.content.humanized_timestamp, "formatted_timestamp": self.content.formatted_timestamp, } ]) @patch("socialhome.streams.consumers.Content.objects.public", return_value=Content.objects.none()) @patch("socialhome.streams.consumers.Content.objects.tags", return_value=Content.objects.none()) @patch("socialhome.streams.consumers.Content.objects.profile", return_value=Content.objects.none()) def test_get_stream_qs_per_stream(self, mock_profile, mock_tags, mock_public): self.client.send_and_consume( "websocket.receive", { "path": "/ch/streams/public/", "text": '{"action": "load_more", "last_id": %s}' % self.content2.id, }, ) mock_public.assert_called_once_with() self.client.send_and_consume( "websocket.receive", { "path": "/ch/streams/tags__foobar/", "text": '{"action": "load_more", "last_id": %s}' % self.content2.id, }, ) self.assertEqual(mock_tags.call_count, 1) self.assertEqual(mock_tags.call_args[0][0], "foobar") self.client.send_and_consume( "websocket.receive", { "path": "/ch/streams/profile__1234/", "text": '{"action": "load_more", "last_id": %s}' % self.content2.id, }, ) self.assertEqual(mock_profile.call_count, 1) self.assertEqual(mock_profile.call_args[0][0], "1234")
def test_websockets_demultiplexer(self): class MyWebsocketConsumer(websockets.JsonWebsocketConsumer): def connect(self, message, multiplexer=None, **kwargs): multiplexer.send(kwargs) def disconnect(self, message, multiplexer=None, **kwargs): multiplexer.send(kwargs) def receive(self, content, multiplexer=None, **kwargs): multiplexer.send(content) class Demultiplexer(websockets.WebsocketDemultiplexer): consumers = {"mystream": MyWebsocketConsumer} with apply_routes([ route_class(Demultiplexer, path='/path/(?P<id>\d+)'), route_class(MyWebsocketConsumer), ]): client = Client() client.send_and_consume('websocket.connect', {'path': '/path/1'}) self.assertEqual( client.receive(), { "text": json.dumps({ "stream": "mystream", "payload": { "id": "1" }, }) }) client.send_and_consume( 'websocket.receive', { 'path': '/path/1', 'text': json.dumps({ "stream": "mystream", "payload": { "text_field": "mytext" } }) }) self.assertEqual( client.receive(), { "text": json.dumps({ "stream": "mystream", "payload": { "text_field": "mytext" }, }) }) client.send_and_consume('websocket.disconnect', {'path': '/path/1'}) self.assertEqual( client.receive(), { "text": json.dumps({ "stream": "mystream", "payload": { "id": "1" }, }) })