Example #1
0
    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'})
Example #2
0
    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'})
Example #3
0
    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()
Example #4
0
    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,
                    }),
                })
Example #5
0
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,
        }])
Example #6
0
    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'})
Example #7
0
    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'})
Example #8
0
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)
Example #9
0
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)
Example #10
0
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")
Example #11
0
    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"
                        },
                    })
                })