DUE TO SPAM, SIGN-UP IS DISABLED. Goto Selfserve wiki signup and request an account.
CATEGORY 1: Backward Compatibility – Airflow 2.x Plugin Types
| Test Objective | Test Steps / Data | Expected Outcome | Scenario Type |
|---|---|---|---|
Load plugin using appbuilder_views | Use a legacy plugin with appbuilder_views in Airflow 3 | Plugin view renders correctly under Legacy Views section, no errors in UI or logs | Positive |
Load plugin using flask_blueprints | Use plugin with a registered Flask blueprint | Blueprint routes are reachable and render correctly | Positive |
Load plugin with appbuilder_menu_items | Register legacy menu item (e.g., label + URL) via AppBuilder plugin | Item appears in nav menu and links to correct view | Positive |
CATEGORY 2: Airflow 3 Backend Plugin APIs
| Test Objective | Test Steps / Data | Expected Outcome | Scenario Type |
|---|---|---|---|
Register FastAPI app in plugin via fastapi_apps | Define plugin with FastAPI router (e.g., router.get("/custom")) | Endpoint available at expected path (/api/v1/plugins/...) | Positive |
| Verify FastAPI app auth & CORS | Call plugin FastAPI endpoint from browser with/without auth header | CORS headers set correctly; unauthenticated access blocked | Positive/Negative |
Add root-level FastAPI middleware via fastapi_root_middlewares | Register a custom logging/timing middleware and hit any endpoint | Middleware logs/metrics triggered for each request | Positive |
Register multiple FastAPI routers via fastapi_apps | Define plugin with more than one FastAPI app | All endpoints are available without conflicts | Positive |
CATEGORY 3: Frontend Plugin – external_views
| Test Objective | Test Steps / Data | Expected Outcome | Scenario Type |
|---|---|---|---|
| Add external view (opens in new tab) | Plugin registers external_views with url_route not defined | Menu item opens external link in new browser tab | Positive |
| Add external view embedded via iframe | Plugin registers external_views with url_route defined | Content loads inside iframe in Airflow UI panel | Positive |
| Load multiple external destinations | Register multiple external_views with different configs (new tab, iframe, etc.) | All links work as expected | Positive |
| Handle unreachable iframe source | Provide broken iframe URL (e.g., http://localhost:9999) | Iframe area shows load failure gracefully | Negative |
| External view with restricted domain | Use iframe with site that blocks embedding (e.g., X-Frame-Options) | UI fails securely; warning shown or blocked silently | Negative |
CATEGORY 4: Frontend Plugin – react_apps
| Test Objective | Test Steps / Data | Expected Outcome | Scenario Type |
|---|---|---|---|
| Scaffold new React plugin using bootstrap tool | Run: airflow plugins scaffold my-plugin | Creates front-end react app folder with correct structure | Positive |
| Build and register React app plugin | Run npm run build, configure plugin with react_apps, restart Airflow | Plugin appears in UI and route renders React content | Positive |
| Render plugin in multiple destinations (nav + DAG tab) | Configure plugin with both navbar_items and dag_tab_views | Same React app appears correctly in both UI locations | Positive |
| Plugin reads DAG/task context via URL params | Mount plugin on DAG tab and log received props in React app | Plugin gets dag_id, run_id, etc. from URL | Positive |
| React plugin handles routing internally | Use React Router inside plugin, navigate between sub-pages | URL and plugin state update without full reload | Positive |
| (3.1+) | |||
| Handle React plugin load error (missing JS) | Delete JS bundle before starting Airflow | Plugin area shows load failure; UI does not crash | Negative |
| Handle runtime React error | Insert 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_base | Register two plugins with route_base="/monitor" | Airflow logs conflict, loads only one plugin | Negative |