def test_websockets_http_session_and_channel_session(self): class WebsocketConsumer(websockets.WebsocketConsumer): http_user_and_session = True user_model = get_user_model() user = user_model.objects.create_user(username='******', email='*****@*****.**', password='******') client = HttpClient() client.force_login(user) with apply_routes([route_class(WebsocketConsumer, path='/path')]): connect = client.send_and_consume('websocket.connect', {'path': '/path'}) receive = client.send_and_consume('websocket.receive', {'path': '/path'}, text={'key': 'value'}) disconnect = client.send_and_consume('websocket.disconnect', {'path': '/path'}) self.assertEqual( connect.message.http_session.session_key, receive.message.http_session.session_key ) self.assertEqual( connect.message.http_session.session_key, disconnect.message.http_session.session_key )
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)