1
# Copyright (c) 2010, Jeremy Thurgood, Stefano Rivera
2
# Released under terms of the MIT/X/Expat Licence. See COPYING for details.
3
from inspect import stack
5
from twisted.trial import unittest
9
class TestEvent(unittest.TestCase):
10
def _ev(self, source='fakesource', type='testmessage'):
11
return event.Event(source, type)
13
def assertByteStringWarning(self, count=1):
14
"Check that addresponse raised an error about using bytestrings"
15
caller = getattr(self, stack()[1][3])
16
warnings = self.flushWarnings(offendingFunctions=[caller])
17
self.assertEqual(len(warnings), count)
18
for i in range(count):
19
self.assertTrue('byte string' in warnings[i]['message'],
20
'Byte-String response should provoke a warning')
22
def assertListSubstitutionWarning(self, count=1):
23
"Check that addresponse raised an error about substituting lists"
24
caller = getattr(self, stack()[1][3])
25
warnings = self.flushWarnings(offendingFunctions=[caller])
26
self.assertEqual(len(warnings), count)
27
for i in range(count):
28
self.assertTrue('single item or dict' in warnings[i]['message'],
29
'Byte-String response should provoke a warning')
31
def test_empty_event(self):
32
"Events contain some default data."
34
self.assertEqual('fakesource', ev.source)
35
self.assertEqual('testmessage', ev.type)
36
self.assertEqual([], ev.responses)
37
self.assertEqual({}, ev.sender)
38
self.assertEqual(False, ev.processed)
41
"Attibutes and indexed keys are equivalent."
43
self.assertRaises(AttributeError, lambda: ev.foo)
44
self.assertRaises(KeyError, lambda: ev['foo'])
46
self.assertEqual('bar', ev.foo)
47
self.assertEqual('bar', ev['foo'])
48
self.assertRaises(AttributeError, lambda: ev.bar)
49
self.assertRaises(KeyError, lambda: ev['bar'])
51
self.assertEqual('foo', ev.bar)
52
self.assertEqual('foo', ev['bar'])
54
def test_None_response(self):
55
"None is an invalid response."
57
self.assertEqual([], ev.responses)
58
self.assertRaises(Exception, lambda: ev.addresponse(None))
59
self.assertEqual([], ev.responses)
61
def test_str_response(self):
62
"String responses become appropriate structures."
64
self.assertEqual([], ev.responses)
66
self.assertEqual([{'reply': 'foo',
68
'source': 'fakesource',
70
'conflate': True}], ev.responses)
71
self.assertEqual(True, ev.processed)
72
self.assertByteStringWarning()
74
def test_str_response_twice(self):
75
"Two responses are separate."
77
self.assertEqual([], ev.responses)
80
self.assertEqual([{'reply': 'foo',
82
'source': 'fakesource',
87
'source': 'fakesource',
89
'conflate': True}], ev.responses)
90
self.assertEqual(True, ev.processed)
91
self.assertByteStringWarning(2)
93
def test_str_response_unprocessed(self):
94
"Responses don't have to mark the event as processed."
96
self.assertEqual([], ev.responses)
97
ev.addresponse('foo', processed=False)
98
self.assertEqual([{'reply': 'foo',
100
'source': 'fakesource',
102
'conflate': True}], ev.responses)
103
self.assertEqual(False, ev.processed)
104
self.assertByteStringWarning(1)
106
def test_str_response_processed_unprocessed(self):
107
"processed=False doesn't clear the processed flag."
109
self.assertEqual([], ev.responses)
111
ev.addresponse('foo', processed=False)
112
self.assertEqual([{'reply': 'foo',
114
'source': 'fakesource',
116
'conflate': True}], ev.responses)
117
self.assertEqual(True, ev.processed)
118
self.assertByteStringWarning(1)
120
def test_str_response_with_channel(self):
121
"Events from a channel send their responses back there."
124
self.assertEqual([], ev.responses)
125
ev.addresponse('foo')
126
self.assertEqual([{'reply': 'foo',
128
'source': 'fakesource',
130
'conflate': True}], ev.responses)
131
self.assertByteStringWarning(1)
133
def test_unicode_response(self):
134
"Unicode responses behave the same as bytestrings."
136
self.assertEqual([], ev.responses)
137
ev.addresponse(u'foo')
138
self.assertEqual([{'reply': 'foo',
140
'source': 'fakesource',
142
'conflate': True}], ev.responses)
144
def test_unicode_params_response(self):
145
"Responses can contain parameters for dict-string interpolation."
147
self.assertEqual([], ev.responses)
148
ev.addresponse(u'foo %(name)s', {'name': 'bar'})
149
self.assertEqual([{'reply': 'foo bar',
151
'source': 'fakesource',
153
'conflate': True}], ev.responses)
155
def test_unicode_tuple_params_response(self):
156
"Responses can contain parameters for tuple-string interpolation."
158
self.assertEqual([], ev.responses)
159
ev.addresponse(u'foo %s', ('bar',))
160
self.assertEqual([{'reply': 'foo bar',
162
'source': 'fakesource',
164
'conflate': True}], ev.responses)
165
self.assertListSubstitutionWarning()
167
def test_simple_dict_response(self):
168
"Dicts are valid response values."
170
self.assertEqual([], ev.responses)
171
ev.addresponse({'reply': 'foo'})
172
self.assertEqual([{'reply': 'foo',
174
'source': 'fakesource',
176
'conflate': True}], ev.responses)
178
def test_complex_dict_response(self):
179
"Dict responses can override event defaults."
181
self.assertEqual([], ev.responses)
182
ev.addresponse({'reply': 'foo',
183
'target': 'mytarget',
184
'source': 'mysource',
188
self.assertEqual([{'reply': 'foo',
189
'target': 'mytarget',
190
'source': 'mysource',
193
'mykey': 'myvalue'}], ev.responses)
195
def test_str_kwargs_response(self):
196
"Keyword arguments to addresponse override event defaults."
198
self.assertEqual([], ev.responses)
199
ev.addresponse('foo', bar='baz')
200
self.assertEqual([{'reply': 'foo',
202
'source': 'fakesource',
205
'bar': 'baz'}], ev.responses)
206
self.assertByteStringWarning(1)
208
def test_complex_dict_with_kwargs_response(self):
209
"Keyword arguments to addresponse override response dict values."
211
self.assertEqual([], ev.responses)
212
ev.addresponse({'reply': 'r1',
217
ev.addresponse({'reply': 'r1',
227
self.assertEqual([{'reply': 'r1',
236
'conflate': 'c2'}], ev.responses)
238
# vi: set et sta sw=4 ts=4: