Browse Source

Add: RestDocs 스니펫 커스텀으로인한 항목 추가, 테스트 Transaction 롤백기능추가

pull/6/head
lkd9125(이경도) 8 months ago
parent
commit
562df6b0ce
  1. 16
      app/kac-app/build.gradle
  2. 5
      app/kac-app/src/main/java/kr/co/palnet/kac/app/core/security/AppSecurityConfig.java
  3. 618
      app/kac-app/src/main/resources/static/docs/index.html
  4. 140
      app/kac-app/src/test/java/kr/co/palnet/kac/com/code/ComnCodeControllerTest.java
  5. 11
      app/kac-app/src/test/resources/org/springframework/restdocs/templates/path-parameters.snippet
  6. 10
      app/kac-app/src/test/resources/org/springframework/restdocs/templates/query-parameters.snippet
  7. 12
      app/kac-app/src/test/resources/org/springframework/restdocs/templates/request-fields.snippet
  8. 10
      app/kac-app/src/test/resources/org/springframework/restdocs/templates/request-headers.snippet
  9. 12
      app/kac-app/src/test/resources/org/springframework/restdocs/templates/response-fields.snippet

16
app/kac-app/build.gradle

@ -51,10 +51,8 @@ test {
outputs.dir snippetsDir outputs.dir snippetsDir
} }
asciidoctor { asciidoctor {
if(project.hasProperty("excludeTest")){ dependsOn test
dependsOn test inputs.dir snippetsDir
inputs.dir snippetsDir
}
} }
bootJar { bootJar {
@ -65,9 +63,7 @@ bootJar {
} }
asciidoctor.doFirst { asciidoctor.doFirst {
if(project.hasProperty("excludeTest")) { delete file('src/main/resources/static/docs')
delete file('src/main/resources/static/docs')
}
} }
task copyDocument(type: Copy) { task copyDocument(type: Copy) {
@ -77,13 +73,9 @@ task copyDocument(type: Copy) {
} }
build { build {
if(project.hasProperty("excludeTest")){ dependsOn copyDocument
dependsOn copyDocument
}
} }
// querydsl // querydsl
def querydslDir = layout.buildDirectory.dir("generated/querydsl").get().asFile def querydslDir = layout.buildDirectory.dir("generated/querydsl").get().asFile

5
app/kac-app/src/main/java/kr/co/palnet/kac/app/core/security/AppSecurityConfig.java

@ -19,7 +19,10 @@ import org.springframework.security.web.SecurityFilterChain;
public class AppSecurityConfig extends SecurityConfig { public class AppSecurityConfig extends SecurityConfig {
// 시큐리티 적용 안하는 URL 목록 // 시큐리티 적용 안하는 URL 목록
private final String[] IGNORE_URL = {}; private final String[] IGNORE_URL = {
"/docs/index.html",
"/v1/com/code/**"
};
private final String[] USER_URL = {}; private final String[] USER_URL = {};

618
app/kac-app/src/main/resources/static/docs/index.html

File diff suppressed because it is too large Load Diff

140
app/kac-app/src/test/java/kr/co/palnet/kac/com/code/ComnCodeControllerTest.java

@ -10,34 +10,45 @@ import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import kr.co.palnet.kac.BaseTest; import kr.co.palnet.kac.BaseTest;
import kr.co.palnet.kac.api.v1.com.code.model.FormCodeGroupRQ;
import kr.co.palnet.kac.api.v1.com.code.model.FormCodeLangRQ;
import kr.co.palnet.kac.api.v1.com.code.model.FormCodeRQ;
import kr.co.palnet.kac.api.v1.com.code.service.ComCodeService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;
import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTestContextBootstrapper;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.restdocs.RestDocumentationExtension; import org.springframework.restdocs.RestDocumentationExtension;
import org.springframework.restdocs.payload.JsonFieldType; import org.springframework.restdocs.payload.JsonFieldType;
import org.springframework.test.context.BootstrapWith; import org.springframework.transaction.annotation.Transactional;
import kr.co.palnet.kac.api.v1.com.code.controller.ComCodeController;
import kr.co.palnet.kac.app.KacAppApplication; import kr.co.palnet.kac.app.KacAppApplication;
@SpringBootTest(classes = KacAppApplication.class) @SpringBootTest(classes = KacAppApplication.class)
@ExtendWith({RestDocumentationExtension.class}) @ExtendWith({RestDocumentationExtension.class})
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
@RequiredArgsConstructor @RequiredArgsConstructor
@Transactional
public class ComnCodeControllerTest extends BaseTest { public class ComnCodeControllerTest extends BaseTest {
@Autowired
private ComCodeService comCodeService;
private final String BASE_URL = "/v1/com/code"; private final String BASE_URL = "/v1/com/code";
@DisplayName("[10] 언어코드 삭제")
@Order(10)
@Test @Test
public void deleteLang() throws Exception{ public void deleteLang() throws Exception{
String groupCd = "NEW_GROUP001"; String groupCd = "NEW_GROUP001";
String cdId = "NEW_CODE170605841699"; String cdId = "NEW_CODE001";
String langDivCd = "ko_KR"; String langDivCd = "ko_KR";
this.mockMvc.perform( this.mockMvc.perform(
@ -60,11 +71,12 @@ public class ComnCodeControllerTest extends BaseTest {
.andExpect(status().isOk()); .andExpect(status().isOk());
} }
@DisplayName("[11] 코드 삭제")
@Order(11)
@Test @Test
public void deleteCode() throws Exception{ public void deleteCode() throws Exception{
String groupCd = "NEW_GROUP001"; String groupCd = "NEW_GROUP001";
String cdId = "NEW_CODE170605841699"; String cdId = "NEW_CODE001";
this.mockMvc.perform( this.mockMvc.perform(
delete(this.BASE_URL + "/code?groupCd=" + groupCd + "&cdId=" + cdId) delete(this.BASE_URL + "/code?groupCd=" + groupCd + "&cdId=" + cdId)
@ -85,9 +97,11 @@ public class ComnCodeControllerTest extends BaseTest {
.andExpect(status().isOk()); .andExpect(status().isOk());
} }
@DisplayName("[12] 그룹 삭제")
@Order(12)
@Test @Test
public void deleteCodeGroup() throws Exception { public void deleteCodeGroup() throws Exception {
String deleteGroupCd = "NEW_Group_1706003812"; String deleteGroupCd = "NEW_GROUP001";
this.mockMvc.perform( this.mockMvc.perform(
delete(this.BASE_URL + "/group?groupCd=" + deleteGroupCd) delete(this.BASE_URL + "/group?groupCd=" + deleteGroupCd)
@ -107,15 +121,27 @@ public class ComnCodeControllerTest extends BaseTest {
.andExpect(status().isOk()); .andExpect(status().isOk());
} }
@DisplayName("[6] 코드의 언어코드 수정")
@Order(6)
@Test @Test
public void updateCodeLang() throws Exception{ public void updateCodeLang() throws Exception{
FormCodeGroupRQ groupRq = FormCodeGroupRQ.builder().groupCd("NEW_GROUP001").siteCd("KAC").groupCdNm("신규그룹001").rm("비고....").build();
comCodeService.createCodeGroup(groupRq);
FormCodeRQ codeRq = FormCodeRQ.builder().groupCd("NEW_GROUP001").cdId("NEW_CODE001").upperCd(null).sortOrdr(0).addInfoValue("추가!!").useYn("Y").build();
comCodeService.createCode(codeRq);
FormCodeLangRQ langRq = FormCodeLangRQ.builder().groupCd("NEW_GROUP001").cdId("NEW_CODE001").langDivCd("ko_KR").cdNm("신규코드001").rm("비고....").build();
comCodeService.createCodeLang(langRq);
String jsonRQ = """ String jsonRQ = """
{ {
"groupCd": "NEW_GROUP001", "groupCd": "NEW_GROUP001",
"cdId": "NEW_CODE001", "cdId": "NEW_CODE001",
"langDivCd": "en_CA", "langDivCd": "ko_KR",
"cdNm": "신규코드001", "cdNm": "신규코드001",
"rm": "비고...." "rm": "수정..."
} }
"""; """;
@ -153,14 +179,23 @@ public class ComnCodeControllerTest extends BaseTest {
.andExpect(status().isOk()); .andExpect(status().isOk());
} }
@DisplayName("[5] 코드 수정")
@Order(5)
@Test @Test
public void updateCode() throws Exception{ public void updateCode() throws Exception{
FormCodeGroupRQ groupRq = FormCodeGroupRQ.builder().groupCd("NEW_GROUP001").siteCd("KAC").groupCdNm("신규그룹001").rm("비고....").build();
comCodeService.createCodeGroup(groupRq);
FormCodeRQ codeRq = FormCodeRQ.builder().groupCd("NEW_GROUP001").cdId("NEW_CODE001").upperCd(null).sortOrdr(0).addInfoValue("추가!!").useYn("Y").build();
comCodeService.createCode(codeRq);
String jsonRQ = """ String jsonRQ = """
{ {
"groupCd": "NEW_GROUP001", "groupCd": "NEW_GROUP001",
"cdId": "NEW_CODE001", "cdId": "NEW_CODE001",
"sortOrdr": 0, "sortOrdr": 0,
"addInfoValue": "추가!!", "addInfoValue": "수정!!",
"useYn": "Y" "useYn": "Y"
} }
"""; """;
@ -200,8 +235,14 @@ public class ComnCodeControllerTest extends BaseTest {
.andExpect(status().isOk()); .andExpect(status().isOk());
} }
@DisplayName("[4] 그룹 수정")
@Order(4)
@Test @Test
public void updateCodeGroup() throws Exception{ public void updateCodeGroup() throws Exception{
FormCodeGroupRQ rq = FormCodeGroupRQ.builder().groupCd("NEW_GROUP001").siteCd("KAC").groupCdNm("신규그룹001").rm("비고....").build();
comCodeService.createCodeGroup(rq);
String jsonRQ = """ String jsonRQ = """
{ {
"groupCd": "NEW_GROUP001", "groupCd": "NEW_GROUP001",
@ -243,6 +284,8 @@ public class ComnCodeControllerTest extends BaseTest {
.andExpect(status().isOk()); .andExpect(status().isOk());
} }
@DisplayName("[3] 코드의 언어코드 추가")
@Order(3)
@Test @Test
public void createCodeLang() throws Exception{ public void createCodeLang() throws Exception{
@ -293,10 +336,11 @@ public class ComnCodeControllerTest extends BaseTest {
} }
@DisplayName("[2] 코드 추가")
@Order(2)
@Test @Test
public void createCode() throws Exception{ public void createCode() throws Exception{
String codeNm = "NEW_CODE" + System.currentTimeMillis(); String codeNm = "NEW_CODE001";
codeNm = codeNm.substring(0, 20);
String jsonRQ = """ String jsonRQ = """
{ {
@ -343,11 +387,14 @@ public class ComnCodeControllerTest extends BaseTest {
.andExpect(status().isOk()); .andExpect(status().isOk());
} }
@DisplayName("[1] 코드그룹 추가")
@Order(1)
@Test @Test
public void createCodeGroup() throws Exception{ public void createCodeGroup() throws Exception{
String randomNm = "NEW_GROUP_" + System.currentTimeMillis(); // String randomNm = "NEW_GROUP_" + System.currentTimeMillis();
randomNm = randomNm.substring(0, 20); String randomNm = "NEW_GROUP001";
// randomNm = randomNm.substring(0, 20);
String jsonRQ = """ String jsonRQ = """
{ {
@ -390,8 +437,20 @@ public class ComnCodeControllerTest extends BaseTest {
.andExpect(status().isOk()); .andExpect(status().isOk());
} }
@DisplayName("[7] 모든 코드 조회")
@Order(7)
@Test @Test
public void getAllCodeByGroup() throws Exception{ public void getAllCodeByGroup() throws Exception{
FormCodeGroupRQ groupRq = FormCodeGroupRQ.builder().groupCd("NEW_GROUP001").siteCd("KAC").groupCdNm("신규그룹001").rm("비고....").build();
comCodeService.createCodeGroup(groupRq);
FormCodeRQ codeRq = FormCodeRQ.builder().groupCd("NEW_GROUP001").cdId("NEW_CODE001").upperCd(null).sortOrdr(0).addInfoValue("추가!!").useYn("Y").build();
comCodeService.createCode(codeRq);
FormCodeLangRQ langRq = FormCodeLangRQ.builder().groupCd("NEW_GROUP001").cdId("NEW_CODE001").langDivCd("ko_KR").cdNm("신규코드001").rm("비고....").build();
comCodeService.createCodeLang(langRq);
String groupCd = "NEW_GROUP001"; String groupCd = "NEW_GROUP001";
String langDivCd = "ko_KR"; String langDivCd = "ko_KR";
@ -412,8 +471,8 @@ public class ComnCodeControllerTest extends BaseTest {
parameterWithName("langDivCd").description("언어코드") parameterWithName("langDivCd").description("언어코드")
), ),
responseFields( responseFields(
fieldWithPath("[].groupCd").type(JsonFieldType.STRING).description("코드의 그룹"), fieldWithPath("[].groupCd").type(JsonFieldType.STRING).description("코드의 그룹").optional(),
fieldWithPath("[].cdId").type(JsonFieldType.STRING).description("코드의 ID"), fieldWithPath("[].cdId").type(JsonFieldType.STRING).description("코드의 ID").optional(),
fieldWithPath("[].cdNm").type(JsonFieldType.STRING).description("코드의 이름").optional(), fieldWithPath("[].cdNm").type(JsonFieldType.STRING).description("코드의 이름").optional(),
fieldWithPath("[].upperCd").type(JsonFieldType.STRING).description("상위 코드의 이름").optional(), fieldWithPath("[].upperCd").type(JsonFieldType.STRING).description("상위 코드의 이름").optional(),
fieldWithPath("[].sortOrdr").type(JsonFieldType.NUMBER).description("코드의 정렬순서").optional(), fieldWithPath("[].sortOrdr").type(JsonFieldType.NUMBER).description("코드의 정렬순서").optional(),
@ -425,8 +484,20 @@ public class ComnCodeControllerTest extends BaseTest {
.andExpect(status().isOk()); .andExpect(status().isOk());
} }
@DisplayName("[8] 모든 그룹과 코드 조회")
@Order(8)
@Test @Test
public void getAllGroupCode() throws Exception{ public void getAllGroupCode() throws Exception{
FormCodeGroupRQ groupRq = FormCodeGroupRQ.builder().groupCd("NEW_GROUP001").siteCd("KAC").groupCdNm("신규그룹001").rm("비고....").build();
comCodeService.createCodeGroup(groupRq);
FormCodeRQ codeRq = FormCodeRQ.builder().groupCd("NEW_GROUP001").cdId("NEW_CODE001").upperCd(null).sortOrdr(0).addInfoValue("추가!!").useYn("Y").build();
comCodeService.createCode(codeRq);
FormCodeLangRQ langRq = FormCodeLangRQ.builder().groupCd("NEW_GROUP001").cdId("NEW_CODE001").langDivCd("ko_KR").cdNm("신규코드001").rm("비고....").build();
comCodeService.createCodeLang(langRq);
this.mockMvc.perform( this.mockMvc.perform(
get(this.BASE_URL + "/group") get(this.BASE_URL + "/group")
.contentType(MediaType.APPLICATION_JSON_VALUE) .contentType(MediaType.APPLICATION_JSON_VALUE)
@ -438,10 +509,10 @@ public class ComnCodeControllerTest extends BaseTest {
"com/code/group", // gradle build를 하게 되면 generated-snippets에 만들어질 폴더이름 "com/code/group", // gradle build를 하게 되면 generated-snippets에 만들어질 폴더이름
preprocessResponse(prettyPrint()), preprocessResponse(prettyPrint()),
responseFields( responseFields(
fieldWithPath("[].groupCd").type(JsonFieldType.STRING).description("그룹 코드"), fieldWithPath("[].groupCd").type(JsonFieldType.STRING).description("그룹 코드").optional(),
fieldWithPath("[].siteCd").type(JsonFieldType.STRING).description("사이트 코드"), fieldWithPath("[].siteCd").type(JsonFieldType.STRING).description("사이트 코드").optional(),
fieldWithPath("[].groupCdNm").type(JsonFieldType.STRING).description("그룹 명"), fieldWithPath("[].groupCdNm").type(JsonFieldType.STRING).description("그룹 명").optional(),
fieldWithPath("[].rm").type(JsonFieldType.STRING).description("비고"), fieldWithPath("[].rm").type(JsonFieldType.STRING).description("비고").optional(),
fieldWithPath("[].codeList").type(JsonFieldType.ARRAY).description("그룹에 포함된 코드 리스트").optional() fieldWithPath("[].codeList").type(JsonFieldType.ARRAY).description("그룹에 포함된 코드 리스트").optional()
) )
) )
@ -449,9 +520,20 @@ public class ComnCodeControllerTest extends BaseTest {
.andExpect(status().isOk()); .andExpect(status().isOk());
} }
@DisplayName("[9] 모든 그룹 조회")
@Order(9)
@Test @Test
public void getAllGroup() throws Exception{ public void getAllGroup() throws Exception{
FormCodeGroupRQ groupRq = FormCodeGroupRQ.builder().groupCd("NEW_GROUP001").siteCd("KAC").groupCdNm("신규그룹001").rm("비고....").build();
comCodeService.createCodeGroup(groupRq);
FormCodeRQ codeRq = FormCodeRQ.builder().groupCd("NEW_GROUP001").cdId("NEW_CODE001").upperCd(null).sortOrdr(0).addInfoValue("추가!!").useYn("Y").build();
comCodeService.createCode(codeRq);
FormCodeLangRQ langRq = FormCodeLangRQ.builder().groupCd("NEW_GROUP001").cdId("NEW_CODE001").langDivCd("ko_KR").cdNm("신규코드001").rm("비고....").build();
comCodeService.createCodeLang(langRq);
String siteCd = "KAC"; String siteCd = "KAC";
String langDivCd = "ko_KR"; String langDivCd = "ko_KR";
@ -472,13 +554,13 @@ public class ComnCodeControllerTest extends BaseTest {
parameterWithName("langDivCd").description("언어코드") parameterWithName("langDivCd").description("언어코드")
), ),
responseFields( responseFields(
fieldWithPath("[].groupCd").type(JsonFieldType.STRING).description("그룹 코드"), fieldWithPath("[].groupCd").type(JsonFieldType.STRING).description("그룹 코드").optional(),
fieldWithPath("[].siteCd").type(JsonFieldType.STRING).description("사이트 코드"), fieldWithPath("[].siteCd").type(JsonFieldType.STRING).description("사이트 코드").optional(),
fieldWithPath("[].groupCdNm").type(JsonFieldType.STRING).description("그룹 명"), fieldWithPath("[].groupCdNm").type(JsonFieldType.STRING).description("그룹 명").optional(),
fieldWithPath("[].rm").type(JsonFieldType.STRING).description("비고"), fieldWithPath("[].rm").type(JsonFieldType.STRING).description("비고").optional(),
fieldWithPath("[].codeList").type(JsonFieldType.ARRAY).description("그룹에 포함된 코드 리스트").optional(), fieldWithPath("[].codeList").type(JsonFieldType.ARRAY).description("그룹에 포함된 코드 리스트").optional(),
fieldWithPath("[].codeList[].groupCd").type(JsonFieldType.STRING).description("코드의 그룹"), fieldWithPath("[].codeList[].groupCd").type(JsonFieldType.STRING).description("코드의 그룹").optional(),
fieldWithPath("[].codeList[].cdId").type(JsonFieldType.STRING).description("코드의 ID"), fieldWithPath("[].codeList[].cdId").type(JsonFieldType.STRING).description("코드의 ID").optional(),
fieldWithPath("[].codeList[].cdNm").type(JsonFieldType.STRING).description("코드의 이름").optional(), fieldWithPath("[].codeList[].cdNm").type(JsonFieldType.STRING).description("코드의 이름").optional(),
fieldWithPath("[].codeList[].upperCd").type(JsonFieldType.STRING).description("상위 코드의 이름").optional(), fieldWithPath("[].codeList[].upperCd").type(JsonFieldType.STRING).description("상위 코드의 이름").optional(),
fieldWithPath("[].codeList[].sortOrdr").type(JsonFieldType.NUMBER).description("코드의 정렬순서").optional(), fieldWithPath("[].codeList[].sortOrdr").type(JsonFieldType.NUMBER).description("코드의 정렬순서").optional(),

11
app/kac-app/src/test/resources/org/springframework/restdocs/templates/path-parameters.snippet vendored

@ -0,0 +1,11 @@
.+{{path}}+
|===
|파라미터|설명|필수
{{#parameters}}
|{{#tableCellContent}}`+{{name}}+`{{/tableCellContent}}
|{{#tableCellContent}}{{description}}{{/tableCellContent}}
|{{#tableCellContent}}{{#optional}}false{{/optional}}{{^optional}}true{{/optional}}{{/tableCellContent}}
{{/parameters}}
|===

10
app/kac-app/src/test/resources/org/springframework/restdocs/templates/query-parameters.snippet vendored

@ -0,0 +1,10 @@
|===
|파라미터|설명|필수
{{#parameters}}
|{{#tableCellContent}}`+{{name}}+`{{/tableCellContent}}
|{{#tableCellContent}}{{description}}{{/tableCellContent}}
|{{#tableCellContent}}{{#optional}}false{{/optional}}{{^optional}}true{{/optional}}{{/tableCellContent}}
{{/parameters}}
|===

12
app/kac-app/src/test/resources/org/springframework/restdocs/templates/request-fields.snippet vendored

@ -0,0 +1,12 @@
|===
|파라미터|타입|설명|필수
{{#fields}}
|{{#tableCellContent}}`+{{path}}+`{{/tableCellContent}}
|{{#tableCellContent}}`+{{type}}+`{{/tableCellContent}}
|{{#tableCellContent}}{{description}}{{/tableCellContent}}
|{{#tableCellContent}}{{#optional}}false{{/optional}}{{^optional}}true{{/optional}}{{/tableCellContent}}
{{/fields}}
|===

10
app/kac-app/src/test/resources/org/springframework/restdocs/templates/request-headers.snippet vendored

@ -0,0 +1,10 @@
|===
|파라미터|설명|필수
{{#headers}}
|{{#tableCellContent}}`+{{name}}+`{{/tableCellContent}}
|{{#tableCellContent}}{{description}}{{/tableCellContent}}
|{{#tableCellContent}}{{#optional}}false{{/optional}}{{^optional}}true{{/optional}}{{/tableCellContent}}
{{/headers}}
|===

12
app/kac-app/src/test/resources/org/springframework/restdocs/templates/response-fields.snippet vendored

@ -0,0 +1,12 @@
|===
|파라미터|타입|설명|필수
{{#fields}}
|{{#tableCellContent}}`+{{path}}+`{{/tableCellContent}}
|{{#tableCellContent}}`+{{type}}+`{{/tableCellContent}}
|{{#tableCellContent}}{{description}}{{/tableCellContent}}
|{{#tableCellContent}}{{#optional}}false{{/optional}}{{^optional}}true{{/optional}}{{/tableCellContent}}
{{/fields}}
|===
Loading…
Cancel
Save