CATEGORY 1: Backward Compatibility – Airflow 2.x Plugin Types

Test ObjectiveTest Steps / DataExpected OutcomeScenario Type
Load plugin using appbuilder_viewsUse a legacy plugin with appbuilder_views in Airflow 3Plugin view renders correctly under Legacy Views section, no errors in UI or logsPositive
Load plugin using flask_blueprintsUse plugin with a registered Flask blueprintBlueprint routes are reachable and render correctlyPositive
Load plugin with appbuilder_menu_itemsRegister legacy menu item (e.g., label + URL) via AppBuilder pluginItem appears in nav menu and links to correct viewPositive

CATEGORY 2: Airflow 3 Backend Plugin APIs

Test ObjectiveTest Steps / DataExpected OutcomeScenario Type
Register FastAPI app in plugin via fastapi_appsDefine plugin with FastAPI router (e.g., router.get("/custom"))Endpoint available at expected path (/api/v1/plugins/...)Positive
Verify FastAPI app auth & CORSCall plugin FastAPI endpoint from browser with/without auth headerCORS headers set correctly; unauthenticated access blockedPositive/Negative
Add root-level FastAPI middleware via fastapi_root_middlewaresRegister a custom logging/timing middleware and hit any endpointMiddleware logs/metrics triggered for each requestPositive
Register multiple FastAPI routers via fastapi_appsDefine plugin with more than one FastAPI appAll endpoints are available without conflictsPositive

CATEGORY 3: Frontend Plugin – external_views

Test ObjectiveTest Steps / DataExpected OutcomeScenario Type
Add external view (opens in new tab)Plugin registers external_views with url_route not definedMenu item opens external link in new browser tabPositive
Add external view embedded via iframePlugin registers external_views with url_route definedContent loads inside iframe in Airflow UI panelPositive
Load multiple external destinationsRegister multiple external_views with different configs (new tab, iframe, etc.)All links work as expectedPositive
Handle unreachable iframe sourceProvide broken iframe URL (e.g., http://localhost:9999)Iframe area shows load failure gracefullyNegative
External view with restricted domainUse iframe with site that blocks embedding (e.g., X-Frame-Options)UI fails securely; warning shown or blocked silentlyNegative

CATEGORY 4: Frontend Plugin – react_apps

Test ObjectiveTest Steps / DataExpected OutcomeScenario Type
Scaffold new React plugin using bootstrap toolRun: airflow plugins scaffold my-pluginCreates front-end react app folder with correct structurePositive
Build and register React app pluginRun npm run build, configure plugin with react_apps, restart AirflowPlugin appears in UI and route renders React contentPositive
Render plugin in multiple destinations (nav + DAG tab)Configure plugin with both navbar_items and dag_tab_viewsSame React app appears correctly in both UI locationsPositive
Plugin reads DAG/task context via URL paramsMount plugin on DAG tab and log received props in React appPlugin gets dag_id, run_id, etc. from URLPositive
React plugin handles routing internallyUse React Router inside plugin, navigate between sub-pagesURL and plugin state update without full reloadPositive
(3.1+)


Handle React plugin load error (missing JS)Delete JS bundle before starting AirflowPlugin area shows load failure; UI does not crashNegative
Handle runtime React errorInsert faulty code in App.tsx (e.g., throw error in render)Error boundary handles gracefully (toast/banner shown)Negative
Plugin conflict: two plugins using same route_baseRegister two plugins with route_base="/monitor"Airflow logs conflict, loads only one pluginNegative

  • No labels