From 437c3bec80722e756a5f2d75f64908bb480f15b0 Mon Sep 17 00:00:00 2001 From: ehsan amiri Date: Wed, 2 Sep 2026 02:02:57 +0330 Subject: [PATCH] Fix Swagger version navbar after vendored Swagger UI 5.x. Use StandaloneLayout and topbar CSS selectors that match swagger-ui 5.18.3 so the version ; hide only the free-text Explore box + button. hide_url_css = """ """ standalone_script = "" - if navbar_enabled: + if needs_standalone and "swagger-ui-standalone-preset.js" in _SWAGGER_ASSETS: standalone_script = ( f'' ) @@ -277,7 +281,7 @@ def _swagger_ui_html(swagger: dict[str, Any], openapi_url: str, primary_name: st var opts = {ui_json}; opts.presets = [SwaggerUIBundle.presets.apis]; opts.plugins = [SwaggerUIBundle.plugins.DownloadUrl]; - if ({str(navbar_enabled).lower()} && typeof SwaggerUIStandalonePreset !== 'undefined') {{ + if ({str(needs_standalone).lower()} && typeof SwaggerUIStandalonePreset !== 'undefined') {{ opts.presets.push(SwaggerUIStandalonePreset); opts.layout = 'StandaloneLayout'; }} else {{ diff --git a/crates/fusion-py/python/fusion_framework/test_swagger.py b/crates/fusion-py/python/fusion_framework/test_swagger.py index fbf186f..5a73b92 100644 --- a/crates/fusion-py/python/fusion_framework/test_swagger.py +++ b/crates/fusion-py/python/fusion_framework/test_swagger.py @@ -2,7 +2,14 @@ from fusion_framework._fusion import has_unversioned_routes, openapi_spec, route_versions from fusion_framework.api import FusionBaseApi -from fusion_framework.app import UNVERSIONED_SWAGGER_NAME, _swagger_version_urls +from fusion_framework.app import ( + UNVERSIONED_SWAGGER_NAME, + _apply_version_navbar, + _swagger_settings, + _swagger_ui_html, + _swagger_version_urls, +) +from fusion_framework.config import Settings from fusion_framework.route import clear_registry, route @@ -83,3 +90,28 @@ def get(self): {"url": "/swagger/v2/openapi.json", "name": "v2"}, {"url": "/swagger/default/openapi.json", "name": "default"}, ] + + +def test_swagger_ui_html_version_navbar(): + @route("/hello", version="v1") + class V1Hello(FusionBaseApi): + def get(self): + return {"v": 1} + + @route("/hello", version="v2") + class V2Hello(FusionBaseApi): + def get(self): + return {"v": 2} + + swagger = _swagger_settings(Settings()) + labels = _apply_version_navbar(swagger) + assert labels == ["v1", "v2"] + + html = _swagger_ui_html(swagger, "/swagger/openapi.json", primary_name="v1") + assert "/swagger/v1/openapi.json" in html + assert "/swagger/v2/openapi.json" in html + assert '"urls"' in html + assert "StandaloneLayout" in html + assert "swagger-ui-standalone-preset.js" in html + assert ".download-url-wrapper input[type=text]" in html + assert ".download-url-input" not in html