mirror of
https://github.com/django/daphne.git
synced 2025-04-20 08:42:18 +03:00
commit
fab6bd0536
|
@ -21,7 +21,7 @@ class BindingMetaclass(type):
|
|||
if bases != (object, ):
|
||||
cls.binding_classes.append(klass)
|
||||
if cls.register_immediately:
|
||||
cls.register()
|
||||
klass.register()
|
||||
return klass
|
||||
|
||||
@classmethod
|
||||
|
|
|
@ -7,6 +7,7 @@ from functools import wraps
|
|||
|
||||
from django.test.testcases import TestCase
|
||||
from .. import DEFAULT_CHANNEL_LAYER
|
||||
from ..channel import Group
|
||||
from ..routing import Router, include
|
||||
from ..asgi import channel_layers, ChannelLayerWrapper
|
||||
from ..message import Message
|
||||
|
@ -133,6 +134,9 @@ class Client(object):
|
|||
if message:
|
||||
return message.content
|
||||
|
||||
def join_group(self, group_name):
|
||||
Group(group_name).add(self.reply_channel)
|
||||
|
||||
|
||||
class apply_routes(object):
|
||||
"""
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
|
||||
import json
|
||||
import copy
|
||||
|
||||
from django.apps import apps
|
||||
|
@ -56,7 +56,12 @@ class HttpClient(Client):
|
|||
self._session = session_for_reply_channel(self.reply_channel)
|
||||
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.
|
||||
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('path', path)
|
||||
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)
|
||||
|
||||
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