Merge pull request #267 from Krukov/master

Improvements, fix and tests
This commit is contained in:
Andrew Godwin 2016-07-25 05:07:28 -04:00 committed by GitHub
commit fab6bd0536
4 changed files with 148 additions and 3 deletions

View File

@ -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

View File

@ -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):
"""

View File

@ -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):

View 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)