class DisableEnableRoutingTests(TestCase): 'tests for (disable|enable)_routing' def setUp(self): self.router = Router() def test_disable_routing(self): 'disable routing disables routing' a = lambda x: x a.__name__ = 'a' node = self.router.node(['x'])(a) watcher = get_named_mock('watcher') self.router.node(['n'], 'a')(watcher) self.router.disable_routing() node(n=1) self.assertEqual(0, watcher.call_count) def test_enable_routing(self): 'enable routing re-enables routing' a = lambda x: x a.__name__ = 'a' node = self.router.node(['x'])(a) watcher = get_named_mock('watcher') self.router.node(['n'], 'a')(watcher) self.router.disable_routing() node(n=1) self.assertEqual(0, watcher.call_count) self.router.enable_routing() node(n=1) self.assertEqual(1, watcher.call_count)
def test_runs_ruby(self): 'running ruby example works' r = Router() rb_node = r.node(['n'])(SampleRubyNode()) self.assertEqual( ( {'n': 0}, {'n': 1}, {'n': 2}, {'n': 3}, {'n': 4} ), rb_node(count=5) )
def test_runs_ruby(self): 'running ruby example works' r = Router() rb_node = r.node(['n'])(SampleRubyNode()) self.assertEqual(({ 'n': 0 }, { 'n': 1 }, { 'n': 2 }, { 'n': 3 }, { 'n': 4 }), rb_node(count=5))
class RouterTests(TestCase): def setUp(self): self.router = Router() # node def test_node_adds_routes(self): 'router adds routes for node when decorating' a = lambda x: x a.__name__ = 'a' b = lambda x: x b.__name__ = 'b' fields = ('field_a', 'field_b') self.router.node(fields)(a) self.router.node(fields, prefix('a'))(b) self.assertEqual( {prefix('a'): set([prefix('b')])}, self.router.routes ) def test_node_adds_fields(self): 'router adds fields when decorating' a = lambda x: x a.__name__ = 'a' self.router.node(['a', 'b', 'c'])(a) self.assertEqual( ['a', 'b', 'c'], self.router.fields[prefix('a')] ) # calling def test_calling_returns_single(self): 'calling a function that returns explicitly wraps the value' @self.router.node(['sum', 'x', 'y']) def add(msg): return msg.x + msg.y, msg.x, msg.y self.assertEqual( {'sum': 3, 'x': 1, 'y': 2}, add(x=1, y=2) ) def test_calling_returns_multiple(self): 'calling a function that yields returns multiple results' @self.router.node(['combination']) def suffixes(msg): for suf in msg.sufs: yield msg.pre + suf self.assertEqual( ( {'combination': 'stuffy'}, {'combination': 'stuffier'}, {'combination': 'stuffiest'} ), suffixes(pre='stuff', sufs=['y', 'ier', 'iest']) ) def test_routing(self): 'calling a function will route to subscribed functions' n = 5 squares = [i * i for i in range(n)] returned_squares = [] doubles = [i * 2 for i in range(n)] returned_doubles = [] @self.router.node(['i']) def yield_n(msg): for i in range(msg.to): yield i @self.router.node(['squared'], [prefix('yield_n')]) def square(msg): returned_squares.append(msg.i ** 2) return msg.i ** 2 @self.router.node(['doubled'], [prefix('yield_n')]) def double(msg): returned_doubles.append(msg.i * 2) return msg.i * 2 yield_n(to=n) self.assertEqual(doubles, returned_doubles) self.assertEqual(squares, returned_squares) def test_get_name(self): 'get name gets the __name__ property by default' l = lambda x: x l.__name__ = 'test' self.assertEqual( prefix('test'), self.router.get_name(l) ) def test_custom_message(self): 'sends a custom message type' class CMessage(Message): pass r = Router(message_class=CMessage) @r.node(['x']) def test(x): self.assertTrue(isinstance(x, CMessage)) test(x=1) def test_initial(self): 'registering a function with initial calls it from calling the router' @self.router.node(['x'], entry_point=True) def test(msg): raise RuntimeError('test was called') try: self.assertRaisesRegexp( RuntimeError, 'test was called', self.router, x=1 ) except AttributeError: # python 2.6 self.assertRaises(RuntimeError, self.router, x=1) def test_no_result_generator(self): 'a generator returning NoResult should only pass on non-NoResults' @self.router.node(['n']) def n_generator(msg): for n in range(msg.n): yield n if n % 2 == 0 else NoResult watcher = get_named_mock('watcher') self.router.node(['n'], prefix('n_generator'))(watcher) n_generator(n=6) self.assertEqual(3, watcher.call_count) def test_no_result_single(self): 'a function returning NoResult should only pass on non-NoResults' func = lambda msg: NoResult func.__name__ = 'func' func = self.router.node(['n'])(func) watcher = get_named_mock('watcher') self.router.node(['n'], 'func')(watcher) func(n=1) self.assertEqual(0, watcher.call_count)
class RouterTests(TestCase): def setUp(self): self.router = Router() # node def test_node_adds_routes(self): 'router adds routes for node when decorating' a = lambda x: x a.__name__ = 'a' b = lambda x: x b.__name__ = 'b' fields = ('field_a', 'field_b') self.router.node(fields)(a) self.router.node(fields, prefix('a'))(b) self.assertEqual({prefix('a'): set([prefix('b')])}, self.router.routes) def test_node_adds_fields(self): 'router adds fields when decorating' a = lambda x: x a.__name__ = 'a' self.router.node(['a', 'b', 'c'])(a) self.assertEqual(['a', 'b', 'c'], self.router.fields[prefix('a')]) # calling def test_calling_returns_single(self): 'calling a function that returns explicitly wraps the value' @self.router.node(['sum', 'x', 'y']) def add(msg): return msg.x + msg.y, msg.x, msg.y self.assertEqual({'sum': 3, 'x': 1, 'y': 2}, add(x=1, y=2)) def test_calling_returns_multiple(self): 'calling a function that yields returns multiple results' @self.router.node(['combination']) def suffixes(msg): for suf in msg.sufs: yield msg.pre + suf self.assertEqual(({ 'combination': 'stuffy' }, { 'combination': 'stuffier' }, { 'combination': 'stuffiest' }), suffixes(pre='stuff', sufs=['y', 'ier', 'iest'])) def test_routing(self): 'calling a function will route to subscribed functions' n = 5 squares = [i * i for i in range(n)] returned_squares = [] doubles = [i * 2 for i in range(n)] returned_doubles = [] @self.router.node(['i']) def yield_n(msg): for i in range(msg.to): yield i @self.router.node(['squared'], [prefix('yield_n')]) def square(msg): returned_squares.append(msg.i**2) return msg.i**2 @self.router.node(['doubled'], [prefix('yield_n')]) def double(msg): returned_doubles.append(msg.i * 2) return msg.i * 2 yield_n(to=n) self.assertEqual(doubles, returned_doubles) self.assertEqual(squares, returned_squares) def test_get_name(self): 'get name gets the __name__ property by default' l = lambda x: x l.__name__ = 'test' self.assertEqual(prefix('test'), self.router.get_name(l)) def test_custom_message(self): 'sends a custom message type' class CMessage(Message): pass r = Router(message_class=CMessage) @r.node(['x']) def test(x): self.assertTrue(isinstance(x, CMessage)) test(x=1) def test_initial(self): 'registering a function with initial calls it from calling the router' @self.router.node(['x'], entry_point=True) def test(msg): raise RuntimeError('test was called') try: self.assertRaisesRegexp(RuntimeError, 'test was called', self.router, x=1) except AttributeError: # python 2.6 self.assertRaises(RuntimeError, self.router, x=1) def test_no_result_generator(self): 'a generator returning NoResult should only pass on non-NoResults' @self.router.node(['n']) def n_generator(msg): for n in range(msg.n): yield n if n % 2 == 0 else NoResult watcher = get_named_mock('watcher') self.router.node(['n'], prefix('n_generator'))(watcher) n_generator(n=6) self.assertEqual(3, watcher.call_count) def test_no_result_single(self): 'a function returning NoResult should only pass on non-NoResults' func = lambda msg: NoResult func.__name__ = 'func' func = self.router.node(['n'])(func) watcher = get_named_mock('watcher') self.router.node(['n'], 'func')(watcher) func(n=1) self.assertEqual(0, watcher.call_count)