mirror of
https://github.com/django/daphne.git
synced 2025-07-11 00:12:18 +03:00
commit
fab6bd0536
|
@ -21,7 +21,7 @@ class BindingMetaclass(type):
|
||||||
if bases != (object, ):
|
if bases != (object, ):
|
||||||
cls.binding_classes.append(klass)
|
cls.binding_classes.append(klass)
|
||||||
if cls.register_immediately:
|
if cls.register_immediately:
|
||||||
cls.register()
|
klass.register()
|
||||||
return klass
|
return klass
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
|
|
|
@ -7,6 +7,7 @@ from functools import wraps
|
||||||
|
|
||||||
from django.test.testcases import TestCase
|
from django.test.testcases import TestCase
|
||||||
from .. import DEFAULT_CHANNEL_LAYER
|
from .. import DEFAULT_CHANNEL_LAYER
|
||||||
|
from ..channel import Group
|
||||||
from ..routing import Router, include
|
from ..routing import Router, include
|
||||||
from ..asgi import channel_layers, ChannelLayerWrapper
|
from ..asgi import channel_layers, ChannelLayerWrapper
|
||||||
from ..message import Message
|
from ..message import Message
|
||||||
|
@ -133,6 +134,9 @@ class Client(object):
|
||||||
if message:
|
if message:
|
||||||
return message.content
|
return message.content
|
||||||
|
|
||||||
|
def join_group(self, group_name):
|
||||||
|
Group(group_name).add(self.reply_channel)
|
||||||
|
|
||||||
|
|
||||||
class apply_routes(object):
|
class apply_routes(object):
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
|
import json
|
||||||
import copy
|
import copy
|
||||||
|
|
||||||
from django.apps import apps
|
from django.apps import apps
|
||||||
|
@ -56,7 +56,12 @@ class HttpClient(Client):
|
||||||
self._session = session_for_reply_channel(self.reply_channel)
|
self._session = session_for_reply_channel(self.reply_channel)
|
||||||
return self._session
|
return self._session
|
||||||
|
|
||||||
def send(self, to, content={}, path='/'):
|
def receive(self):
|
||||||
|
content = super(HttpClient, self).receive()
|
||||||
|
if content:
|
||||||
|
return json.loads(content['text'])
|
||||||
|
|
||||||
|
def send(self, to, text=None, content={}, path='/'):
|
||||||
"""
|
"""
|
||||||
Send a message to a channel.
|
Send a message to a channel.
|
||||||
Adds reply_channel name and channel_session to the message.
|
Adds reply_channel name and channel_session to the message.
|
||||||
|
@ -65,6 +70,9 @@ class HttpClient(Client):
|
||||||
content.setdefault('reply_channel', self.reply_channel)
|
content.setdefault('reply_channel', self.reply_channel)
|
||||||
content.setdefault('path', path)
|
content.setdefault('path', path)
|
||||||
content.setdefault('headers', self.headers)
|
content.setdefault('headers', self.headers)
|
||||||
|
text = text or content.get('text', None)
|
||||||
|
if text:
|
||||||
|
content['text'] = json.dumps(text)
|
||||||
self.channel_layer.send(to, content)
|
self.channel_layer.send(to, content)
|
||||||
|
|
||||||
def login(self, **credentials):
|
def login(self, **credentials):
|
||||||
|
|
133
channels/tests/test_binding.py
Normal file
133
channels/tests/test_binding.py
Normal file
|
@ -0,0 +1,133 @@
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.contrib.auth import get_user_model
|
||||||
|
from channels.binding.websockets import WebsocketBinding
|
||||||
|
from channels.tests import ChannelTestCase, apply_routes, HttpClient
|
||||||
|
from channels import route
|
||||||
|
|
||||||
|
User = get_user_model()
|
||||||
|
|
||||||
|
|
||||||
|
class TestsBinding(ChannelTestCase):
|
||||||
|
|
||||||
|
def test_trigger_outbound_create(self):
|
||||||
|
|
||||||
|
class TestBinding(WebsocketBinding):
|
||||||
|
model = User
|
||||||
|
stream = 'test'
|
||||||
|
fields = ['username', 'email', 'password', 'last_name']
|
||||||
|
|
||||||
|
def group_names(self, instance, action):
|
||||||
|
return ["users"]
|
||||||
|
|
||||||
|
def has_permission(self, user, action, pk):
|
||||||
|
return True
|
||||||
|
|
||||||
|
with apply_routes([route('test', TestBinding.consumer)]):
|
||||||
|
client = HttpClient()
|
||||||
|
client.join_group('users')
|
||||||
|
|
||||||
|
user = User.objects.create(username='test', email='test@test.com')
|
||||||
|
|
||||||
|
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'], 'create')
|
||||||
|
self.assertEqual(received['payload']['model'], 'auth.user')
|
||||||
|
self.assertEqual(received['payload']['pk'], user.pk)
|
||||||
|
|
||||||
|
self.assertEqual(received['payload']['data']['email'], 'test@test.com')
|
||||||
|
self.assertEqual(received['payload']['data']['username'], 'test')
|
||||||
|
self.assertEqual(received['payload']['data']['password'], '')
|
||||||
|
self.assertEqual(received['payload']['data']['last_name'], '')
|
||||||
|
|
||||||
|
received = client.receive()
|
||||||
|
self.assertIsNone(received)
|
||||||
|
|
||||||
|
def test_trigger_outbound_update(self):
|
||||||
|
class TestBinding(WebsocketBinding):
|
||||||
|
model = User
|
||||||
|
stream = 'test'
|
||||||
|
fields = ['__all__']
|
||||||
|
|
||||||
|
def group_names(self, instance, action):
|
||||||
|
return ["users2"]
|
||||||
|
|
||||||
|
def has_permission(self, user, action, pk):
|
||||||
|
return True
|
||||||
|
|
||||||
|
user = User.objects.create(username='test', email='test@test.com')
|
||||||
|
|
||||||
|
with apply_routes([route('test', TestBinding.consumer)]):
|
||||||
|
client = HttpClient()
|
||||||
|
client.join_group('users2')
|
||||||
|
|
||||||
|
user.username = 'test_new'
|
||||||
|
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'], 'test@test.com')
|
||||||
|
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)
|
||||||
|
|
||||||
|
def test_trigger_outbound_delete(self):
|
||||||
|
class TestBinding(WebsocketBinding):
|
||||||
|
model = User
|
||||||
|
stream = 'test'
|
||||||
|
fields = ['username']
|
||||||
|
|
||||||
|
def group_names(self, instance, action):
|
||||||
|
return ["users3"]
|
||||||
|
|
||||||
|
def has_permission(self, user, action, pk):
|
||||||
|
return True
|
||||||
|
|
||||||
|
user = User.objects.create(username='test', email='test@test.com')
|
||||||
|
|
||||||
|
with apply_routes([route('test', TestBinding.consumer)]):
|
||||||
|
client = HttpClient()
|
||||||
|
client.join_group('users3')
|
||||||
|
|
||||||
|
user.delete()
|
||||||
|
|
||||||
|
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('model' in received['payload'])
|
||||||
|
self.assertTrue('pk' in received['payload'])
|
||||||
|
|
||||||
|
self.assertEqual(received['payload']['action'], 'delete')
|
||||||
|
self.assertEqual(received['payload']['model'], 'auth.user')
|
||||||
|
self.assertEqual(received['payload']['pk'], 1)
|
||||||
|
self.assertEqual(received['payload']['data']['username'], 'test')
|
||||||
|
|
||||||
|
received = client.receive()
|
||||||
|
self.assertIsNone(received)
|
Loading…
Reference in New Issue
Block a user