@@ -1803,4 +1803,88 @@ public void quarkusEmitsAuthenticatedAnnotationForOpenIdConnect(String specPath,
18031803 final String content = Files .readString (output .toPath ().resolve ("src/gen/java/org/openapitools/api/ItemsApi.java" ));
18041804 Assert .assertEquals (TestUtils .countOccurrences (content , "@io\\ .quarkus\\ .security\\ .Authenticated" ), expectedCount );
18051805 }
1806+
1807+ /**
1808+ * Parameterized test for global security inheritance and per-operation security: [] override.
1809+ * Each row: (spec path, interfaceOnly, useQuarkusSecurityAnnotations, expected count).
1810+ */
1811+ @ DataProvider (name = "quarkusGlobalSecurityCases" )
1812+ public Object [][] quarkusGlobalSecurityCases () {
1813+ return new Object [][] {
1814+ // global HTTP Basic + Bearer; GET inherits (→ @Authenticated), POST has security:[] (→ none)
1815+ {"src/test/resources/3_0/jaxrs-spec/quarkus-global-security-one-op-disabled.yaml" , true , true , 1 },
1816+ {"src/test/resources/3_0/jaxrs-spec/quarkus-global-security-one-op-disabled.yaml" , true , false , 0 },
1817+ {"src/test/resources/3_0/jaxrs-spec/quarkus-global-security-one-op-disabled.yaml" , false , true , 1 },
1818+ {"src/test/resources/3_0/jaxrs-spec/quarkus-global-security-one-op-disabled.yaml" , false , false , 0 },
1819+ // global OR: unscoped OAuth2 + scoped OAuth2; both ops inherit → both get @Authenticated
1820+ {"src/test/resources/3_0/jaxrs-spec/quarkus-global-oauth2-or-scoped-and-unscoped.yaml" , true , true , 2 },
1821+ {"src/test/resources/3_0/jaxrs-spec/quarkus-global-oauth2-or-scoped-and-unscoped.yaml" , true , false , 0 },
1822+ {"src/test/resources/3_0/jaxrs-spec/quarkus-global-oauth2-or-scoped-and-unscoped.yaml" , false , true , 2 },
1823+ {"src/test/resources/3_0/jaxrs-spec/quarkus-global-oauth2-or-scoped-and-unscoped.yaml" , false , false , 0 },
1824+ };
1825+ }
1826+
1827+ @ Test (dataProvider = "quarkusGlobalSecurityCases" )
1828+ public void quarkusHandlesGlobalSecurityScenarios (String specPath , boolean interfaceOnly , boolean useFlag , int expectedCount ) throws Exception {
1829+ final File output = Files .createTempDirectory ("test" ).toFile ().getCanonicalFile ();
1830+ output .deleteOnExit ();
1831+
1832+ final OpenAPI openAPI = new OpenAPIParser ()
1833+ .readLocation (specPath , null , new ParseOptions ()).getOpenAPI ();
1834+
1835+ codegen .setOutputDir (output .getAbsolutePath ());
1836+ codegen .setLibrary (QUARKUS_LIBRARY );
1837+ codegen .additionalProperties ().put (INTERFACE_ONLY , interfaceOnly );
1838+ codegen .additionalProperties ().put (USE_JAKARTA_EE , true );
1839+ codegen .additionalProperties ().put (USE_QUARKUS_SECURITY_ANNOTATIONS , useFlag );
1840+
1841+ final DefaultGenerator generator = new DefaultGenerator ();
1842+ final List <File > files = generator .opts (new ClientOptInput ().openAPI (openAPI ).config (codegen )).generate ();
1843+
1844+ validateJavaSourceFiles (files );
1845+
1846+ TestUtils .ensureContainsFile (files , output , "src/gen/java/org/openapitools/api/ItemsApi.java" );
1847+ final String content = Files .readString (output .toPath ().resolve ("src/gen/java/org/openapitools/api/ItemsApi.java" ));
1848+ Assert .assertEquals (TestUtils .countOccurrences (content , "@io\\ .quarkus\\ .security\\ .Authenticated" ), expectedCount );
1849+ }
1850+
1851+ /**
1852+ * Parameterized test for cross-type OR lists where the qualifying scheme is not the first entry.
1853+ * Each row: (interfaceOnly, useQuarkusSecurityAnnotations, expected count).
1854+ * Spec: GET has scoped OAuth2 OR API Key — API Key qualifies even though OAuth2 alone would not.
1855+ * POST has scoped OAuth2 only — no qualifying scheme.
1856+ */
1857+ @ DataProvider (name = "quarkusMixedTypeOrCases" )
1858+ public Object [][] quarkusMixedTypeOrCases () {
1859+ return new Object [][] {
1860+ {true , true , 1 },
1861+ {true , false , 0 },
1862+ {false , true , 1 },
1863+ {false , false , 0 },
1864+ };
1865+ }
1866+
1867+ @ Test (dataProvider = "quarkusMixedTypeOrCases" )
1868+ public void quarkusEmitsAuthenticatedForMixedTypeOrList (boolean interfaceOnly , boolean useFlag , int expectedCount ) throws Exception {
1869+ final File output = Files .createTempDirectory ("test" ).toFile ().getCanonicalFile ();
1870+ output .deleteOnExit ();
1871+
1872+ final OpenAPI openAPI = new OpenAPIParser ()
1873+ .readLocation ("src/test/resources/3_0/jaxrs-spec/quarkus-oauth2-scoped-or-api-key.yaml" , null , new ParseOptions ()).getOpenAPI ();
1874+
1875+ codegen .setOutputDir (output .getAbsolutePath ());
1876+ codegen .setLibrary (QUARKUS_LIBRARY );
1877+ codegen .additionalProperties ().put (INTERFACE_ONLY , interfaceOnly );
1878+ codegen .additionalProperties ().put (USE_JAKARTA_EE , true );
1879+ codegen .additionalProperties ().put (USE_QUARKUS_SECURITY_ANNOTATIONS , useFlag );
1880+
1881+ final DefaultGenerator generator = new DefaultGenerator ();
1882+ final List <File > files = generator .opts (new ClientOptInput ().openAPI (openAPI ).config (codegen )).generate ();
1883+
1884+ validateJavaSourceFiles (files );
1885+
1886+ TestUtils .ensureContainsFile (files , output , "src/gen/java/org/openapitools/api/ItemsApi.java" );
1887+ final String content = Files .readString (output .toPath ().resolve ("src/gen/java/org/openapitools/api/ItemsApi.java" ));
1888+ Assert .assertEquals (TestUtils .countOccurrences (content , "@io\\ .quarkus\\ .security\\ .Authenticated" ), expectedCount );
1889+ }
18061890}
0 commit comments