def test_format_bad_json_data(self): class A: pass data = {'a': 1, 'b': A()} event = SseEvent('ev', data) self.assertEqual(event.format(11), 'id: 11\nevent: ev\ndata: {}\n\n'.format(str(data)))
def test_send_publish_multiple(self): subs = ('a', 'bbb') @self.stream.push('event1') def pusher(a, ev): return {'a': a}, subs, ev result = {sub: [] for sub in subs} def listen(sub): for event in self.stream.send(subchannel=sub): result[sub].append(event) base_args = [('event1', 1), ('event2', 2)] def publish(): for event, data in base_args: pusher(data, event) for sub in subs: self.stream.unsubscribe(sub) sses = {sub: [SseEvent(event, {'a': arg}) for event, arg in base_args] for sub in subs} formatted_sses = {sub: [sse.format(i + 1) for i, sse in enumerate(sse_vals)] for sub, sse_vals in sses.items()} listen_threads = [gevent.spawn(listen, sub) for sub in subs] publish_thread = gevent.spawn(publish) gevent.joinall(listen_threads, timeout=2) publish_thread.join(timeout=2) for sub in subs: self.assertListEqual(result[sub], formatted_sses[sub])
def test_send_with_retry(self): @self.stream.push('event1') def pusher(a, ev, sub): return {'a': a}, sub, ev subs = ('a', 'b') result = {'a': [], 'b': []} def listen(sub): for event in self.stream.send(subchannel=sub, retry=50): result[sub].append(event) base_args = [('event1', 1), ('event2', 2)] args = {sub: [(event, data + i) for (event, data) in base_args] for i, sub in enumerate(subs)} def publish(sub): for event, data in args[sub]: pusher(data, event, sub) self.stream.unsubscribe(sub) sses = {sub: [SseEvent(event, {'a': arg}) for event, arg in args[sub]] for sub in subs} formatted_sses = {sub: [sse.format(i + 1, retry=50) for i, sse in enumerate(sse_vals)] for sub, sse_vals in sses.items()} listen_threads = [gevent.spawn(listen, sub) for sub in subs] publish_threads = [gevent.spawn(publish, sub) for sub in subs] gevent.joinall(listen_threads, timeout=2) gevent.joinall(publish_threads, timeout=2) for sub in subs: self.assertListEqual(result[sub], formatted_sses[sub])
def test_send(self): @self.stream.push('event1') def pusher(a, ev): return {'a': a}, ev result = [] def listen(): for event in self.stream.send(): result.append(event) args = [('event1', 1), ('event2', 2)] sses = [SseEvent(event, {'a': arg}) for event, arg in args] formatted_sses = [sse.format(i + 1) for i, sse in enumerate(sses)] def publish(): for event, data in args: pusher(data, event) self.stream.unsubscribe() thread = gevent.spawn(listen) thread2 = gevent.spawn(publish) thread.start() thread2.start() thread.join(timeout=2) thread2.join(timeout=2) self.assertListEqual(result, formatted_sses)
def test_format_json_data(self): data = {'a': 1, 'b': 2} event = SseEvent('ev', data) self.assertEqual(event.format(11), 'id: 11\nevent: ev\ndata: {}\n\n'.format(json.dumps(data)))
def test_format_with_retry(self): event = SseEvent('ev', 'abc') self.assertEqual(event.format(42, retry=50), 'id: 42\nevent: ev\nretry: 50\ndata: abc\n\n')
def test_format_no_data(self): event = SseEvent('ev2', {}) self.assertEqual(event.format(3), 'id: 3\nevent: ev2\n\n')
def test_format_no_event(self): event = SseEvent('', 123) self.assertEqual(event.format(2), 'id: 2\ndata: 123\n\n')
def test_format(self): event = SseEvent('ev', 'abc') self.assertEqual(event.format(42), 'id: 42\nevent: ev\ndata: abc\n\n')
def test_format_json_data(self): data = {'a': 1, 'b': 2} event = SseEvent('ev', data) self.assertEqual( event.format(11), 'id: 11\nevent: ev\ndata: {}\n\n'.format(json.dumps(data)))
def test_init(self): event = SseEvent('ev', '12345') self.assertEqual(event.event, 'ev') self.assertEqual(event.data, '12345')