From a95518d3163da1fc747cbfed9543a5950d516505 Mon Sep 17 00:00:00 2001 From: "shengzhaoli.shengz" Date: Thu, 19 Oct 2023 18:21:18 +0800 Subject: [PATCH] rest-docs API, /oauth2/rest_token API --- .../sos/config/WebSecurityConfigurer.java | 3 +- .../web/controller/OAuthRestController.java | 2 +- .../controller/OAuthRestControllerTest.java | 114 ++++++++++++++++++ 3 files changed, 116 insertions(+), 3 deletions(-) create mode 100644 src/test/java/com/monkeyk/sos/web/controller/OAuthRestControllerTest.java diff --git a/src/main/java/com/monkeyk/sos/config/WebSecurityConfigurer.java b/src/main/java/com/monkeyk/sos/config/WebSecurityConfigurer.java index ef7d160..7806d1e 100644 --- a/src/main/java/com/monkeyk/sos/config/WebSecurityConfigurer.java +++ b/src/main/java/com/monkeyk/sos/config/WebSecurityConfigurer.java @@ -47,8 +47,7 @@ public class WebSecurityConfigurer { public SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception { http.csrf(csrfConfigurer -> { -// csrfConfigurer.ignoringRequestMatchers("/oauth/authorize", "/oauth/token", "/oauth/rest_token"); - csrfConfigurer.ignoringRequestMatchers("/oauth/rest_token"); + csrfConfigurer.ignoringRequestMatchers("/oauth2/rest_token"); }); http.authorizeHttpRequests(matcherRegistry -> { diff --git a/src/main/java/com/monkeyk/sos/web/controller/OAuthRestController.java b/src/main/java/com/monkeyk/sos/web/controller/OAuthRestController.java index 08b9894..f448384 100644 --- a/src/main/java/com/monkeyk/sos/web/controller/OAuthRestController.java +++ b/src/main/java/com/monkeyk/sos/web/controller/OAuthRestController.java @@ -66,7 +66,7 @@ public class OAuthRestController implements InitializingBean, ApplicationContext // private WebResponseExceptionTranslator providerExceptionHandler = new DefaultWebResponseExceptionTranslator(); - @RequestMapping(value = "/oauth/rest_token", method = RequestMethod.POST) + @RequestMapping(value = "/oauth2/rest_token", method = RequestMethod.POST) @ResponseBody public OAuth2AccessToken postAccessToken(@RequestBody Map parameters) { diff --git a/src/test/java/com/monkeyk/sos/web/controller/OAuthRestControllerTest.java b/src/test/java/com/monkeyk/sos/web/controller/OAuthRestControllerTest.java new file mode 100644 index 0000000..5bae263 --- /dev/null +++ b/src/test/java/com/monkeyk/sos/web/controller/OAuthRestControllerTest.java @@ -0,0 +1,114 @@ +package com.monkeyk.sos.web.controller; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.monkeyk.sos.service.OauthService; +import com.monkeyk.sos.service.UserService; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.MediaType; +import org.springframework.restdocs.RestDocumentationContextProvider; +import org.springframework.restdocs.RestDocumentationExtension; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationConsentService; +import org.springframework.security.oauth2.server.authorization.client.RegisteredClientRepository; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.context.WebApplicationContext; + +import java.util.HashMap; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.*; +import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; +import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.documentationConfiguration; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; + +/** + * 2023/10/19 18:11 + * + * @author Shengzhao Li + * @since 3.0.0 + */ +@WebMvcTest +@ExtendWith({RestDocumentationExtension.class, SpringExtension.class}) +class OAuthRestControllerTest { + + + private MockMvc mockMvc; + + + @MockBean + private UserService userService; + + @MockBean + private RegisteredClientRepository registeredClientRepository; + + @MockBean + private OAuth2AuthorizationConsentService consentService; + + @MockBean + private OauthService oauthService; + + @MockBean + private OauthClientDetailsDtoValidator oauthClientDetailsDtoValidator; + + @MockBean + private UserFormDtoValidator userFormDtoValidator; + + + @MockBean + private PasswordEncoder passwordEncoder; + + + @BeforeEach + public void setup(WebApplicationContext applicationContext, RestDocumentationContextProvider contextProvider) { + this.mockMvc = MockMvcBuilders.webAppContextSetup(applicationContext) + .apply(documentationConfiguration(contextProvider)) + .alwaysDo(result -> { + result.getResponse().setContentType(MediaType.APPLICATION_JSON_VALUE); + }) + .build(); + } + + + @Test + @Disabled + void postAccessToken() throws Exception { + + + Map parameters = new HashMap<>(); + parameters.put("client_id", "clientxxxx"); + + ObjectMapper objectMapper = new ObjectMapper(); + String content = objectMapper.writeValueAsString(parameters); + assertNotNull(content); + + MockHttpServletRequestBuilder requestBuilder = post("/oauth2/rest_token") + .contentType(MediaType.APPLICATION_JSON) + .content(content); + + mockMvc.perform(requestBuilder) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON)) +// .andDo(print()) + .andExpect(jsonPath("access_token").exists()) +// .andExpect(jsonPath("username").value(username)) + .andExpect(jsonPath("refresh_token").exists()) + .andExpect(jsonPath("scope").exists()) + .andExpect(jsonPath("token_type").exists()) + .andExpect(jsonPath("expires_in").exists()) + //生成文档需要加上这句 + .andDo(document("{ClassName}/{methodName}")); + + + } + +} \ No newline at end of file