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> """)
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> """)