diff --git a/flask_appbuilder/base.py b/flask_appbuilder/base.py index dc107ecdd8..b50ac02dea 100644 --- a/flask_appbuilder/base.py +++ b/flask_appbuilder/base.py @@ -332,10 +332,10 @@ def _add_addon_views(self) -> None: """ for addon in self._addon_managers: addon_class_ = dynamic_class_import(addon) - addon_class = cast(Type[BaseManager], addon_class_) + addon_class = cast(Type["BaseManager"], addon_class_) if addon_class: # Instantiate manager with appbuilder (self) - inst_addon_class: BaseManager = addon_class(self) + inst_addon_class: "BaseManager" = addon_class(self) try: inst_addon_class.pre_process() inst_addon_class.register_views() diff --git a/flask_appbuilder/tests/A_fixture/addon_manager.py b/flask_appbuilder/tests/A_fixture/addon_manager.py new file mode 100644 index 0000000000..718b559b38 --- /dev/null +++ b/flask_appbuilder/tests/A_fixture/addon_manager.py @@ -0,0 +1,15 @@ +from flask_appbuilder import BaseView, expose +from flask_appbuilder.basemanager import BaseManager + + +class DummyView(BaseView): + route_base = "/dummy" + + @expose("/method1/") + def method1(self, param1): + return param1 + + +class DummyAddOnManager(BaseManager): + def register_views(self): + self.appbuilder.add_view_no_menu(DummyView) diff --git a/flask_appbuilder/tests/test_addon.py b/flask_appbuilder/tests/test_addon.py new file mode 100644 index 0000000000..d45a82c1fe --- /dev/null +++ b/flask_appbuilder/tests/test_addon.py @@ -0,0 +1,45 @@ +import logging +import os + +from flask_appbuilder import SQLA +from flask_appbuilder.tests.A_fixture.addon_manager import DummyAddOnManager + +from .base import FABTestCase + + +log = logging.getLogger(__name__) + + +class FlaskTestCase(FABTestCase): + def setUp(self): + from flask import Flask + from flask_appbuilder import AppBuilder + + self.app = Flask(__name__) + self.basedir = os.path.abspath(os.path.dirname(__file__)) + self.app.config.from_object("flask_appbuilder.tests.config_api") + self.app.config["ADDON_MANAGERS"] = [ + "flask_appbuilder.tests.A_fixture.addon_manager.DummyAddOnManager" + ] + + self.db = SQLA(self.app) + self.appbuilder = AppBuilder(self.app, self.db.session) + + def tearDown(self): + self.appbuilder = None + self.app = None + self.db = None + + def test_addon_import(self): + self.assertIsInstance( + self.appbuilder.addon_managers[ + "flask_appbuilder.tests.A_fixture.addon_manager.DummyAddOnManager" + ], + DummyAddOnManager, + ) + + def test_addon_register_views(self): + client = self.app.test_client() + rv = client.get("/dummy/method1/test1") + self.assertEqual(rv.status_code, 200) + self.assertEqual(rv.data.decode("utf-8"), "test1") diff --git a/flask_appbuilder/tests/test_menu.py b/flask_appbuilder/tests/test_menu.py index 67fe449132..8986e6c5b2 100644 --- a/flask_appbuilder/tests/test_menu.py +++ b/flask_appbuilder/tests/test_menu.py @@ -46,7 +46,6 @@ def tearDown(self): self.appbuilder = None self.app = None self.db = None - log.debug("TEAR DOWN") def test_menu_access_denied(self): """