Skip to content

Commit 81f08e2

Browse files
Add test for OAUTH2 provider
Signed-off-by: gabriel-farache <[email protected]>
1 parent 93cb710 commit 81f08e2

File tree

3 files changed

+273
-0
lines changed

3 files changed

+273
-0
lines changed

client/oidc/pom.xml

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,31 @@
2727
<artifactId>quarkus-resteasy-client-oidc-filter</artifactId>
2828
<scope>provided</scope>
2929
</dependency>
30+
<dependency>
31+
<groupId>org.assertj</groupId>
32+
<artifactId>assertj-core</artifactId>
33+
<scope>test</scope>
34+
</dependency>
35+
<dependency>
36+
<groupId>org.mockito</groupId>
37+
<artifactId>mockito-core</artifactId>
38+
<scope>test</scope>
39+
</dependency>
40+
<dependency>
41+
<groupId>org.mockito</groupId>
42+
<artifactId>mockito-junit-jupiter</artifactId>
43+
<scope>test</scope>
44+
</dependency>
45+
<dependency>
46+
<groupId>io.quarkus</groupId>
47+
<artifactId>quarkus-junit5</artifactId>
48+
<scope>test</scope>
49+
</dependency>
50+
<dependency>
51+
<groupId>org.jboss.resteasy</groupId>
52+
<artifactId>resteasy-core</artifactId>
53+
<scope>test</scope>
54+
</dependency>
3055
</dependencies>
3156

3257
</project>
Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
package io.quarkiverse.openapi.generator.oidc;
2+
3+
import static io.quarkiverse.openapi.generator.providers.AbstractAuthenticationPropagationHeadersFactory.propagationHeaderName;
4+
import static org.mockito.Mockito.when;
5+
6+
import java.io.IOException;
7+
import java.util.List;
8+
import java.util.Optional;
9+
import java.util.stream.Stream;
10+
11+
import org.assertj.core.api.Assertions;
12+
import org.eclipse.microprofile.config.Config;
13+
import org.eclipse.microprofile.config.ConfigProvider;
14+
import org.junit.jupiter.api.BeforeEach;
15+
import org.junit.jupiter.api.Test;
16+
import org.junit.jupiter.api.extension.ExtendWith;
17+
import org.junit.jupiter.params.ParameterizedTest;
18+
import org.junit.jupiter.params.provider.Arguments;
19+
import org.junit.jupiter.params.provider.MethodSource;
20+
import org.mockito.Mock;
21+
import org.mockito.MockedStatic;
22+
import org.mockito.Mockito;
23+
import org.mockito.junit.jupiter.MockitoExtension;
24+
25+
import io.quarkiverse.openapi.generator.AuthConfig;
26+
import io.quarkiverse.openapi.generator.oidc.providers.OAuth2AuthenticationProvider;
27+
import io.quarkus.oidc.client.Tokens;
28+
29+
import jakarta.ws.rs.client.ClientRequestContext;
30+
import jakarta.ws.rs.core.HttpHeaders;
31+
import jakarta.ws.rs.core.MultivaluedHashMap;
32+
import jakarta.ws.rs.core.MultivaluedMap;
33+
34+
@ExtendWith(MockitoExtension.class)
35+
public class OAuth2AuthenticationProviderTest {
36+
private static final String OPEN_API_FILE_SPEC_ID = "open_api_file_spec_id_json";
37+
private static final String AUTH_SCHEME_NAME = "auth_scheme_name";
38+
39+
private static final String ACCESS_TOKEN = "ACCESS_TOKEN";
40+
41+
private static final String PROPAGATED_TOKEN = "PROPAGATED_TOKEN";
42+
43+
private static final String HEADER_NAME = "HEADER_NAME";
44+
45+
@Mock
46+
private ClientRequestContext requestContext;
47+
48+
private MultivaluedMap<String, Object> headers;
49+
50+
private ClassicOidcClientRequestFilterDelegate classicDelegate;
51+
52+
private static final Tokens token = new Tokens(ACCESS_TOKEN, Long.MAX_VALUE, null, "", Long.MAX_VALUE, null, "");
53+
54+
private OAuth2AuthenticationProvider provider;
55+
56+
@BeforeEach
57+
void setUp() {
58+
headers = new MultivaluedHashMap<>();
59+
Mockito.lenient().doReturn(headers).when(requestContext).getHeaders();
60+
61+
classicDelegate = Mockito.mock(ClassicOidcClientRequestFilterDelegate.class);
62+
Mockito.lenient().when(classicDelegate.awaitTokens()).thenReturn(token);
63+
try {
64+
Mockito.lenient().doCallRealMethod().when(classicDelegate).filter(requestContext);
65+
} catch (IOException e) {
66+
throw new RuntimeException(e);
67+
}
68+
provider = createClassicProvider();
69+
70+
}
71+
72+
protected OAuth2AuthenticationProvider createClassicProvider() {
73+
return new OAuth2AuthenticationProvider(AUTH_SCHEME_NAME, OPEN_API_FILE_SPEC_ID, classicDelegate, List.of());
74+
}
75+
76+
protected void assertHeader(MultivaluedMap<String, Object> headers, String headerName, String value) {
77+
Assertions.assertThat(headers.getFirst(headerName))
78+
.isNotNull()
79+
.isEqualTo(value);
80+
}
81+
82+
static Stream<Arguments> filterWithPropagationTestValues() {
83+
return Stream.of(
84+
Arguments.of(null, "Bearer " + PROPAGATED_TOKEN),
85+
Arguments.of(HEADER_NAME, "Bearer " + PROPAGATED_TOKEN));
86+
}
87+
88+
@Test
89+
void filterClassic() throws IOException {
90+
filter(provider, "Bearer " + ACCESS_TOKEN);
91+
}
92+
93+
private void filter(OAuth2AuthenticationProvider provider, String expectedAuthorizationHeader) throws IOException {
94+
provider.filter(requestContext);
95+
assertHeader(headers, HttpHeaders.AUTHORIZATION, expectedAuthorizationHeader);
96+
}
97+
98+
@ParameterizedTest
99+
@MethodSource("filterWithPropagationTestValues")
100+
void filterWithPropagation(String headerName,
101+
String expectedAuthorizationHeader) throws IOException {
102+
String propagatedHeaderName;
103+
if (headerName == null) {
104+
propagatedHeaderName = propagationHeaderName(OPEN_API_FILE_SPEC_ID, AUTH_SCHEME_NAME,
105+
HttpHeaders.AUTHORIZATION);
106+
} else {
107+
propagatedHeaderName = propagationHeaderName(OPEN_API_FILE_SPEC_ID, AUTH_SCHEME_NAME,
108+
HEADER_NAME);
109+
}
110+
try (MockedStatic<ConfigProvider> configProviderMocked = Mockito.mockStatic(ConfigProvider.class)) {
111+
Config mockedConfig = Mockito.mock(Config.class);
112+
configProviderMocked.when(ConfigProvider::getConfig).thenReturn(mockedConfig);
113+
114+
when(mockedConfig.getOptionalValue(provider.getCanonicalAuthConfigPropertyName(AuthConfig.TOKEN_PROPAGATION),
115+
Boolean.class)).thenReturn(Optional.of(true));
116+
when(mockedConfig.getOptionalValue(provider.getCanonicalAuthConfigPropertyName(AuthConfig.HEADER_NAME),
117+
String.class)).thenReturn(Optional.of(headerName == null ? HttpHeaders.AUTHORIZATION : headerName));
118+
119+
headers.putSingle(propagatedHeaderName, PROPAGATED_TOKEN);
120+
filter(provider, expectedAuthorizationHeader);
121+
}
122+
}
123+
124+
}
Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
package io.quarkiverse.openapi.generator.oidc;
2+
3+
import static io.quarkiverse.openapi.generator.providers.AbstractAuthenticationPropagationHeadersFactory.propagationHeaderName;
4+
import static org.mockito.Mockito.when;
5+
6+
import java.io.IOException;
7+
import java.util.List;
8+
import java.util.Optional;
9+
import java.util.stream.Stream;
10+
11+
import org.assertj.core.api.Assertions;
12+
import org.eclipse.microprofile.config.Config;
13+
import org.eclipse.microprofile.config.ConfigProvider;
14+
import org.jboss.resteasy.reactive.client.spi.ResteasyReactiveClientRequestContext;
15+
import org.junit.jupiter.api.BeforeEach;
16+
import org.junit.jupiter.api.Test;
17+
import org.junit.jupiter.api.extension.ExtendWith;
18+
import org.junit.jupiter.params.ParameterizedTest;
19+
import org.junit.jupiter.params.provider.Arguments;
20+
import org.junit.jupiter.params.provider.MethodSource;
21+
import org.mockito.Mock;
22+
import org.mockito.MockedStatic;
23+
import org.mockito.Mockito;
24+
import org.mockito.junit.jupiter.MockitoExtension;
25+
26+
import io.quarkiverse.openapi.generator.AuthConfig;
27+
import io.quarkiverse.openapi.generator.oidc.providers.OAuth2AuthenticationProvider;
28+
import io.quarkus.oidc.client.Tokens;
29+
import io.smallrye.mutiny.Uni;
30+
31+
import jakarta.ws.rs.client.ClientRequestContext;
32+
import jakarta.ws.rs.core.HttpHeaders;
33+
import jakarta.ws.rs.core.MultivaluedHashMap;
34+
import jakarta.ws.rs.core.MultivaluedMap;
35+
36+
@ExtendWith(MockitoExtension.class)
37+
public class ReactiveOAuth2AuthenticationProviderTest {
38+
private static final String OPEN_API_FILE_SPEC_ID = "open_api_file_spec_id_json";
39+
private static final String AUTH_SCHEME_NAME = "auth_scheme_name";
40+
41+
private static final String ACCESS_TOKEN = "REACTIVE_ACCESS_TOKEN";
42+
43+
private static final String PROPAGATED_TOKEN = "PROPAGATED_TOKEN";
44+
45+
private static final String HEADER_NAME = "HEADER_NAME";
46+
@Mock
47+
private ResteasyReactiveClientRequestContext reactiveRequestContext;
48+
private MultivaluedMap<String, Object> headers;
49+
50+
private ReactiveOidcClientRequestFilterDelegate reactiveDelegate;
51+
private static final Tokens token = new Tokens(ACCESS_TOKEN, Long.MAX_VALUE, null, "", Long.MAX_VALUE, null, "");
52+
private static final Uni<Tokens> uniToken = Uni.createFrom().item(token);
53+
54+
private OAuth2AuthenticationProvider provider;
55+
56+
@BeforeEach
57+
void setUp() {
58+
headers = new MultivaluedHashMap<>();
59+
Mockito.lenient().doReturn(headers).when(reactiveRequestContext).getHeaders();
60+
61+
reactiveDelegate = Mockito.mock(ReactiveOidcClientRequestFilterDelegate.class);
62+
try {
63+
Mockito.lenient().doCallRealMethod().when(reactiveDelegate).filter(Mockito.any(ClientRequestContext.class));
64+
} catch (IOException e) {
65+
throw new RuntimeException(e);
66+
}
67+
Mockito.lenient().doCallRealMethod().when(reactiveDelegate).filter(reactiveRequestContext);
68+
Mockito.lenient().when(reactiveDelegate.getTokens()).thenReturn(uniToken);
69+
70+
provider = createReactiveProvider();
71+
}
72+
73+
protected OAuth2AuthenticationProvider createReactiveProvider() {
74+
return new OAuth2AuthenticationProvider(AUTH_SCHEME_NAME, OPEN_API_FILE_SPEC_ID, reactiveDelegate, List.of());
75+
}
76+
77+
protected void assertHeader(MultivaluedMap<String, Object> headers, String headerName, String value) {
78+
Assertions.assertThat(headers.getFirst(headerName))
79+
.isNotNull()
80+
.isEqualTo(value);
81+
}
82+
83+
static Stream<Arguments> filterWithPropagationTestValues() {
84+
return Stream.of(
85+
Arguments.of(null, "Bearer " + PROPAGATED_TOKEN),
86+
Arguments.of(HEADER_NAME, "Bearer " + PROPAGATED_TOKEN));
87+
}
88+
89+
@Test
90+
void filterReactive() throws IOException {
91+
filter(provider, "Bearer " + ACCESS_TOKEN);
92+
}
93+
94+
private void filter(OAuth2AuthenticationProvider provider, String expectedAuthorizationHeader) throws IOException {
95+
provider.filter(reactiveRequestContext);
96+
assertHeader(headers, HttpHeaders.AUTHORIZATION, expectedAuthorizationHeader);
97+
}
98+
99+
@ParameterizedTest
100+
@MethodSource("filterWithPropagationTestValues")
101+
void filterWithPropagation(String headerName,
102+
String expectedAuthorizationHeader) throws IOException {
103+
String propagatedHeaderName;
104+
if (headerName == null) {
105+
propagatedHeaderName = propagationHeaderName(OPEN_API_FILE_SPEC_ID, AUTH_SCHEME_NAME,
106+
HttpHeaders.AUTHORIZATION);
107+
} else {
108+
propagatedHeaderName = propagationHeaderName(OPEN_API_FILE_SPEC_ID, AUTH_SCHEME_NAME,
109+
HEADER_NAME);
110+
}
111+
try (MockedStatic<ConfigProvider> configProviderMocked = Mockito.mockStatic(ConfigProvider.class)) {
112+
Config mockedConfig = Mockito.mock(Config.class);
113+
configProviderMocked.when(ConfigProvider::getConfig).thenReturn(mockedConfig);
114+
115+
when(mockedConfig.getOptionalValue(provider.getCanonicalAuthConfigPropertyName(AuthConfig.TOKEN_PROPAGATION),
116+
Boolean.class)).thenReturn(Optional.of(true));
117+
when(mockedConfig.getOptionalValue(provider.getCanonicalAuthConfigPropertyName(AuthConfig.HEADER_NAME),
118+
String.class)).thenReturn(Optional.of(headerName == null ? HttpHeaders.AUTHORIZATION : headerName));
119+
120+
headers.putSingle(propagatedHeaderName, PROPAGATED_TOKEN);
121+
filter(provider, expectedAuthorizationHeader);
122+
}
123+
}
124+
}

0 commit comments

Comments
 (0)