Skip to content

Commit b35e18f

Browse files
committed
Add oidcLogin MockMvc Test Support
Fixes gh-7618
1 parent 6ff71d8 commit b35e18f

File tree

5 files changed

+517
-0
lines changed

5 files changed

+517
-0
lines changed

samples/boot/oauth2login/src/integration-test/java/sample/OAuth2LoginApplicationTests.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import java.net.URI;
1919
import java.net.URL;
2020
import java.net.URLDecoder;
21+
import java.util.Collections;
2122
import java.util.HashMap;
2223
import java.util.HashSet;
2324
import java.util.List;
@@ -40,6 +41,7 @@
4041
import org.springframework.beans.factory.annotation.Autowired;
4142
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
4243
import org.springframework.boot.test.context.SpringBootTest;
44+
import org.springframework.context.annotation.Bean;
4345
import org.springframework.http.HttpStatus;
4446
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
4547
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
@@ -51,7 +53,9 @@
5153
import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository;
5254
import org.springframework.security.oauth2.client.userinfo.OAuth2UserRequest;
5355
import org.springframework.security.oauth2.client.userinfo.OAuth2UserService;
56+
import org.springframework.security.oauth2.client.web.HttpSessionOAuth2AuthorizedClientRepository;
5457
import org.springframework.security.oauth2.client.web.OAuth2AuthorizationRequestRedirectFilter;
58+
import org.springframework.security.oauth2.client.web.OAuth2AuthorizedClientRepository;
5559
import org.springframework.security.oauth2.client.web.OAuth2LoginAuthenticationFilter;
5660
import org.springframework.security.oauth2.core.OAuth2AccessToken;
5761
import org.springframework.security.oauth2.core.endpoint.OAuth2AccessTokenResponse;
@@ -61,13 +65,18 @@
6165
import org.springframework.security.oauth2.core.user.OAuth2User;
6266
import org.springframework.security.oauth2.core.user.OAuth2UserAuthority;
6367
import org.springframework.test.context.junit4.SpringRunner;
68+
import org.springframework.test.web.servlet.MockMvc;
6469
import org.springframework.web.util.UriComponents;
6570
import org.springframework.web.util.UriComponentsBuilder;
6671

6772
import static org.assertj.core.api.Assertions.assertThat;
6873
import static org.mockito.ArgumentMatchers.any;
6974
import static org.mockito.Mockito.mock;
7075
import static org.mockito.Mockito.when;
76+
import static org.springframework.security.oauth2.core.oidc.IdTokenClaimNames.SUB;
77+
import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.oidcLogin;
78+
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
79+
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.model;
7180

7281
/**
7382
* Integration tests for the OAuth 2.0 client filters {@link OAuth2AuthorizationRequestRedirectFilter}
@@ -87,6 +96,9 @@ public class OAuth2LoginApplicationTests {
8796
@Autowired
8897
private WebClient webClient;
8998

99+
@Autowired
100+
private MockMvc mvc;
101+
90102
@Autowired
91103
private ClientRegistrationRepository clientRegistrationRepository;
92104

@@ -284,6 +296,15 @@ public void requestAuthorizationCodeGrantWhenInvalidRedirectUriThenDisplayLoginP
284296
assertThat(errorElement.asText()).contains("invalid_redirect_uri_parameter");
285297
}
286298

299+
@Test
300+
public void requestWhenMockOidcLoginThenIndex() throws Exception {
301+
ClientRegistration clientRegistration = this.clientRegistrationRepository.findByRegistrationId("github");
302+
this.mvc.perform(get("/").with(oidcLogin().clientRegistration(clientRegistration)))
303+
.andExpect(model().attribute("userName", "test-subject"))
304+
.andExpect(model().attribute("clientName", "GitHub"))
305+
.andExpect(model().attribute("userAttributes", Collections.singletonMap(SUB, "test-subject")));
306+
}
307+
287308
private void assertLoginPage(HtmlPage page) {
288309
assertThat(page.getTitleText()).isEqualTo("Please sign in");
289310

@@ -397,5 +418,10 @@ private OAuth2UserService<OAuth2UserRequest, OAuth2User> mockUserService() {
397418
when(userService.loadUser(any())).thenReturn(user);
398419
return userService;
399420
}
421+
422+
@Bean
423+
OAuth2AuthorizedClientRepository authorizedClientRepository() {
424+
return new HttpSessionOAuth2AuthorizedClientRepository();
425+
}
400426
}
401427
}
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
/*
2+
* Copyright 2002-2019 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package sample.web;
18+
19+
import java.util.Collections;
20+
21+
import org.junit.Test;
22+
import org.junit.runner.RunWith;
23+
24+
import org.springframework.beans.factory.annotation.Autowired;
25+
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
26+
import org.springframework.context.annotation.Bean;
27+
import org.springframework.context.annotation.Configuration;
28+
import org.springframework.context.annotation.Import;
29+
import org.springframework.security.oauth2.client.registration.ClientRegistration;
30+
import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository;
31+
import org.springframework.security.oauth2.client.registration.InMemoryClientRegistrationRepository;
32+
import org.springframework.security.oauth2.client.web.HttpSessionOAuth2AuthorizedClientRepository;
33+
import org.springframework.security.oauth2.client.web.OAuth2AuthorizedClientRepository;
34+
import org.springframework.security.oauth2.core.AuthorizationGrantType;
35+
import org.springframework.test.context.junit4.SpringRunner;
36+
import org.springframework.test.web.servlet.MockMvc;
37+
38+
import static org.springframework.security.oauth2.core.oidc.IdTokenClaimNames.SUB;
39+
import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.oidcLogin;
40+
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
41+
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.model;
42+
43+
/**
44+
* Tests for {@link OAuth2LoginController}
45+
*
46+
* @author Josh Cummings
47+
*/
48+
@RunWith(SpringRunner.class)
49+
@WebMvcTest
50+
@Import({OAuth2LoginController.class, OAuth2LoginControllerTests.OAuth2ClientConfig.class})
51+
public class OAuth2LoginControllerTests {
52+
53+
static ClientRegistration clientRegistration = ClientRegistration.withRegistrationId("test")
54+
.authorizationGrantType(AuthorizationGrantType.PASSWORD)
55+
.clientId("my-client-id")
56+
.clientName("my-client-name")
57+
.tokenUri("https://token-uri.example.org")
58+
.build();
59+
60+
@Autowired
61+
MockMvc mvc;
62+
63+
@Test
64+
public void rootWhenAuthenticatedReturnsUserAndClient() throws Exception {
65+
this.mvc.perform(get("/").with(oidcLogin()))
66+
.andExpect(model().attribute("userName", "test-subject"))
67+
.andExpect(model().attribute("clientName", "test"))
68+
.andExpect(model().attribute("userAttributes", Collections.singletonMap(SUB, "test-subject")));
69+
}
70+
71+
@Test
72+
public void rootWhenOverridingClientRegistrationReturnsAccordingly() throws Exception {
73+
this.mvc.perform(get("/").with(oidcLogin()
74+
.clientRegistration(clientRegistration)
75+
.idToken(i -> i.subject("spring-security"))))
76+
.andExpect(model().attribute("userName", "spring-security"))
77+
.andExpect(model().attribute("clientName", "my-client-name"))
78+
.andExpect(model().attribute("userAttributes", Collections.singletonMap(SUB, "spring-security")));
79+
}
80+
81+
@Configuration
82+
static class OAuth2ClientConfig {
83+
84+
@Bean
85+
ClientRegistrationRepository clientRegistrationRepository() {
86+
return new InMemoryClientRegistrationRepository(clientRegistration);
87+
}
88+
89+
@Bean
90+
OAuth2AuthorizedClientRepository authorizedClientRepository() {
91+
return new HttpSessionOAuth2AuthorizedClientRepository();
92+
}
93+
}
94+
}

test/spring-security-test.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ dependencies {
77
compile 'org.springframework:spring-test'
88

99
optional project(':spring-security-config')
10+
optional project(':spring-security-oauth2-client')
1011
optional project(':spring-security-oauth2-jose')
1112
optional project(':spring-security-oauth2-resource-server')
1213
optional 'io.projectreactor:reactor-core'

0 commit comments

Comments
 (0)