Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/tests/units/toolkit/router.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/units/toolkit/router.py')
-rwxr-xr-xtests/units/toolkit/router.py90
1 files changed, 89 insertions, 1 deletions
diff --git a/tests/units/toolkit/router.py b/tests/units/toolkit/router.py
index b970a90..ad90cf5 100755
--- a/tests/units/toolkit/router.py
+++ b/tests/units/toolkit/router.py
@@ -10,7 +10,7 @@ from __init__ import tests, src_root
from sugar_network import db
from sugar_network.toolkit.router import Blob, Router, Request, _parse_accept_language, route, fallbackroute, preroute, postroute, _filename
-from sugar_network.toolkit import default_lang, http
+from sugar_network.toolkit import default_lang, http, coroutine
class RouterTest(tests.Test):
@@ -1266,6 +1266,94 @@ class RouterTest(tests.Test):
],
response)
+ def test_EventStream(self):
+
+ class Routes(object):
+
+ @route('GET', mime_type='text/event-stream')
+ def get(self):
+ yield None
+ yield 0
+ yield -1
+ yield '2'
+ yield {'3': 4}
+
+ reply = Router(Routes())({
+ 'PATH_INFO': '/',
+ 'REQUEST_METHOD': 'GET',
+ },
+ lambda status, headers: None)
+
+ self.assertEqual([
+ 'data: null\n\n',
+ 'data: 0\n\n',
+ 'data: -1\n\n',
+ 'data: "2"\n\n',
+ 'data: {"3": 4}\n\n',
+ ],
+ [i for i in reply])
+
+ def test_SpawnEventStream(self):
+ events = []
+
+ class Routes(object):
+
+ @route('GET', [None, None, None], cmd='cmd', mime_type='text/event-stream')
+ def ok(self):
+ yield {}
+ yield {'foo': 'bar'}
+
+ def broadcast(self, event):
+ events.append(event.copy())
+
+ reply = Router(Routes(), allow_spawn=True)({
+ 'PATH_INFO': '/resource/guid/prop',
+ 'REQUEST_METHOD': 'GET',
+ 'QUERY_STRING': 'cmd=cmd&spawn&arg',
+ },
+ lambda status, headers: None)
+ self.assertEqual([], [i for i in reply])
+
+ coroutine.sleep(.1)
+ self.assertEqual([
+ {'method': 'GET', 'resource': 'resource', 'guid': 'guid', 'prop': 'prop', 'cmd': 'cmd'},
+ {'method': 'GET', 'resource': 'resource', 'guid': 'guid', 'prop': 'prop', 'cmd': 'cmd', 'foo': 'bar'},
+ ],
+ events)
+ del events[:]
+
+ def test_SpawnEventStreamFailure(self):
+ events = []
+
+ class Routes(object):
+
+ @route('GET', mime_type='text/event-stream')
+ def error(self, request):
+ request.session['bar'] = 'foo'
+ yield {}
+ yield {'foo': 'bar'}, {'add': 'on'}
+ raise RuntimeError('error')
+
+ def broadcast(self, event):
+ events.append(event.copy())
+
+ reply = Router(Routes(), allow_spawn=True)({
+ 'PATH_INFO': '/',
+ 'REQUEST_METHOD': 'GET',
+ 'QUERY_STRING': 'spawn',
+ },
+ lambda status, headers: None)
+ self.assertEqual([], [i for i in reply])
+
+ coroutine.sleep(.1)
+ self.assertEqual([
+ {'method': 'GET'},
+ {'method': 'GET', 'foo': 'bar', 'add': 'on'},
+ {'method': 'GET', 'bar': 'foo', 'event': 'failure', 'exception': 'RuntimeError', 'error': 'error'},
+ ],
+ events)
+ del events[:]
+
if __name__ == '__main__':
tests.main()