Example #1
0
    def test_websocket_custom_json_serialization(self):

        class WebsocketConsumer(websockets.JsonWebsocketConsumer):
            @classmethod
            def decode_json(cls, text):
                obj = json.loads(text)
                return dict((key.upper(), obj[key]) for key in obj)

            @classmethod
            def encode_json(cls, content):
                lowered = dict((key.lower(), content[key]) for key in content)
                return json.dumps(lowered)

            def receive(self, content, multiplexer=None, **kwargs):
                self.content_received = content
                self.send({"RESPONSE": "HI"})

        class MyMultiplexer(websockets.WebsocketMultiplexer):
            @classmethod
            def encode_json(cls, content):
                lowered = dict((key.lower(), content[key]) for key in content)
                return json.dumps(lowered)

        with apply_routes([route_class(WebsocketConsumer, path='/path')]):
            client = HttpClient()

            consumer = client.send_and_consume('websocket.receive', path='/path', text={"key": "value"})
            self.assertEqual(consumer.content_received, {"KEY": "value"})

            self.assertEqual(client.receive(), {"response": "HI"})

            client.join_group('test_group')
            WebsocketConsumer.group_send('test_group', {"KEY": "VALUE"})
            self.assertEqual(client.receive(), {"key": "VALUE"})
Example #2
0
    def test_trigger_outbound_create_non_auto_pk(self):
        class TestBinding(WebsocketBinding):
            model = models.TestUUIDModel
            stream = 'test'
            fields = ['name']

            @classmethod
            def group_names(cls, instance):
                return ["testuuidmodels"]

            def has_permission(self, user, action, pk):
                return True

        client = HttpClient()
        client.join_group('testuuidmodels')

        instance = models.TestUUIDModel.objects.create(name='testname')

        received = client.receive()
        self.assertTrue('payload' in received)
        self.assertTrue('action' in received['payload'])
        self.assertTrue('data' in received['payload'])
        self.assertTrue('name' in received['payload']['data'])
        self.assertTrue('model' in received['payload'])
        self.assertTrue('pk' in received['payload'])

        self.assertEqual(received['payload']['action'], 'create')
        self.assertEqual(received['payload']['model'], 'tests.testuuidmodel')
        self.assertEqual(received['payload']['pk'], str(instance.pk))

        self.assertEqual(received['payload']['data']['name'], 'testname')

        received = client.receive()
        self.assertIsNone(received)
Example #3
0
    def test_websocket_custom_json_serialization(self):

        class WebsocketConsumer(websockets.JsonWebsocketConsumer):
            @classmethod
            def decode_json(cls, text):
                obj = json.loads(text)
                return dict((key.upper(), obj[key]) for key in obj)

            @classmethod
            def encode_json(cls, content):
                lowered = dict((key.lower(), content[key]) for key in content)
                return json.dumps(lowered)

            def receive(self, content, multiplexer=None, **kwargs):
                self.content_received = content
                self.send({"RESPONSE": "HI"})

        class MyMultiplexer(websockets.WebsocketMultiplexer):
            @classmethod
            def encode_json(cls, content):
                lowered = dict((key.lower(), content[key]) for key in content)
                return json.dumps(lowered)

        with apply_routes([route_class(WebsocketConsumer, path='/path')]):
            client = HttpClient()

            consumer = client.send_and_consume('websocket.receive', path='/path', text={"key": "value"})
            self.assertEqual(consumer.content_received, {"KEY": "value"})

            self.assertEqual(client.receive(), {"response": "HI"})

            client.join_group('test_group')
            WebsocketConsumer.group_send('test_group', {"KEY": "VALUE"})
            self.assertEqual(client.receive(), {"key": "VALUE"})
Example #4
0
    def test_trigger_outbound_create_non_auto_pk(self):

        class TestBinding(WebsocketBinding):
            model = models.TestUUIDModel
            stream = 'test'
            fields = ['name']

            @classmethod
            def group_names(cls, instance):
                return ["testuuidmodels"]

            def has_permission(self, user, action, pk):
                return True

        client = HttpClient()
        client.join_group('testuuidmodels')

        instance = models.TestUUIDModel.objects.create(name='testname')

        received = client.receive()
        self.assertTrue('payload' in received)
        self.assertTrue('action' in received['payload'])
        self.assertTrue('data' in received['payload'])
        self.assertTrue('name' in received['payload']['data'])
        self.assertTrue('model' in received['payload'])
        self.assertTrue('pk' in received['payload'])

        self.assertEqual(received['payload']['action'], 'create')
        self.assertEqual(received['payload']['model'], 'tests.testuuidmodel')
        self.assertEqual(received['payload']['pk'], str(instance.pk))

        self.assertEqual(received['payload']['data']['name'], 'testname')

        received = client.receive()
        self.assertIsNone(received)
Example #5
0
    def test_trigger_outbound_update(self):
        class TestBinding(WebsocketBinding):
            model = User
            stream = 'test'
            fields = ['__all__']

            @classmethod
            def group_names(cls, instance):
                return ["users2"]

            def has_permission(self, user, action, pk):
                return True

        # Make model and clear out pending sends
        user = User.objects.create(username='******', email='*****@*****.**')

        client = HttpClient()
        client.join_group('users2')

        user.username = '******'
        user.save()

        received = client.receive()
        self.assertTrue('payload' in received)
        self.assertTrue('action' in received['payload'])
        self.assertTrue('data' in received['payload'])
        self.assertTrue('username' in received['payload']['data'])
        self.assertTrue('email' in received['payload']['data'])
        self.assertTrue('password' in received['payload']['data'])
        self.assertTrue('last_name' in received['payload']['data'])
        self.assertTrue('model' in received['payload'])
        self.assertTrue('pk' in received['payload'])

        self.assertEqual(received['payload']['action'], 'update')
        self.assertEqual(received['payload']['model'], 'auth.user')
        self.assertEqual(received['payload']['pk'], user.pk)

        self.assertEqual(received['payload']['data']['email'], '*****@*****.**')
        self.assertEqual(received['payload']['data']['username'], 'test_new')
        self.assertEqual(received['payload']['data']['password'], '')
        self.assertEqual(received['payload']['data']['last_name'], '')

        received = client.receive()
        self.assertIsNone(received)
Example #6
0
    def test_trigger_outbound_update(self):
        class TestBinding(WebsocketBinding):
            model = User
            stream = 'test'
            fields = ['__all__']

            @classmethod
            def group_names(cls, instance):
                return ["users2"]

            def has_permission(self, user, action, pk):
                return True

        # Make model and clear out pending sends
        user = User.objects.create(username='******', email='*****@*****.**')

        client = HttpClient()
        client.join_group('users2')

        user.username = '******'
        user.save()

        received = client.receive()
        self.assertTrue('payload' in received)
        self.assertTrue('action' in received['payload'])
        self.assertTrue('data' in received['payload'])
        self.assertTrue('username' in received['payload']['data'])
        self.assertTrue('email' in received['payload']['data'])
        self.assertTrue('password' in received['payload']['data'])
        self.assertTrue('last_name' in received['payload']['data'])
        self.assertTrue('model' in received['payload'])
        self.assertTrue('pk' in received['payload'])

        self.assertEqual(received['payload']['action'], 'update')
        self.assertEqual(received['payload']['model'], 'auth.user')
        self.assertEqual(received['payload']['pk'], user.pk)

        self.assertEqual(received['payload']['data']['email'], '*****@*****.**')
        self.assertEqual(received['payload']['data']['username'], 'test_new')
        self.assertEqual(received['payload']['data']['password'], '')
        self.assertEqual(received['payload']['data']['last_name'], '')

        received = client.receive()
        self.assertIsNone(received)
Example #7
0
    def test_trigger_outbound_create_exclude(self):
        class TestBinding(WebsocketBinding):
            model = User
            stream = 'test'
            exclude = ['first_name', 'last_name']

            @classmethod
            def group_names(cls, instance):
                return ["users_exclude"]

            def has_permission(self, user, action, pk):
                return True

        with apply_routes([route('test', TestBinding.consumer)]):
            client = HttpClient()
            client.join_group('users_exclude')

            user = User.objects.create(username='******', email='*****@*****.**')
            received = client.receive()

            self.assertTrue('payload' in received)
            self.assertTrue('action' in received['payload'])
            self.assertTrue('data' in received['payload'])
            self.assertTrue('username' in received['payload']['data'])
            self.assertTrue('email' in received['payload']['data'])
            self.assertTrue('password' in received['payload']['data'])
            self.assertTrue('model' in received['payload'])
            self.assertTrue('pk' in received['payload'])

            self.assertFalse('last_name' in received['payload']['data'])
            self.assertFalse('first_name' in received['payload']['data'])

            self.assertEqual(received['payload']['action'], 'create')
            self.assertEqual(received['payload']['model'], 'auth.user')
            self.assertEqual(received['payload']['pk'], user.pk)

            self.assertEqual(received['payload']['data']['email'],
                             '*****@*****.**')
            self.assertEqual(received['payload']['data']['username'], 'test')
            self.assertEqual(received['payload']['data']['password'], '')

            received = client.receive()
            self.assertIsNone(received)
Example #8
0
    def test_trigger_outbound_create_exclude(self):
        class TestBinding(WebsocketBinding):
            model = User
            stream = 'test'
            exclude = ['first_name', 'last_name']

            @classmethod
            def group_names(cls, instance):
                return ["users_exclude"]

            def has_permission(self, user, action, pk):
                return True

        with apply_routes([route('test', TestBinding.consumer)]):
            client = HttpClient()
            client.join_group('users_exclude')

            user = User.objects.create(username='******', email='*****@*****.**')
            received = client.receive()

            self.assertTrue('payload' in received)
            self.assertTrue('action' in received['payload'])
            self.assertTrue('data' in received['payload'])
            self.assertTrue('username' in received['payload']['data'])
            self.assertTrue('email' in received['payload']['data'])
            self.assertTrue('password' in received['payload']['data'])
            self.assertTrue('model' in received['payload'])
            self.assertTrue('pk' in received['payload'])

            self.assertFalse('last_name' in received['payload']['data'])
            self.assertFalse('first_name' in received['payload']['data'])

            self.assertEqual(received['payload']['action'], 'create')
            self.assertEqual(received['payload']['model'], 'auth.user')
            self.assertEqual(received['payload']['pk'], user.pk)

            self.assertEqual(received['payload']['data']['email'], '*****@*****.**')
            self.assertEqual(received['payload']['data']['username'], 'test')
            self.assertEqual(received['payload']['data']['password'], '')

            received = client.receive()
            self.assertIsNone(received)
Example #9
0
class WebSocketTests(ChannelTestCase):
    def setUp(self):
        self.client = HttpClient()

    def test_creating_new_todo_items_in_public_todo_list_send_notification(
            self):
        todo_list = TodoList.objects.create(title="Products")

        self.client.send_and_consume(
            'websocket.connect',
            path='/api/ws/',
            content={'query_string': 'todo_list={}'.format(str(todo_list.id))},
        )

        TodoItem.objects.create(title="test_item", todo_list=todo_list)

        received = self.client.receive()

        self.assertNotEquals(received, None)

    def test_can_subscribe_to_read_only_todo_list(self):
        todo_list = TodoList.objects.create(title="Products",
                                            mode=TodoList.ALLOW_READ)

        self.client.send_and_consume(
            'websocket.connect',
            path='/api/ws/',
            content={'query_string': 'todo_list={}'.format(str(todo_list.id))},
        )

        TodoItem.objects.create(title="test_item", todo_list=todo_list)

        received = self.client.receive()
        self.assertNotEquals(received, None)

    def test_cant_subscribe_to_private_todo_list(self):
        todo_list = TodoList.objects.create(title="Products",
                                            mode=TodoList.PRIVATE)

        self.client.send_and_consume(
            'websocket.connect',
            path='/api/ws/',
            content={'query_string': 'todo_list={}'.format(str(todo_list.id))},
        )

        TodoItem.objects.create(title="test_item", todo_list=todo_list)

        received = self.client.receive()
        self.assertEquals(received, None)

    def test_cant_add_new_todo_item_by_ws(self):
        todo_list = TodoList.objects.create(title="Products")
        self.client.join_group(str(todo_list.id))

        payload = {
            'stream': 'todo_item',
            'payload': {
                'data': {
                    'title': 'test_item',
                    'todo_list': str(todo_list.id)
                },
                'action': 'create',
            }
        }

        self.client.send_and_consume('websocket.receive',
                                     path='/api/ws/',
                                     text=payload)

        self.assertEqual(TodoItem.objects.count(), 0)

    def test_todo_lists_have_separated_notifications(self):
        todo_list1 = TodoList.objects.create(title="Homework")
        todo_list2 = TodoList.objects.create(title="Products")

        # connect to todo_list1
        self.client.join_group(str(todo_list1.id))
        TodoItem.objects.create(title="brush teeth", todo_list=todo_list1)

        # get messages from todo_list1
        received = self.client.receive()
        self.assertNotEquals(received, None)

        # not get messages from todo_list2
        TodoItem.objects.create(title="milk", todo_list=todo_list2)
        received = self.client.receive()
        self.assertEquals(received, None)

    def test_if_not_connected_to_todo_list_not_get_notifications(self):
        todo_list = TodoList.objects.create(title="Products")

        self.client.send_and_consume('websocket.connect', path='/api/ws/')
        TodoItem.objects.create(title="test_item", todo_list=todo_list)

        received = self.client.receive()
        self.assertEquals(received, None)

    def test_get_notification_from_watched_not_private_todo_lists_and_own_private(
            self):
        user = UserModel.objects.create(username='******')
        todo_list_private_own = TodoList.objects.create(title="Private own",
                                                        mode=TodoList.PRIVATE,
                                                        owner=user)
        todo_list_private = TodoList.objects.create(title="Private",
                                                    mode=TodoList.PRIVATE)
        todo_list_read_only = TodoList.objects.create(title="Read only",
                                                      mode=TodoList.ALLOW_READ)
        todo_list_public = TodoList.objects.create(
            title="Public", mode=TodoList.ALLOW_FULL_ACCESS)

        [
            Watch.objects.create(user=user, todo_list=todo_list)
            for todo_list in TodoList.objects.all()
        ]

        self.client.force_login(user)
        self.client.send_and_consume('websocket.connect', path='/api/ws/')

        TodoItem.objects.create(title="test_item1",
                                todo_list=todo_list_private_own)
        received = self.client.receive()
        self.assertNotEquals(received, None)

        TodoItem.objects.create(title="test_item2",
                                todo_list=todo_list_private)
        received = self.client.receive()
        self.assertEquals(received, None)

        TodoItem.objects.create(title="test_item3",
                                todo_list=todo_list_read_only)
        received = self.client.receive()
        self.assertNotEquals(received, None)

        TodoItem.objects.create(title="test_item4", todo_list=todo_list_public)
        received = self.client.receive()
        self.assertNotEquals(received, None)