65 lines
1.8 KiB
Python
65 lines
1.8 KiB
Python
from __future__ import print_function, unicode_literals
|
|
|
|
from twisted.internet import reactor
|
|
from twisted.internet.defer import Deferred, inlineCallbacks
|
|
from twisted.internet.task import Clock
|
|
from twisted.trial import unittest
|
|
|
|
import mock
|
|
|
|
from ..eventual import EventualQueue
|
|
|
|
|
|
class IntentionalError(Exception):
|
|
pass
|
|
|
|
|
|
class Eventual(unittest.TestCase, object):
|
|
def test_eventually(self):
|
|
c = Clock()
|
|
eq = EventualQueue(c)
|
|
c1 = mock.Mock()
|
|
eq.eventually(c1, "arg1", "arg2", kwarg1="kw1")
|
|
eq.eventually(c1, "arg3", "arg4", kwarg5="kw5")
|
|
d2 = eq.fire_eventually()
|
|
d3 = eq.fire_eventually("value")
|
|
self.assertEqual(c1.mock_calls, [])
|
|
self.assertNoResult(d2)
|
|
self.assertNoResult(d3)
|
|
|
|
eq.flush_sync()
|
|
self.assertEqual(c1.mock_calls, [
|
|
mock.call("arg1", "arg2", kwarg1="kw1"),
|
|
mock.call("arg3", "arg4", kwarg5="kw5")
|
|
])
|
|
self.assertEqual(self.successResultOf(d2), None)
|
|
self.assertEqual(self.successResultOf(d3), "value")
|
|
|
|
def test_error(self):
|
|
c = Clock()
|
|
eq = EventualQueue(c)
|
|
c1 = mock.Mock(side_effect=IntentionalError)
|
|
eq.eventually(c1, "arg1", "arg2", kwarg1="kw1")
|
|
self.assertEqual(c1.mock_calls, [])
|
|
|
|
eq.flush_sync()
|
|
self.assertEqual(c1.mock_calls,
|
|
[mock.call("arg1", "arg2", kwarg1="kw1")])
|
|
|
|
self.flushLoggedErrors(IntentionalError)
|
|
|
|
@inlineCallbacks
|
|
def test_flush(self):
|
|
eq = EventualQueue(reactor)
|
|
d1 = eq.fire_eventually()
|
|
d2 = Deferred()
|
|
|
|
def _more(res):
|
|
eq.eventually(d2.callback, None)
|
|
|
|
d1.addCallback(_more)
|
|
yield eq.flush()
|
|
# d1 will fire, which will queue d2 to fire, and the flush() ought to
|
|
# wait for d2 too
|
|
self.successResultOf(d2)
|