def setUp(self):
        self.app = Flask(__name__)
        self.menubuilder = MenuBuilder(self.app)
        self.menubuilder.add_menu('main')
        self.menubuilder.add_menu_entry('main', "Root", "root", priority=-1, activewhen=lambda mi: request.path=='/')
        self.menubuilder.add_menu_entry('main', "One", "one", activewhen=lambda mi: request.path=='/one')
        self.menubuilder.add_menu_entry('main', "Two", "two", activewhen=lambda mi: request.path=='/two')
        self.menubuilder.add_menu_entry(
            'main', "Visible under /visible only", "visible",
            activewhen=lambda mi: request.path=='/visible',
            visiblewhen=lambda mi: request.path=='/visible'
        )

        @self.app.route('/')
        def root():
            pass

        @self.app.route('/one')
        def one():
            pass

        @self.app.route('/two')
        def two():
            pass

        @self.app.route('/visible')
        def visible():
            pass
    def setUp(self):
        self.app = Flask(__name__)
        self.menubuilder = MenuBuilder(self.app)
        self.menubuilder.add_menu('main')
        self.menubuilder.add_menu_entry(
            'main',
            "Root",
            "root",
            priority=-1,
            activewhen=lambda mi: request.path == '/')
        self.menubuilder.add_menu_entry(
            'main', "One", "one", activewhen=lambda mi: request.path == '/one')
        self.menubuilder.add_menu_entry(
            'main', "Two", "two", activewhen=lambda mi: request.path == '/two')
        self.menubuilder.add_menu_entry(
            'main',
            "Visible under /visible only",
            "visible",
            activewhen=lambda mi: request.path == '/visible',
            visiblewhen=lambda mi: request.path == '/visible')

        @self.app.route('/')
        def root():
            pass

        @self.app.route('/one')
        def one():
            pass

        @self.app.route('/two')
        def two():
            pass

        @self.app.route('/visible')
        def visible():
            pass
class MenuBuilderTestCase(unittest.TestCase):
    def setUp(self):
        self.app = Flask(__name__)
        self.menubuilder = MenuBuilder(self.app)
        self.menubuilder.add_menu('main')
        self.menubuilder.add_menu_entry(
            'main',
            "Root",
            "root",
            priority=-1,
            activewhen=lambda mi: request.path == '/')
        self.menubuilder.add_menu_entry(
            'main', "One", "one", activewhen=lambda mi: request.path == '/one')
        self.menubuilder.add_menu_entry(
            'main', "Two", "two", activewhen=lambda mi: request.path == '/two')
        self.menubuilder.add_menu_entry(
            'main',
            "Visible under /visible only",
            "visible",
            activewhen=lambda mi: request.path == '/visible',
            visiblewhen=lambda mi: request.path == '/visible')

        @self.app.route('/')
        def root():
            pass

        @self.app.route('/one')
        def one():
            pass

        @self.app.route('/two')
        def two():
            pass

        @self.app.route('/visible')
        def visible():
            pass

    def test_render_ul(self):
        with self.app.test_request_context('/'):
            output = self.menubuilder.render('main')
            self.assertEqual(
                str(output), """\
<ul class="active"><li class="active"><a class="active" href="/">Root</a></li>
<li class="inactive"><a class="inactive" href="/one">One</a></li>
<li class="inactive"><a class="inactive" href="/two">Two</a></li></ul>""")

    def test_render_route_one_active(self):
        with self.app.test_request_context('/one'):
            output = self.menubuilder.render('main')
            self.assertEqual(
                str(output), """\
<ul class="active"><li class="inactive"><a class="inactive" href="/">Root</a></li>
<li class="active"><a class="active" href="/one">One</a></li>
<li class="inactive"><a class="inactive" href="/two">Two</a></li></ul>""")

    def test_render_route_two_active(self):
        with self.app.test_request_context('/two'):
            output = self.menubuilder.render('main')
            self.assertEqual(
                str(output), """\
<ul class="active"><li class="inactive"><a class="inactive" href="/">Root</a></li>
<li class="inactive"><a class="inactive" href="/one">One</a></li>
<li class="active"><a class="active" href="/two">Two</a></li></ul>""")

    def test_visiblewhen(self):
        with self.app.test_request_context('/two'):
            output = self.menubuilder.render('main')
            self.assertEqual(
                str(output), """\
<ul class="active"><li class="inactive"><a class="inactive" href="/">Root</a></li>
<li class="inactive"><a class="inactive" href="/one">One</a></li>
<li class="active"><a class="active" href="/two">Two</a></li></ul>""")

        with self.app.test_request_context('/visible'):
            output = self.menubuilder.render('main')
            self.assertEqual(
                str(output), """\
<ul class="active"><li class="inactive"><a class="inactive" href="/">Root</a></li>
<li class="inactive"><a class="inactive" href="/one">One</a></li>
<li class="inactive"><a class="inactive" href="/two">Two</a></li>
<li class="active"><a class="active" href="/visible">Visible under /visible only</a></li></ul>"""
            )

    def test_duplicate_endpoints_raise_runtimewarning(self):
        self.assertRaises(
            RuntimeWarning,
            lambda: self.menubuilder.add_menu_entry('main', "Root", "root"))

    def test_duplicate_endpoints_raise_runtimeerror_in_debug(self):
        self.menubuilder.app.debug = True
        self.assertRaises(
            RuntimeError,
            lambda: self.menubuilder.add_menu_entry('main', "Root", "root"))

    def test_wrong_menu_item_type_raise_runtimewarning(self):
        class WrongType(object):
            def __init__(self, *args, **kwargs):
                self.endpoint = 'foo'

        self.assertRaises(
            RuntimeWarning,
            lambda: self.menubuilder.add_menu_item('main', WrongType()))

    def test_wrong_menu_item_type_raise_runtimeerror_in_debug(self):
        self.menubuilder.app.debug = True

        class WrongType(object):
            def __init__(self, *args, **kwargs):
                self.endpoint = 'foo'

        self.assertRaises(
            RuntimeError,
            lambda: self.menubuilder.add_menu_item('main', WrongType()))

    def test_render_ul_xhtml(self):
        self.menubuilder.builder = getattr(werkzeug.utils, 'xhtml')
        with self.app.test_request_context('/'):
            output = self.menubuilder.render('main')
            self.assertEqual(
                str(output), """\
<ul class="active"><li class="active"><a class="active" href="/">Root</a></li>
<li class="inactive"><a class="inactive" href="/one">One</a></li>
<li class="inactive"><a class="inactive" href="/two">Two</a></li></ul>""")
class MenuBuilderTestCase(unittest.TestCase):
    def setUp(self):
        self.app = Flask(__name__)
        self.menubuilder = MenuBuilder(self.app)
        self.menubuilder.add_menu('main')
        self.menubuilder.add_menu_entry('main', "Root", "root", priority=-1, activewhen=lambda mi: request.path=='/')
        self.menubuilder.add_menu_entry('main', "One", "one", activewhen=lambda mi: request.path=='/one')
        self.menubuilder.add_menu_entry('main', "Two", "two", activewhen=lambda mi: request.path=='/two')
        self.menubuilder.add_menu_entry(
            'main', "Visible under /visible only", "visible",
            activewhen=lambda mi: request.path=='/visible',
            visiblewhen=lambda mi: request.path=='/visible'
        )

        @self.app.route('/')
        def root():
            pass

        @self.app.route('/one')
        def one():
            pass

        @self.app.route('/two')
        def two():
            pass

        @self.app.route('/visible')
        def visible():
            pass

    def test_render_ul(self):
        with self.app.test_request_context('/'):
            output = self.menubuilder.render('main')
            self.assertEqual(str(output), """\
<ul class="active"><li class="active"><a class="active" href="/">Root</a></li>
<li class="inactive"><a class="inactive" href="/one">One</a></li>
<li class="inactive"><a class="inactive" href="/two">Two</a></li></ul>""")

    def test_render_route_one_active(self):
        with self.app.test_request_context('/one'):
            output = self.menubuilder.render('main')
            self.assertEqual(str(output), """\
<ul class="active"><li class="inactive"><a class="inactive" href="/">Root</a></li>
<li class="active"><a class="active" href="/one">One</a></li>
<li class="inactive"><a class="inactive" href="/two">Two</a></li></ul>""")

    def test_render_route_two_active(self):
        with self.app.test_request_context('/two'):
            output = self.menubuilder.render('main')
            self.assertEqual(str(output), """\
<ul class="active"><li class="inactive"><a class="inactive" href="/">Root</a></li>
<li class="inactive"><a class="inactive" href="/one">One</a></li>
<li class="active"><a class="active" href="/two">Two</a></li></ul>""")

    def test_visiblewhen(self):
        with self.app.test_request_context('/two'):
            output = self.menubuilder.render('main')
            self.assertEqual(str(output), """\
<ul class="active"><li class="inactive"><a class="inactive" href="/">Root</a></li>
<li class="inactive"><a class="inactive" href="/one">One</a></li>
<li class="active"><a class="active" href="/two">Two</a></li></ul>""")

        with self.app.test_request_context('/visible'):
            output = self.menubuilder.render('main')
            self.assertEqual(str(output), """\
<ul class="active"><li class="inactive"><a class="inactive" href="/">Root</a></li>
<li class="inactive"><a class="inactive" href="/one">One</a></li>
<li class="inactive"><a class="inactive" href="/two">Two</a></li>
<li class="active"><a class="active" href="/visible">Visible under /visible only</a></li></ul>""")

    def test_duplicate_endpoints_raise_runtimewarning(self):
        self.assertRaises(
            RuntimeWarning, lambda: self.menubuilder.add_menu_entry('main', "Root", "root")
        )

    def test_duplicate_endpoints_raise_runtimeerror_in_debug(self):
        self.menubuilder.app.debug = True
        self.assertRaises(
            RuntimeError, lambda: self.menubuilder.add_menu_entry('main', "Root", "root")
        )

    def test_wrong_menu_item_type_raise_runtimewarning(self):
        class WrongType(object):
            def __init__(self, *args, **kwargs):
                self.endpoint = 'foo'
        self.assertRaises(RuntimeWarning, lambda: self.menubuilder.add_menu_item('main', WrongType()))

    def test_wrong_menu_item_type_raise_runtimeerror_in_debug(self):
        self.menubuilder.app.debug = True
        class WrongType(object):
            def __init__(self, *args, **kwargs):
                self.endpoint = 'foo'
        self.assertRaises(RuntimeError, lambda: self.menubuilder.add_menu_item('main', WrongType()))

    def test_render_ul_xhtml(self):
        self.menubuilder.builder = getattr(werkzeug.utils, 'xhtml')
        with self.app.test_request_context('/'):
            output = self.menubuilder.render('main')
            self.assertEqual(str(output), """\
<ul class="active"><li class="active"><a class="active" href="/">Root</a></li>
<li class="inactive"><a class="inactive" href="/one">One</a></li>
<li class="inactive"><a class="inactive" href="/two">Two</a></li></ul>""")
 def setUp(self):
     self.menubuilder = MenuBuilder()
class MenuItemTestCase(unittest.TestCase):
    def setUp(self):
        self.menubuilder = MenuBuilder()

    def test_sorting_by_priority(self):
        menu_entries = []
        for n in range(0, 5):
            menu_entries.append(MenuItem(n, '', priority=n))
        self.assertEqual(
            str(sorted(menu_entries)),
            '[<MenuItem title="0" endpoint="" priority=0>, '
            '<MenuItem title="1" endpoint="" priority=1>, '
            '<MenuItem title="2" endpoint="" priority=2>, '
            '<MenuItem title="3" endpoint="" priority=3>, '
            '<MenuItem title="4" endpoint="" priority=4>]'
        )

    def test_sorting_by_title(self):
        menu_entries = []
        for n in sorted(range(0, 5), reverse=True):
            menu_entries.append(MenuItem(n, ''))
        menu_entries.append(MenuItem(5, '', priority=-1))

        self.assertEqual(
            str(sorted(menu_entries)),
            '[<MenuItem title="5" endpoint="" priority=-1>, '
            '<MenuItem title="0" endpoint="" priority=0>, '
            '<MenuItem title="1" endpoint="" priority=0>, '
            '<MenuItem title="2" endpoint="" priority=0>, '
            '<MenuItem title="3" endpoint="" priority=0>, '
            '<MenuItem title="4" endpoint="" priority=0>]'
        )

    def test_sorting_by_priority_then_title(self):
        menu_entries = []
        for n in sorted(range(0, 5), reverse=True):
            menu_entries.append(MenuItem(n, '', priority=n))
            menu_entries.append(MenuItem(n, '', priority=n*-1))
            for nn in sorted(range(n*2, n*3), reverse=True):
                menu_entries.append(MenuItem(n*nn, '', priority=n))
                menu_entries.append(MenuItem(n*nn, '', priority=n*-1))

        self.assertEqual(
            str(sorted(menu_entries)),
            '[<MenuItem title="4" endpoint="" priority=-4>, '
            '<MenuItem title="32" endpoint="" priority=-4>, '
            '<MenuItem title="36" endpoint="" priority=-4>, '
            '<MenuItem title="40" endpoint="" priority=-4>, '
            '<MenuItem title="44" endpoint="" priority=-4>, '
            '<MenuItem title="3" endpoint="" priority=-3>, '
            '<MenuItem title="18" endpoint="" priority=-3>, '
            '<MenuItem title="21" endpoint="" priority=-3>, '
            '<MenuItem title="24" endpoint="" priority=-3>, '
            '<MenuItem title="2" endpoint="" priority=-2>, '
            '<MenuItem title="8" endpoint="" priority=-2>, '
            '<MenuItem title="10" endpoint="" priority=-2>, '
            '<MenuItem title="1" endpoint="" priority=-1>, '
            '<MenuItem title="2" endpoint="" priority=-1>, '
            '<MenuItem title="0" endpoint="" priority=0>, '
            '<MenuItem title="0" endpoint="" priority=0>, '
            '<MenuItem title="1" endpoint="" priority=1>, '
            '<MenuItem title="2" endpoint="" priority=1>, '
            '<MenuItem title="2" endpoint="" priority=2>, '
            '<MenuItem title="8" endpoint="" priority=2>, '
            '<MenuItem title="10" endpoint="" priority=2>, '
            '<MenuItem title="3" endpoint="" priority=3>, '
            '<MenuItem title="18" endpoint="" priority=3>, '
            '<MenuItem title="21" endpoint="" priority=3>, '
            '<MenuItem title="24" endpoint="" priority=3>, '
            '<MenuItem title="4" endpoint="" priority=4>, '
            '<MenuItem title="32" endpoint="" priority=4>, '
            '<MenuItem title="36" endpoint="" priority=4>, '
            '<MenuItem title="40" endpoint="" priority=4>, '
            '<MenuItem title="44" endpoint="" priority=4>]'
        )

    def test_render(self):
        menu_entries = []
        true = lambda: True
        false = lambda: False
        for n in sorted(range(0, 5), reverse=True):
            menu_entries.append(MenuItem(n, 'root'))
        menu_entries.append(MenuItem(5, 'root', priority=-1))
        app = Flask(__name__)
        self.menubuilder.init_app(app)

        @app.route('/')
        def root():
            pass

        output = ''
        with app.test_request_context('/'):
            for entry in sorted(menu_entries):
                entry.builder = app.menubuilder.builder
                output += entry.render() + '\n'
        self.assertEqual(output, """<li class="active"><a class="active" href="/">5</a></li>
<li class="active"><a class="active" href="/">0</a></li>
<li class="active"><a class="active" href="/">1</a></li>
<li class="active"><a class="active" href="/">2</a></li>
<li class="active"><a class="active" href="/">3</a></li>
<li class="active"><a class="active" href="/">4</a></li>
""")

    def test_render_some_active(self):
        menu_entries = []
        true = lambda mi: True
        false = lambda mi: False
        for n in sorted(range(0, 5), reverse=True):
            menu_entries.append(MenuItem(n, 'root', activewhen=(n%2 and true or false)))
        menu_entries.append(MenuItem(5, 'root', priority=-1, activewhen=(n%2 and true or false)))
        app = Flask(__name__)
        self.menubuilder.init_app(app)

        @app.route('/')
        def root():
            pass

        output = ''
        with app.test_request_context('/'):
            for entry in sorted(menu_entries):
                entry.builder = app.menubuilder.builder
                output += entry.render() + '\n'
        self.assertEqual(output, """<li class="inactive"><a class="inactive" href="/">5</a></li>
<li class="inactive"><a class="inactive" href="/">0</a></li>
<li class="active"><a class="active" href="/">1</a></li>
<li class="inactive"><a class="inactive" href="/">2</a></li>
<li class="active"><a class="active" href="/">3</a></li>
<li class="inactive"><a class="inactive" href="/">4</a></li>
""")
Beispiel #7
0
 def setUp(self):
     self.menubuilder = MenuBuilder()
Beispiel #8
0
class MenuItemTestCase(unittest.TestCase):
    def setUp(self):
        self.menubuilder = MenuBuilder()

    def test_sorting_by_priority(self):
        menu_entries = []
        for n in range(0, 5):
            menu_entries.append(MenuItem(n, '', priority=n))
        self.assertEqual(
            str(sorted(menu_entries)),
            '[<MenuItem title="0" endpoint="" priority=0>, '
            '<MenuItem title="1" endpoint="" priority=1>, '
            '<MenuItem title="2" endpoint="" priority=2>, '
            '<MenuItem title="3" endpoint="" priority=3>, '
            '<MenuItem title="4" endpoint="" priority=4>]')

    def test_sorting_by_title(self):
        menu_entries = []
        for n in sorted(range(0, 5), reverse=True):
            menu_entries.append(MenuItem(n, ''))
        menu_entries.append(MenuItem(5, '', priority=-1))

        self.assertEqual(
            str(sorted(menu_entries)),
            '[<MenuItem title="5" endpoint="" priority=-1>, '
            '<MenuItem title="0" endpoint="" priority=0>, '
            '<MenuItem title="1" endpoint="" priority=0>, '
            '<MenuItem title="2" endpoint="" priority=0>, '
            '<MenuItem title="3" endpoint="" priority=0>, '
            '<MenuItem title="4" endpoint="" priority=0>]')

    def test_sorting_by_priority_then_title(self):
        menu_entries = []
        for n in sorted(range(0, 5), reverse=True):
            menu_entries.append(MenuItem(n, '', priority=n))
            menu_entries.append(MenuItem(n, '', priority=n * -1))
            for nn in sorted(range(n * 2, n * 3), reverse=True):
                menu_entries.append(MenuItem(n * nn, '', priority=n))
                menu_entries.append(MenuItem(n * nn, '', priority=n * -1))

        self.assertEqual(
            str(sorted(menu_entries)),
            '[<MenuItem title="4" endpoint="" priority=-4>, '
            '<MenuItem title="32" endpoint="" priority=-4>, '
            '<MenuItem title="36" endpoint="" priority=-4>, '
            '<MenuItem title="40" endpoint="" priority=-4>, '
            '<MenuItem title="44" endpoint="" priority=-4>, '
            '<MenuItem title="3" endpoint="" priority=-3>, '
            '<MenuItem title="18" endpoint="" priority=-3>, '
            '<MenuItem title="21" endpoint="" priority=-3>, '
            '<MenuItem title="24" endpoint="" priority=-3>, '
            '<MenuItem title="2" endpoint="" priority=-2>, '
            '<MenuItem title="8" endpoint="" priority=-2>, '
            '<MenuItem title="10" endpoint="" priority=-2>, '
            '<MenuItem title="1" endpoint="" priority=-1>, '
            '<MenuItem title="2" endpoint="" priority=-1>, '
            '<MenuItem title="0" endpoint="" priority=0>, '
            '<MenuItem title="0" endpoint="" priority=0>, '
            '<MenuItem title="1" endpoint="" priority=1>, '
            '<MenuItem title="2" endpoint="" priority=1>, '
            '<MenuItem title="2" endpoint="" priority=2>, '
            '<MenuItem title="8" endpoint="" priority=2>, '
            '<MenuItem title="10" endpoint="" priority=2>, '
            '<MenuItem title="3" endpoint="" priority=3>, '
            '<MenuItem title="18" endpoint="" priority=3>, '
            '<MenuItem title="21" endpoint="" priority=3>, '
            '<MenuItem title="24" endpoint="" priority=3>, '
            '<MenuItem title="4" endpoint="" priority=4>, '
            '<MenuItem title="32" endpoint="" priority=4>, '
            '<MenuItem title="36" endpoint="" priority=4>, '
            '<MenuItem title="40" endpoint="" priority=4>, '
            '<MenuItem title="44" endpoint="" priority=4>]')

    def test_render(self):
        menu_entries = []
        true = lambda: True
        false = lambda: False
        for n in sorted(range(0, 5), reverse=True):
            menu_entries.append(MenuItem(n, 'root'))
        menu_entries.append(MenuItem(5, 'root', priority=-1))
        app = Flask(__name__)
        self.menubuilder.init_app(app)

        @app.route('/')
        def root():
            pass

        output = ''
        with app.test_request_context('/'):
            for entry in sorted(menu_entries):
                entry.builder = app.menubuilder.builder
                output += entry.render() + '\n'
        self.assertEqual(
            output, """<li class="active"><a class="active" href="/">5</a></li>
<li class="active"><a class="active" href="/">0</a></li>
<li class="active"><a class="active" href="/">1</a></li>
<li class="active"><a class="active" href="/">2</a></li>
<li class="active"><a class="active" href="/">3</a></li>
<li class="active"><a class="active" href="/">4</a></li>
""")

    def test_render_some_active(self):
        menu_entries = []
        true = lambda mi: True
        false = lambda mi: False
        for n in sorted(range(0, 5), reverse=True):
            menu_entries.append(
                MenuItem(n, 'root', activewhen=(n % 2 and true or false)))
        menu_entries.append(
            MenuItem(5,
                     'root',
                     priority=-1,
                     activewhen=(n % 2 and true or false)))
        app = Flask(__name__)
        self.menubuilder.init_app(app)

        @app.route('/')
        def root():
            pass

        output = ''
        with app.test_request_context('/'):
            for entry in sorted(menu_entries):
                entry.builder = app.menubuilder.builder
                output += entry.render() + '\n'
        self.assertEqual(
            output,
            """<li class="inactive"><a class="inactive" href="/">5</a></li>
<li class="inactive"><a class="inactive" href="/">0</a></li>
<li class="active"><a class="active" href="/">1</a></li>
<li class="inactive"><a class="inactive" href="/">2</a></li>
<li class="active"><a class="active" href="/">3</a></li>
<li class="inactive"><a class="inactive" href="/">4</a></li>
""")