From 8a65199bfebd90aec58f66af17506b5cbb16eb7a Mon Sep 17 00:00:00 2001 From: Andrew Godwin Date: Tue, 22 Mar 2016 10:39:27 -0700 Subject: [PATCH] Also normalise include patterns, and add tests for all regex norm --- channels/routing.py | 5 +++- channels/tests/test_routing.py | 54 ++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 1 deletion(-) diff --git a/channels/routing.py b/channels/routing.py index 1593253..e3ff7c2 100644 --- a/channels/routing.py +++ b/channels/routing.py @@ -205,7 +205,10 @@ class Include(object): def __init__(self, routing, **kwargs): self.routing = Router.resolve_routing(routing) - self.prefixes = kwargs + self.prefixes = { + name: Router.normalise_re_arg(value) + for name, value in kwargs.items() + } # Sanity check prefix regexes for name, value in self.prefixes.items(): if not value.startswith("^"): diff --git a/channels/tests/test_routing.py b/channels/tests/test_routing.py index 15c92b9..75d0659 100644 --- a/channels/tests/test_routing.py +++ b/channels/tests/test_routing.py @@ -230,3 +230,57 @@ class RoutingTests(SimpleTestCase): Router([ include("channels.tests.test_routing.chatroom_routing_noprefix", path="^/foobar/"), ]) + + def test_mixed_unicode_bytes(self): + """ + Tests that having the message key be bytes and pattern unicode (or vice-versa) + still works. + """ + # Unicode patterns, byte message + router = Router([ + route("websocket.connect", consumer_1, path="^/foo/"), + include("channels.tests.test_routing.chatroom_routing", path="^/ws/v(?P[0-9]+)"), + ]) + self.assertRoute( + router, + channel="websocket.connect", + content={"path": b"/boom/"}, + consumer=None, + ) + self.assertRoute( + router, + channel="websocket.connect", + content={"path": b"/foo/"}, + consumer=consumer_1, + ) + self.assertRoute( + router, + channel="websocket.connect", + content={"path": b"/ws/v2/chat/django/"}, + consumer=consumer_2, + kwargs={"version": "2", "room": "django"}, + ) + # Byte patterns, unicode message + router = Router([ + route("websocket.connect", consumer_1, path=b"^/foo/"), + include("channels.tests.test_routing.chatroom_routing", path=b"^/ws/v(?P[0-9]+)"), + ]) + self.assertRoute( + router, + channel="websocket.connect", + content={"path": "/boom/"}, + consumer=None, + ) + self.assertRoute( + router, + channel="websocket.connect", + content={"path": "/foo/"}, + consumer=consumer_1, + ) + self.assertRoute( + router, + channel="websocket.connect", + content={"path": "/ws/v2/chat/django/"}, + consumer=consumer_2, + kwargs={"version": "2", "room": "django"}, + )