Skip to content

Commit

Permalink
Merge pull request #65 from Stumeet/dev
Browse files Browse the repository at this point in the history
✅ [STMT-146] 닉네임 유효성 검사 API 테스트 코드 추가 (#64)
  • Loading branch information
zxcv9203 authored Feb 29, 2024
2 parents aaf88b1 + e697cee commit 879730b
Show file tree
Hide file tree
Showing 4 changed files with 148 additions and 1 deletion.
25 changes: 25 additions & 0 deletions src/docs/asciidoc/index.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -69,8 +69,33 @@ include::{snippets}/token_renew/fail/expired-refresh-token/response-body.adoc[]
include::{snippets}/token_renew/fail/expired-refresh-token/response-fields.adoc[]


== 사용자 닉네임 유효성 검사

사용자 닉네임의 유효성을 검사하는 API입니다.

=== GET /api/v1/members/validate-nickname

==== 요청
include::{snippets}/validate_nickname/success/http-request.adoc[]
include::{snippets}/validate_nickname/success/request-headers.adoc[]
include::{snippets}/validate_nickname/success/query-parameters.adoc[]

==== 응답 성공 (200)

==== 응답 실패 (400)

.닉네임이 유효성 검사에 실패한 경우
include::{snippets}/validate_nickname/fail/invalid/response-body.adoc[]
include::{snippets}/validate_nickname/fail/invalid/response-fields.adoc[]

.닉네임이 이미 존재하는 경우
include::{snippets}/validate_nickname/fail/duplicate/response-body.adoc[]
include::{snippets}/validate_nickname/fail/duplicate/response-fields.adoc[]

== 분야 정보 전체 조회

모든 분야 정보를 조회하는 API입니다.

=== GET /api/v1/professions

==== 요청
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import org.springframework.web.bind.ServletRequestBindingException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.method.annotation.HandlerMethodValidationException;
import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;

@Slf4j
Expand Down Expand Up @@ -79,7 +80,8 @@ protected ResponseEntity<ApiResponse> handleMethodArgumentTypeMismatchException(
HttpMessageNotReadableException.class,
InvalidFormatException.class,
ServletRequestBindingException.class,
MissingServletRequestParameterException.class
MissingServletRequestParameterException.class,
HandlerMethodValidationException.class
})
protected ResponseEntity<ApiResponse> handleInvalidFormatException(final Exception e) {
log.warn(ERROR_LOG_MESSAGE, e.getClass().getSimpleName(), e.getMessage());
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
package com.stumeet.server.member.adapter.in.web;

import com.stumeet.server.common.auth.model.AuthenticationHeader;
import com.stumeet.server.member.adapter.out.persistence.JpaMemberRepository;
import com.stumeet.server.member.adapter.out.persistence.MemberJpaEntity;
import com.stumeet.server.stub.MemberStub;
import com.stumeet.server.stub.TokenStub;
import com.stumeet.server.template.ApiTest;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.test.context.support.WithMockUser;
import org.springframework.transaction.annotation.Transactional;

import static org.springframework.restdocs.headers.HeaderDocumentation.headerWithName;
import static org.springframework.restdocs.headers.HeaderDocumentation.requestHeaders;
import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document;
import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get;
import static org.springframework.restdocs.operation.preprocess.Preprocessors.*;
import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath;
import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields;
import static org.springframework.restdocs.request.RequestDocumentation.parameterWithName;
import static org.springframework.restdocs.request.RequestDocumentation.queryParameters;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;


@Transactional
class MemberValidApiTest extends ApiTest {

@Autowired
private JpaMemberRepository jpaMemberRepository;

@Nested
@DisplayName("닉네임 중복 검증")
class IsDuplicateNickname {

private final String path = "/api/v1/members/validate-nickname";
private MemberJpaEntity member;

@BeforeEach
void setUp() {
member = jpaMemberRepository.save(MemberStub.getMemberEntity());
}

@Test
@WithMockUser
@DisplayName("[성공] 유효한 닉네임을 입력하면 중복 검증에 통과한다.")
void successTest() throws Exception {
String nickname = "닉네임";
mockMvc.perform(get(path)
.header(AuthenticationHeader.ACCESS_TOKEN.getName(), TokenStub.getMockAccessToken())
.param("nickname", nickname))
.andExpect(status().isOk())
.andDo(document("validate_nickname/success",
preprocessRequest(prettyPrint()),
preprocessResponse(prettyPrint()),
requestHeaders(
headerWithName(AuthenticationHeader.ACCESS_TOKEN.getName()).description("서버로부터 전달받은 액세스 토큰")
),
queryParameters(
parameterWithName("nickname").description("검증할 닉네임")
),
responseFields(
fieldWithPath("code").description("응답에 대한 결과 코드"),
fieldWithPath("message").description("응답에 대한 메시지")
)));
}

@Test
@WithMockUser
@DisplayName("[실패] 유효하지 않은 닉네임을 입력하면 검증에 실패합니다.")
void invalidRequestTest() throws Exception {
String nickname = "닉";
mockMvc.perform(get(path)
.header(AuthenticationHeader.ACCESS_TOKEN.getName(), TokenStub.getMockAccessToken())
.param("nickname", nickname))
.andExpect(status().isBadRequest())
.andDo(document("validate_nickname/fail/invalid",
preprocessRequest(prettyPrint()),
preprocessResponse(prettyPrint()),
requestHeaders(
headerWithName(AuthenticationHeader.ACCESS_TOKEN.getName()).description("서버로부터 전달받은 액세스 토큰")
),
queryParameters(
parameterWithName("nickname").description("검증할 닉네임")
),
responseFields(
fieldWithPath("code").description("응답에 대한 결과 코드"),
fieldWithPath("message").description("응답에 대한 메시지")
)));
}

@Test
@WithMockUser
@DisplayName("[실패] 닉네임이 중복되면 검증에 실패합니다.")
void duplicateNicknameTest() throws Exception {
String nickname = member.getName();
mockMvc.perform(get(path)
.header(AuthenticationHeader.ACCESS_TOKEN.getName(), TokenStub.getMockAccessToken())
.param("nickname", nickname))
.andExpect(status().isBadRequest())
.andDo(document("validate_nickname/fail/duplicate",
preprocessRequest(prettyPrint()),
preprocessResponse(prettyPrint()),
requestHeaders(
headerWithName(AuthenticationHeader.ACCESS_TOKEN.getName()).description("서버로부터 전달받은 액세스 토큰")
),
queryParameters(
parameterWithName("nickname").description("검증할 닉네임")
),
responseFields(
fieldWithPath("code").description("응답에 대한 결과 코드"),
fieldWithPath("message").description("응답에 대한 메시지")
)));
}
}
}
1 change: 1 addition & 0 deletions src/test/java/com/stumeet/server/stub/MemberStub.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ public static String getInvalidKakaoAccessTokenInfo() {
public static MemberJpaEntity getMemberEntity() {
return MemberJpaEntity.builder()
.id(1L)
.name("test")
.role(UserRole.FIRST_LOGIN)
.authType(AuthType.OAUTH)
.sugarContents(0.0)
Expand Down

0 comments on commit 879730b

Please sign in to comment.