rest-docs API

pull/4/head
shengzhaoli.shengz 2023-10-19 18:03:39 +08:00
parent c6de321e1f
commit 7396ff1e32
4 changed files with 142 additions and 1 deletions

View File

@ -197,6 +197,7 @@ Base on SpringBoot
<li><p>构建包由war换成jar, SQL相应调整</p></li>
<li><p>升级替换spring-security-oauth2, 详见<a href="https://andaily.com/blog/?p=20077">背景说明</a></p></li>
<li><p>界面使用说明按OAuth2.1进行友好更新</p></li>
<li><p>增加spring-restdocs文档支持, 自动生成API相关文档</p></li>
</ol>
</li>
<li>

View File

@ -0,0 +1,22 @@
= {project-id} API Docs
:toc: left
:toc-title: Contents
:revnumber: {project-version}
// == 应用版本API
// .http-request
// include::{snippets}/UnityControllerTest/version/http-request.adoc[]
// .curl-request
// include::{snippets}/UnityControllerTest/version/curl-request.adoc[]
// .request-body
// include::{snippets}/UnityControllerTest/version/request-body.adoc[]
// .http-response
// include::{snippets}/UnityControllerTest/version/http-response.adoc[]
// .response-body
// include::{snippets}/UnityControllerTest/version/response-body.adoc[]
== Unity resource API
operation::UnityControllerTest/userInfo[]

View File

@ -2,6 +2,7 @@ package com.monkeyk.sos.service.business;
import com.monkeyk.sos.domain.oauth.OauthClientDetails;
import com.monkeyk.sos.domain.oauth.OauthRepository;
import com.monkeyk.sos.domain.shared.GuidGenerator;
import com.monkeyk.sos.domain.user.Privilege;
import com.monkeyk.sos.domain.user.User;
import com.monkeyk.sos.domain.user.UserRepository;
@ -50,8 +51,13 @@ public abstract class AbstractInlineAccessTokenInvokerTest extends AbstractRepos
OauthClientDetails createClientDetails() {
OauthClientDetails clientDetails = new OauthClientDetails();
clientDetails.clientId(clientId)
.clientName("TestClient")
.id(GuidGenerator.generateNumber())
.clientSecret(PasswordHandler.encode(clientSecret))
.authorizationGrantTypes(grantTypes())
.clientAuthenticationMethods("client_secret_post")
.clientSettings("")
.tokenSettings("")
.scopes("openid");
// .accessTokenValidity(200)
// .resourceIds(RESOURCE_ID);
@ -62,7 +68,7 @@ public abstract class AbstractInlineAccessTokenInvokerTest extends AbstractRepos
}
String grantTypes() {
return "authorization_code,password,implicit,client_credentials,refresh_token";
return "authorization_code,password,client_credentials,refresh_token";
}
}

View File

@ -0,0 +1,112 @@
package com.monkeyk.sos.web.controller.resource;
import com.monkeyk.sos.service.OauthService;
import com.monkeyk.sos.service.UserService;
import com.monkeyk.sos.service.dto.UserJsonDto;
import com.monkeyk.sos.web.controller.OauthClientDetailsDtoValidator;
import com.monkeyk.sos.web.controller.UserFormDtoValidator;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mockito;
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 static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document;
import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.documentationConfiguration;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
/**
* 2023/10/19 17:31
*
* @author Shengzhao Li
* @since 3.0.0
*/
@WebMvcTest
@ExtendWith({RestDocumentationExtension.class, SpringExtension.class})
class UnityControllerTest {
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
void userInfo() throws Exception {
UserJsonDto jsonDto = new UserJsonDto();
String username = "user111";
jsonDto.setUsername(username);
jsonDto.setGuid("owwiwi0a0assdfsfs11");
jsonDto.setEmail("user111@cloudjac.com");
jsonDto.setPhone("13300002222");
jsonDto.getPrivileges().add("ROLE_USER");
Mockito.when(userService.loadCurrentUserJsonDto()).thenReturn(jsonDto);
MockHttpServletRequestBuilder requestBuilder = get("/unity/user_info")
.contentType(MediaType.APPLICATION_JSON);
mockMvc.perform(requestBuilder)
.andExpect(status().isOk())
.andExpect(content().contentType(MediaType.APPLICATION_JSON))
// .andDo(print())
.andExpect(jsonPath("guid").exists())
.andExpect(jsonPath("username").value(username))
.andExpect(jsonPath("email").exists())
.andExpect(jsonPath("phone").exists())
//生成文档需要加上这句
.andDo(document("{ClassName}/{methodName}"));
}
}