@@ -760,3 +760,63 @@ def test_cookie_parameters() -> None:
760760 response = view (context , request )
761761
762762 assert response .json == "foo"
763+
764+
765+ def test_add_explorer_view_with_csp_nonce () -> None :
766+ """Test explorer view includes CSP nonce when available on request."""
767+ with testConfig () as config :
768+ config .include ("pyramid_openapi3" )
769+
770+ with tempfile .NamedTemporaryFile () as document :
771+ document .write (MINIMAL_DOCUMENT )
772+ document .seek (0 )
773+
774+ config .pyramid_openapi3_spec (
775+ document .name , route = "/foo.yaml" , route_name = "foo_api_spec"
776+ )
777+
778+ config .pyramid_openapi3_add_explorer ()
779+ request = config .registry .queryUtility (
780+ IRouteRequest , name = "pyramid_openapi3.explorer"
781+ )
782+ view = config .registry .adapters .registered (
783+ (IViewClassifier , request , Interface ), IView , name = ""
784+ )
785+
786+ # Test with CSP nonce
787+ dummy_request = DummyRequest (config = config )
788+ dummy_request .csp_nonce = "test-nonce-123"
789+ response = view (request = dummy_request , context = None )
790+
791+ assert b'<script nonce="test-nonce-123">' in response .body
792+ assert b"<title>Swagger UI</title>" in response .body
793+
794+
795+ def test_add_explorer_view_without_csp_nonce () -> None :
796+ """Test explorer view works normally when no CSP nonce is present."""
797+ with testConfig () as config :
798+ config .include ("pyramid_openapi3" )
799+
800+ with tempfile .NamedTemporaryFile () as document :
801+ document .write (MINIMAL_DOCUMENT )
802+ document .seek (0 )
803+
804+ config .pyramid_openapi3_spec (
805+ document .name , route = "/foo.yaml" , route_name = "foo_api_spec"
806+ )
807+
808+ config .pyramid_openapi3_add_explorer ()
809+ request = config .registry .queryUtility (
810+ IRouteRequest , name = "pyramid_openapi3.explorer"
811+ )
812+ view = config .registry .adapters .registered (
813+ (IViewClassifier , request , Interface ), IView , name = ""
814+ )
815+
816+ # Test without CSP nonce
817+ dummy_request = DummyRequest (config = config )
818+ response = view (request = dummy_request , context = None )
819+
820+ assert b"<script>" in response .body
821+ assert b"nonce=" not in response .body
822+ assert b"<title>Swagger UI</title>" in response .body
0 commit comments