Skip to content

Commit 697fc5f

Browse files
ng-galienclaude
andcommitted
test(spring): Add unit tests for clientRegistrationId option
Add tests to verify: - @ClientRegistrationId annotation is generated when option is set - Annotation is not present when option is not configured Also regenerate complete samples for spring-http-interface-oauth config. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent d3e697f commit 697fc5f

63 files changed

Lines changed: 9281 additions & 34 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

modules/openapi-generator/src/test/java/org/openapitools/codegen/java/spring/SpringCodegenTest.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6223,4 +6223,31 @@ public void testExtensionsOnSchema_issue9183() throws IOException {
62236223
));
62246224
}
62256225

6226+
@Test
6227+
public void testClientRegistrationIdAnnotation() throws IOException {
6228+
final SpringCodegen codegen = new SpringCodegen();
6229+
codegen.setLibrary("spring-http-interface");
6230+
codegen.setClientRegistrationId("my-oauth-client");
6231+
6232+
final Map<String, File> files = generateFiles(codegen, "src/test/resources/3_0/petstore.yaml");
6233+
6234+
// Check that the @ClientRegistrationId annotation is generated at class level
6235+
JavaFileAssert.assertThat(files.get("PetApi.java"))
6236+
.hasImports("org.springframework.security.oauth2.client.annotation.ClientRegistrationId")
6237+
.assertTypeAnnotations()
6238+
.containsWithNameAndAttributes("ClientRegistrationId", ImmutableMap.of("value", "\"my-oauth-client\""));
6239+
}
6240+
6241+
@Test
6242+
public void testClientRegistrationIdAnnotationNotPresentWhenNotConfigured() throws IOException {
6243+
final SpringCodegen codegen = new SpringCodegen();
6244+
codegen.setLibrary("spring-http-interface");
6245+
// clientRegistrationId not set
6246+
6247+
final Map<String, File> files = generateFiles(codegen, "src/test/resources/3_0/petstore.yaml");
6248+
6249+
// Check that the @ClientRegistrationId annotation is NOT generated
6250+
assertFileNotContains(files.get("PetApi.java").toPath(), "@ClientRegistrationId", "ClientRegistrationId");
6251+
}
6252+
62266253
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# OpenAPI Generator Ignore
2+
# Generated by openapi-generator https://github.com/openapitools/openapi-generator
3+
4+
# Use this file to prevent files from being overwritten by the generator.
5+
# The patterns follow closely to .gitignore or .dockerignore.
6+
7+
# As an example, the C# client generator defines ApiClient.cs.
8+
# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line:
9+
#ApiClient.cs
10+
11+
# You can match any string of characters against a directory, file or extension with a single asterisk (*):
12+
#foo/*/qux
13+
# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux
14+
15+
# You can recursively match patterns against a directory, file or extension with a double asterisk (**):
16+
#foo/**/qux
17+
# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux
18+
19+
# You can also negate patterns with an exclamation (!).
20+
# For example, you can ignore all files in a docs folder with the file extension .md:
21+
#docs/*.md
22+
# Then explicitly reverse the ignore rule for a single file:
23+
#!docs/README.md
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
.openapi-generator-ignore
2+
README.md
3+
pom.xml
4+
src/main/java/org/openapitools/api/AnotherFakeApi.java
5+
src/main/java/org/openapitools/api/FakeApi.java
6+
src/main/java/org/openapitools/api/FakeClassnameTags123Api.java
7+
src/main/java/org/openapitools/api/PetApi.java
8+
src/main/java/org/openapitools/api/StoreApi.java
9+
src/main/java/org/openapitools/api/UserApi.java
10+
src/main/java/org/openapitools/configuration/HttpInterfacesAbstractConfigurator.java
11+
src/main/java/org/openapitools/model/AdditionalPropertiesAnyTypeDto.java
12+
src/main/java/org/openapitools/model/AdditionalPropertiesArrayDto.java
13+
src/main/java/org/openapitools/model/AdditionalPropertiesBooleanDto.java
14+
src/main/java/org/openapitools/model/AdditionalPropertiesClassDto.java
15+
src/main/java/org/openapitools/model/AdditionalPropertiesIntegerDto.java
16+
src/main/java/org/openapitools/model/AdditionalPropertiesNumberDto.java
17+
src/main/java/org/openapitools/model/AdditionalPropertiesObjectDto.java
18+
src/main/java/org/openapitools/model/AdditionalPropertiesStringDto.java
19+
src/main/java/org/openapitools/model/AnimalDto.java
20+
src/main/java/org/openapitools/model/ApiResponseDto.java
21+
src/main/java/org/openapitools/model/ArrayOfArrayOfNumberOnlyDto.java
22+
src/main/java/org/openapitools/model/ArrayOfNumberOnlyDto.java
23+
src/main/java/org/openapitools/model/ArrayTestDto.java
24+
src/main/java/org/openapitools/model/BigCatDto.java
25+
src/main/java/org/openapitools/model/CapitalizationDto.java
26+
src/main/java/org/openapitools/model/CatDto.java
27+
src/main/java/org/openapitools/model/CategoryDto.java
28+
src/main/java/org/openapitools/model/ChildWithNullableDto.java
29+
src/main/java/org/openapitools/model/ClassModelDto.java
30+
src/main/java/org/openapitools/model/ClientDto.java
31+
src/main/java/org/openapitools/model/ContainerDefaultValueDto.java
32+
src/main/java/org/openapitools/model/DogDto.java
33+
src/main/java/org/openapitools/model/EnumArraysDto.java
34+
src/main/java/org/openapitools/model/EnumClassDto.java
35+
src/main/java/org/openapitools/model/EnumTestDto.java
36+
src/main/java/org/openapitools/model/FileDto.java
37+
src/main/java/org/openapitools/model/FileSchemaTestClassDto.java
38+
src/main/java/org/openapitools/model/FormatTestDto.java
39+
src/main/java/org/openapitools/model/HasOnlyReadOnlyDto.java
40+
src/main/java/org/openapitools/model/ListDto.java
41+
src/main/java/org/openapitools/model/MapTestDto.java
42+
src/main/java/org/openapitools/model/MixedPropertiesAndAdditionalPropertiesClassDto.java
43+
src/main/java/org/openapitools/model/Model200ResponseDto.java
44+
src/main/java/org/openapitools/model/NameDto.java
45+
src/main/java/org/openapitools/model/NullableMapPropertyDto.java
46+
src/main/java/org/openapitools/model/NumberOnlyDto.java
47+
src/main/java/org/openapitools/model/OrderDto.java
48+
src/main/java/org/openapitools/model/OuterCompositeDto.java
49+
src/main/java/org/openapitools/model/OuterEnumDto.java
50+
src/main/java/org/openapitools/model/ParentWithNullableDto.java
51+
src/main/java/org/openapitools/model/PetDto.java
52+
src/main/java/org/openapitools/model/ReadOnlyFirstDto.java
53+
src/main/java/org/openapitools/model/ResponseObjectWithDifferentFieldNamesDto.java
54+
src/main/java/org/openapitools/model/ReturnDto.java
55+
src/main/java/org/openapitools/model/SpecialModelNameDto.java
56+
src/main/java/org/openapitools/model/TagDto.java
57+
src/main/java/org/openapitools/model/TypeHolderDefaultDto.java
58+
src/main/java/org/openapitools/model/TypeHolderExampleDto.java
59+
src/main/java/org/openapitools/model/UserDto.java
60+
src/main/java/org/openapitools/model/XmlItemDto.java
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
7.19.0-SNAPSHOT

samples/client/petstore/spring-http-interface-oauth/README.md

Lines changed: 14 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@
22

33
This sample demonstrates the use of the `@ClientRegistrationId` annotation with Spring HTTP Interface clients.
44

5-
## Feature
5+
## Overview
66

7-
When generating Spring HTTP Interface clients, you can now specify a `clientRegistrationId` parameter to automatically add the `@ClientRegistrationId` annotation to all generated interface methods.
7+
This code was generated by the [OpenAPI Generator](https://openapi-generator.tech) project.
8+
When generating Spring HTTP Interface clients, you can specify a `clientRegistrationId` parameter to automatically add the `@ClientRegistrationId` annotation to all generated API interfaces.
89

910
## Configuration
1011

@@ -45,18 +46,16 @@ public interface PetApi {
4546
}
4647
```
4748

48-
This follows the Spring Security recommendation to add `@ClientRegistrationId` at the type level to avoid repeating the declaration on every method.
49-
5049
## Spring Security Integration
5150

5251
This annotation is part of Spring Security's OAuth2 integration for HTTP Service Clients. It automatically associates OAuth2 tokens with HTTP requests.
5352

5453
### Requirements
5554

56-
- Spring Security 7.0+
57-
- Spring Boot 3.x
55+
- Spring Boot 3.5+
56+
- Spring Security 6.5+
5857

59-
### Configuration
58+
### Application Properties
6059

6160
Configure your Spring application with the OAuth2 client registration:
6261

@@ -78,31 +77,21 @@ spring:
7877
7978
### Bean Configuration
8079
81-
Use `OAuth2RestClientHttpServiceGroupConfigurer` to configure the HTTP Service Proxy Factory:
80+
Use `RestClientHttpServiceGroupConfigurer` to configure the HTTP Service Proxy Factory:
8281

8382
```java
8483
@Configuration
85-
public class HttpInterfaceConfig {
86-
87-
@Bean
88-
public PetApi petApi(OAuth2RestClientHttpServiceGroupConfigurer configurer) {
89-
RestClient.Builder builder = RestClient.builder()
90-
.baseUrl("https://petstore.example.com/v2");
91-
92-
configurer.configure(builder);
93-
94-
RestClient restClient = builder.build();
95-
RestClientAdapter adapter = RestClientAdapter.create(restClient);
96-
HttpServiceProxyFactory factory = HttpServiceProxyFactory
97-
.builderFor(adapter)
98-
.build();
84+
public class HttpInterfaceConfig extends HttpInterfacesAbstractConfigurator {
9985
100-
return factory.createClient(PetApi.class);
86+
public HttpInterfaceConfig() {
87+
super(RestClient.builder()
88+
.baseUrl("https://petstore.example.com/v2")
89+
.build());
10190
}
10291
}
10392
```
10493

10594
## References
10695

107-
- [Spring Security HTTP Service Client Integration](https://docs.spring.io/spring-security/reference/features/integrations/rest/http-service-client.html)
108-
- [Spring Security ClientRegistrationId API](https://docs.spring.io/spring-security/site/docs/current/api/org/springframework/security/oauth2/client/annotation/ClientRegistrationId.html)
96+
- [Spring Security HTTP Service Client Integration](https://docs.spring.io/spring-security/reference/servlet/oauth2/client/http-service-client.html)
97+
- [Spring Framework HTTP Interface](https://docs.spring.io/spring-framework/reference/integration/rest-clients.html#rest-http-interface)
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
2+
<modelVersion>4.0.0</modelVersion>
3+
<groupId>org.openapitools</groupId>
4+
<artifactId>spring-http-interface-oauth</artifactId>
5+
<packaging>jar</packaging>
6+
<name>spring-http-interface-oauth</name>
7+
<version>1.0.0-SNAPSHOT</version>
8+
<properties>
9+
<java.version>17</java.version>
10+
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
11+
</properties>
12+
<parent>
13+
<groupId>org.springframework.boot</groupId>
14+
<artifactId>spring-boot-starter-parent</artifactId>
15+
<version>3.1.3</version>
16+
<relativePath/> <!-- lookup parent from repository -->
17+
</parent>
18+
19+
<build>
20+
<plugins>
21+
<plugin>
22+
<groupId>org.apache.maven.plugins</groupId>
23+
<artifactId>maven-compiler-plugin</artifactId>
24+
<version>3.8.1</version>
25+
<configuration>
26+
<source>${java.version}</source>
27+
<target>${java.version}</target>
28+
</configuration>
29+
</plugin>
30+
<plugin>
31+
<groupId>org.apache.maven.plugins</groupId>
32+
<artifactId>maven-source-plugin</artifactId>
33+
<version>3.2.1</version>
34+
<executions>
35+
<execution>
36+
<id>attach-sources</id>
37+
<goals>
38+
<goal>jar-no-fork</goal>
39+
</goals>
40+
</execution>
41+
</executions>
42+
</plugin>
43+
</plugins>
44+
</build>
45+
46+
<dependencies>
47+
<dependency>
48+
<groupId>org.springframework.boot</groupId>
49+
<artifactId>spring-boot-starter-webflux</artifactId>
50+
</dependency>
51+
<!-- @Nullable annotation -->
52+
<dependency>
53+
<groupId>com.google.code.findbugs</groupId>
54+
<artifactId>jsr305</artifactId>
55+
<version>3.0.2</version>
56+
</dependency>
57+
<dependency>
58+
<groupId>jakarta.validation</groupId>
59+
<artifactId>jakarta.validation-api</artifactId>
60+
</dependency>
61+
<dependency>
62+
<groupId>com.fasterxml.jackson.datatype</groupId>
63+
<artifactId>jackson-datatype-jsr310</artifactId>
64+
</dependency>
65+
<dependency>
66+
<groupId>org.openapitools</groupId>
67+
<artifactId>jackson-databind-nullable</artifactId>
68+
<version>0.2.8</version>
69+
</dependency>
70+
<dependency>
71+
<groupId>org.springframework.boot</groupId>
72+
<artifactId>spring-boot-starter-test</artifactId>
73+
<scope>test</scope>
74+
</dependency>
75+
</dependencies>
76+
</project>
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/*
2+
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech) (7.19.0-SNAPSHOT).
3+
* https://openapi-generator.tech
4+
* Do not edit the class manually.
5+
*/
6+
package org.openapitools.api;
7+
8+
import org.openapitools.model.ClientDto;
9+
import org.springframework.http.ResponseEntity;
10+
import org.springframework.web.bind.annotation.*;
11+
import org.springframework.web.service.annotation.*;
12+
13+
import org.springframework.security.oauth2.client.annotation.ClientRegistrationId;
14+
15+
import org.springframework.web.multipart.MultipartFile;
16+
17+
import java.util.List;
18+
import java.util.Map;
19+
import java.util.Optional;
20+
import jakarta.annotation.Generated;
21+
22+
23+
@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", comments = "Generator version: 7.19.0-SNAPSHOT")
24+
@ClientRegistrationId("petstore-oauth")
25+
public interface AnotherFakeApi {
26+
27+
/**
28+
* PATCH /another-fake/dummy : To test special tags
29+
* To test special tags and operation ID starting with number
30+
*
31+
* @param clientDto client model (required)
32+
* @return successful operation (status code 200)
33+
*/
34+
@HttpExchange(
35+
method = "PATCH",
36+
value = "/another-fake/dummy",
37+
accept = { "application/json" },
38+
contentType = "application/json"
39+
)
40+
ResponseEntity<ClientDto> call123testSpecialTags(
41+
@RequestBody ClientDto clientDto
42+
);
43+
44+
}

0 commit comments

Comments
 (0)