Ejemplo n.º 1
0
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)
Ejemplo n.º 2
0
    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)
        )
Ejemplo n.º 3
0
    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))
Ejemplo n.º 4
0
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)
Ejemplo n.º 5
0
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)
Ejemplo n.º 6
0
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)