1
from django.dispatch.dispatcher import *
2
from django.dispatch import dispatcher, robust
1
from django.dispatch import Signal
7
if sys.platform.startswith('java'):
9
"""Run the garbage collector and wait a bit to let it do his work"""
14
def garbage_collect():
17
def receiver_1_arg(val, **kwargs):
12
20
class Callable(object):
13
def __call__(self, a):
21
def __call__(self, val, **kwargs):
24
def a(self, val, **kwargs):
27
a_signal = Signal(providing_args=["val"])
19
29
class DispatcherTests(unittest.TestCase):
20
30
"""Test suite for dispatcher (barely started)"""
23
# track the initial state, since it's possible that others have bleed receivers in
24
self.sendersBack = copy.copy(dispatcher.sendersBack)
25
self.connections = copy.copy(dispatcher.connections)
26
self.senders = copy.copy(dispatcher.senders)
28
def _testIsClean(self):
32
def _testIsClean(self, signal):
29
33
"""Assert that everything has been cleaned up automatically"""
30
self.assertEqual(dispatcher.sendersBack, self.sendersBack)
31
self.assertEqual(dispatcher.connections, self.connections)
32
self.assertEqual(dispatcher.senders, self.senders)
34
self.assertEqual(signal.receivers, [])
36
# force cleanup just in case
34
39
def testExact(self):
39
result = send('this',a, a=a)
40
self.assertEqual(result, expected)
41
disconnect(x, signal, a)
42
self.assertEqual(list(getAllReceivers(a,signal)), [])
45
def testAnonymousSend(self):
50
result = send(signal,None, a=a)
51
self.assertEqual(result, expected)
53
self.assertEqual(list(getAllReceivers(None,signal)), [])
56
def testAnyRegistration(self):
59
connect(x, signal, Any)
61
result = send('this',object(), a=a)
62
self.assertEqual(result, expected)
63
disconnect(x, signal, Any)
65
result = send('this',object(), a=a)
66
self.assertEqual(result, expected)
67
self.assertEqual(list(getAllReceivers(Any,signal)), [])
71
def testAnyRegistration2(self):
76
result = send('this',a, a=a)
77
self.assertEqual(result, expected)
79
self.assertEqual(list(getAllReceivers(a,Any)), [])
40
a_signal.connect(receiver_1_arg, sender=self)
41
expected = [(receiver_1_arg,"test")]
42
result = a_signal.send(sender=self, val="test")
43
self.assertEqual(result, expected)
44
a_signal.disconnect(receiver_1_arg, sender=self)
45
self._testIsClean(a_signal)
47
def testIgnoredSender(self):
48
a_signal.connect(receiver_1_arg)
49
expected = [(receiver_1_arg,"test")]
50
result = a_signal.send(sender=self, val="test")
51
self.assertEqual(result, expected)
52
a_signal.disconnect(receiver_1_arg)
53
self._testIsClean(a_signal)
82
55
def testGarbageCollected(self):
86
connect(a.a, signal, b)
89
result = send('this',b, a=b)
90
self.assertEqual(result, expected)
91
self.assertEqual(list(getAllReceivers(b,signal)), [])
94
def testGarbageCollectedObj(self):
96
def __call__(self, a):
101
connect(a, signal, b)
104
result = send('this',b, a=b)
105
self.assertEqual(result, expected)
106
self.assertEqual(list(getAllReceivers(b,signal)), [])
57
a_signal.connect(a.a, sender=self)
61
result = a_signal.send(sender=self, val="test")
62
self.assertEqual(result, expected)
63
self._testIsClean(a_signal)
110
65
def testMultipleRegistration(self):
114
connect(a, signal, b)
115
connect(a, signal, b)
116
connect(a, signal, b)
117
connect(a, signal, b)
118
connect(a, signal, b)
119
connect(a, signal, b)
120
result = send('this',b, a=b)
73
result = a_signal.send(sender=self, val="test")
121
74
self.assertEqual(len(result), 1)
122
self.assertEqual(len(list(getAllReceivers(b,signal))), 1)
75
self.assertEqual(len(a_signal.receivers), 1)
79
self._testIsClean(a_signal)
81
def testUidRegistration(self):
82
def uid_based_receiver_1(**kwargs):
85
def uid_based_receiver_2(**kwargs):
88
a_signal.connect(uid_based_receiver_1, dispatch_uid = "uid")
89
a_signal.connect(uid_based_receiver_2, dispatch_uid = "uid")
90
self.assertEqual(len(a_signal.receivers), 1)
91
a_signal.disconnect(dispatch_uid = "uid")
92
self._testIsClean(a_signal)
128
94
def testRobust(self):
129
95
"""Test the sendRobust function"""
96
def fails(val, **kwargs):
131
97
raise ValueError('this')
134
connect(fails, Any, a)
135
result = robust.sendRobust('this',a, a=a)
98
a_signal.connect(fails)
99
result = a_signal.send_robust(sender=self, val="test")
136
100
err = result[0][1]
137
101
self.assert_(isinstance(err, ValueError))
138
102
self.assertEqual(err.args, ('this',))
103
a_signal.disconnect(fails)
104
self._testIsClean(a_signal)
141
107
return unittest.makeSuite(DispatcherTests,'test')
143
109
if __name__ == "__main__":