Skip to content

Commit cfbc643

Browse files
authored
Merge pull request #347 from Clokey-dev/develop
[deploy] 배포
2 parents ee44ec0 + c33c7cd commit cfbc643

File tree

7 files changed

+110
-31
lines changed

7 files changed

+110
-31
lines changed

clokey-api/src/main/java/org/clokey/domain/member/controller/MemberController.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import jakarta.validation.Valid;
77
import lombok.RequiredArgsConstructor;
88
import org.clokey.code.GlobalBaseSuccessCode;
9-
import org.clokey.domain.member.dto.request.DuplicatedIdCheckRequest;
9+
import org.clokey.domain.member.dto.request.DuplicatedNicknameCheckRequest;
1010
import org.clokey.domain.member.dto.request.ProfileUpdateRequest;
1111
import org.clokey.domain.member.dto.response.*;
1212
import org.clokey.domain.member.service.MemberService;
@@ -42,7 +42,7 @@ public BaseResponse<Void> updateProfile(@Valid @RequestBody ProfileUpdateRequest
4242
summary = "닉네임 중복확인",
4343
description = "닉네임 중복을 확인합니다.")
4444
public BaseResponse<DuplicatedIdCheckResponse> checkDuplicateNickname(
45-
@Valid @RequestBody DuplicatedIdCheckRequest request) {
45+
@Valid @RequestBody DuplicatedNicknameCheckRequest request) {
4646

4747
DuplicatedIdCheckResponse response = memberService.checkDuplicateNickname(request);
4848
return BaseResponse.onSuccess(GlobalBaseSuccessCode.OK, response);

clokey-api/src/main/java/org/clokey/domain/member/dto/request/DuplicatedIdCheckRequest.java

Lines changed: 0 additions & 13 deletions
This file was deleted.
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package org.clokey.domain.member.dto.request;
2+
3+
import io.swagger.v3.oas.annotations.media.Schema;
4+
import jakarta.validation.constraints.NotBlank;
5+
import jakarta.validation.constraints.Pattern;
6+
import jakarta.validation.constraints.Size;
7+
8+
public record DuplicatedNicknameCheckRequest(
9+
@NotBlank(message = "닉네임은 비워둘 수 없습니다.")
10+
@Size(max = 20, message = "닉네임은 20자 이하여야 합니다.")
11+
@Pattern(
12+
regexp = "^[a-z가-힣._]+$",
13+
message = "닉네임은 영어 소문자, 한글, 언더바(_), 점(.)만 허용됩니다.")
14+
@Schema(description = "중복을 확인할 닉네임", example = "clokey.홍길동")
15+
String nickname) {}

clokey-api/src/main/java/org/clokey/domain/member/service/MemberService.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package org.clokey.domain.member.service;
22

3-
import org.clokey.domain.member.dto.request.DuplicatedIdCheckRequest;
3+
import org.clokey.domain.member.dto.request.DuplicatedNicknameCheckRequest;
44
import org.clokey.domain.member.dto.request.ProfileUpdateRequest;
55
import org.clokey.domain.member.dto.response.*;
66
import org.clokey.global.paging.SortDirection;
@@ -10,7 +10,7 @@ public interface MemberService {
1010

1111
void updateProfile(ProfileUpdateRequest request);
1212

13-
DuplicatedIdCheckResponse checkDuplicateNickname(DuplicatedIdCheckRequest request);
13+
DuplicatedIdCheckResponse checkDuplicateNickname(DuplicatedNicknameCheckRequest request);
1414

1515
void toggleFollow(Long userId);
1616

clokey-api/src/main/java/org/clokey/domain/member/service/MemberServiceImpl.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import java.util.Optional;
55
import lombok.RequiredArgsConstructor;
66
import org.clokey.domain.history.repository.HistoryRepository;
7-
import org.clokey.domain.member.dto.request.DuplicatedIdCheckRequest;
7+
import org.clokey.domain.member.dto.request.DuplicatedNicknameCheckRequest;
88
import org.clokey.domain.member.dto.request.ProfileUpdateRequest;
99
import org.clokey.domain.member.dto.response.*;
1010
import org.clokey.domain.member.event.NewFollowerEvent;
@@ -70,7 +70,8 @@ public void updateProfile(ProfileUpdateRequest request) {
7070
}
7171

7272
@Override
73-
public DuplicatedIdCheckResponse checkDuplicateNickname(DuplicatedIdCheckRequest request) {
73+
public DuplicatedIdCheckResponse checkDuplicateNickname(
74+
DuplicatedNicknameCheckRequest request) {
7475
final Member currentMember = memberUtil.getCurrentMember();
7576

7677
boolean duplicated =

clokey-api/src/test/java/org/clokey/domain/member/controller/MemberControllerTest.java

Lines changed: 84 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.clokey.domain.member.controller;
22

3+
import static org.hamcrest.Matchers.containsString;
34
import static org.mockito.ArgumentMatchers.any;
45
import static org.mockito.BDDMockito.given;
56
import static org.mockito.BDDMockito.willDoNothing;
@@ -9,7 +10,7 @@
910

1011
import com.fasterxml.jackson.databind.ObjectMapper;
1112
import java.util.List;
12-
import org.clokey.domain.member.dto.request.DuplicatedIdCheckRequest;
13+
import org.clokey.domain.member.dto.request.DuplicatedNicknameCheckRequest;
1314
import org.clokey.domain.member.dto.request.ProfileUpdateRequest;
1415
import org.clokey.domain.member.dto.response.*;
1516
import org.clokey.domain.member.service.MemberService;
@@ -94,7 +95,9 @@ class 프로필_수정_요청_시 {
9495
.andExpect(jsonPath("$.isSuccess").value(false))
9596
.andExpect(jsonPath("$.code").value("COMMON400"))
9697
.andExpect(jsonPath("$.message").value("잘못된 요청입니다."))
97-
.andExpect(jsonPath("$.result.nickname").value("닉네임은 비워둘 수 없습니다."));
98+
.andExpect(
99+
jsonPath("$.result.nickname")
100+
.value(containsString("닉네임은 비워둘 수 없습니다.")));
98101
}
99102

100103
@ParameterizedTest
@@ -121,7 +124,9 @@ class 프로필_수정_요청_시 {
121124
.andExpect(jsonPath("$.isSuccess").value(false))
122125
.andExpect(jsonPath("$.code").value("COMMON400"))
123126
.andExpect(jsonPath("$.message").value("잘못된 요청입니다."))
124-
.andExpect(jsonPath("$.result.nickname").value("닉네임은 비워둘 수 없습니다."));
127+
.andExpect(
128+
jsonPath("$.result.nickname")
129+
.value(containsString("닉네임은 비워둘 수 없습니다.")));
125130
}
126131

127132
@Test
@@ -157,7 +162,8 @@ class 아이디_중복확인_요청_시 {
157162
@Test
158163
void 유효한_요청이면_중복_여부를_반환한다() throws Exception {
159164
// given
160-
DuplicatedIdCheckRequest request = new DuplicatedIdCheckRequest("test_clokey_id");
165+
DuplicatedNicknameCheckRequest request =
166+
new DuplicatedNicknameCheckRequest("clokey.홍길동");
161167
DuplicatedIdCheckResponse response = new DuplicatedIdCheckResponse(true);
162168

163169
given(memberService.checkDuplicateNickname(request)).willReturn(response);
@@ -180,7 +186,7 @@ class 아이디_중복확인_요청_시 {
180186
@Test
181187
void 닉네임이_null이면_예외가_발생한다() throws Exception {
182188
// given
183-
DuplicatedIdCheckRequest request = new DuplicatedIdCheckRequest(null);
189+
DuplicatedNicknameCheckRequest request = new DuplicatedNicknameCheckRequest(null);
184190

185191
// when
186192
ResultActions perform =
@@ -197,12 +203,37 @@ class 아이디_중복확인_요청_시 {
197203
.andExpect(jsonPath("$.result.nickname").value("닉네임은 비워둘 수 없습니다."));
198204
}
199205

200-
// 허용 종류 : 영문(소문자) , 숫자, 언더바(_), 점(.)
201206
@ParameterizedTest
202-
@ValueSource(strings = {"clokey clokey", "CLOKEY", "클로키", "clokey-user", "clokey,,user^^"})
207+
@NullAndEmptySource
208+
@ValueSource(strings = {" "})
209+
void 닉네임이_비어있으면_예외가_발생한다(String nickname) throws Exception {
210+
// given
211+
DuplicatedNicknameCheckRequest request = new DuplicatedNicknameCheckRequest(nickname);
212+
213+
// when
214+
ResultActions perform =
215+
mockMvc.perform(
216+
post("/users/check-duplicate-nickname")
217+
.contentType(MediaType.APPLICATION_JSON)
218+
.content(objectMapper.writeValueAsString(request)));
219+
220+
// then
221+
perform.andExpect(status().isBadRequest())
222+
.andExpect(jsonPath("$.isSuccess").value(false))
223+
.andExpect(jsonPath("$.code").value("COMMON400"))
224+
.andExpect(jsonPath("$.message").value("잘못된 요청입니다."))
225+
.andExpect(
226+
jsonPath("$.result.nickname")
227+
.value(containsString("닉네임은 비워둘 수 없습니다.")));
228+
}
229+
230+
// 허용 종류 : 영어 소문자, 한글, 언더바(_), 점(.)
231+
@ParameterizedTest
232+
@ValueSource(
233+
strings = {"clokey clokey", "CLOKEY", "clokey-user", "clokey,,user^^", "clokey1"})
203234
void 닉네임_제약조건을_위배하면_예외가_발생한다(String nickname) throws Exception {
204235
// given
205-
DuplicatedIdCheckRequest request = new DuplicatedIdCheckRequest(nickname);
236+
DuplicatedNicknameCheckRequest request = new DuplicatedNicknameCheckRequest(nickname);
206237

207238
// when
208239
ResultActions perform =
@@ -218,7 +249,51 @@ class 아이디_중복확인_요청_시 {
218249
.andExpect(jsonPath("$.message").value("잘못된 요청입니다."))
219250
.andExpect(
220251
jsonPath("$.result.nickname")
221-
.value("닉네임은 영어 소문자, 숫자, 언더바(_), 점(.)만 허용됩니다."));
252+
.value("닉네임은 영어 소문자, 한글, 언더바(_), 점(.)만 허용됩니다."));
253+
}
254+
255+
@Test
256+
void 닉네임이_20자를_초과하면_예외가_발생한다() throws Exception {
257+
// given
258+
DuplicatedNicknameCheckRequest request =
259+
new DuplicatedNicknameCheckRequest("abcdefghijklmnopqrstu");
260+
261+
// when
262+
ResultActions perform =
263+
mockMvc.perform(
264+
post("/users/check-duplicate-nickname")
265+
.contentType(MediaType.APPLICATION_JSON)
266+
.content(objectMapper.writeValueAsString(request)));
267+
268+
// then
269+
perform.andExpect(status().isBadRequest())
270+
.andExpect(jsonPath("$.isSuccess").value(false))
271+
.andExpect(jsonPath("$.code").value("COMMON400"))
272+
.andExpect(jsonPath("$.message").value("잘못된 요청입니다."))
273+
.andExpect(jsonPath("$.result.nickname").value("닉네임은 20자 이하여야 합니다."));
274+
}
275+
276+
@ParameterizedTest
277+
@ValueSource(strings = {"clokey", "홍길동", "clokey.홍길동", "abc_def"})
278+
void 닉네임_제약조건을_만족하면_중복_여부를_반환한다(String nickname) throws Exception {
279+
// given
280+
DuplicatedNicknameCheckRequest request = new DuplicatedNicknameCheckRequest(nickname);
281+
DuplicatedIdCheckResponse response = new DuplicatedIdCheckResponse(false);
282+
given(memberService.checkDuplicateNickname(request)).willReturn(response);
283+
284+
// when
285+
ResultActions perform =
286+
mockMvc.perform(
287+
post("/users/check-duplicate-nickname")
288+
.contentType(MediaType.APPLICATION_JSON)
289+
.content(objectMapper.writeValueAsString(request)));
290+
291+
// then
292+
perform.andExpect(status().isOk())
293+
.andExpect(jsonPath("$.isSuccess").value(true))
294+
.andExpect(jsonPath("$.code").value("COMMON200"))
295+
.andExpect(jsonPath("$.message").value("성공입니다."))
296+
.andExpect(jsonPath("$.result.duplicated").value(false));
222297
}
223298
}
224299

clokey-api/src/test/java/org/clokey/domain/member/service/MemberServiceTest.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import java.util.Optional;
88
import org.clokey.IntegrationTest;
99
import org.clokey.TransactionUtil;
10-
import org.clokey.domain.member.dto.request.DuplicatedIdCheckRequest;
10+
import org.clokey.domain.member.dto.request.DuplicatedNicknameCheckRequest;
1111
import org.clokey.domain.member.dto.request.ProfileUpdateRequest;
1212
import org.clokey.domain.member.dto.response.BlockedMemberResponse;
1313
import org.clokey.domain.member.dto.response.FollowMemberResponse;
@@ -135,7 +135,7 @@ void setUp() {
135135
@ValueSource(strings = {"testNickname1", "distinctId1", "distinctId2"})
136136
void 현재_닉네임_또는_중복되지_않는_닉네임을_입력하면_false를_반환한다(String nickname) {
137137
// given
138-
DuplicatedIdCheckRequest request = new DuplicatedIdCheckRequest(nickname);
138+
DuplicatedNicknameCheckRequest request = new DuplicatedNicknameCheckRequest(nickname);
139139

140140
// when& then
141141
assertThat(memberService.checkDuplicateNickname(request).duplicated()).isFalse();
@@ -144,7 +144,8 @@ void setUp() {
144144
@Test
145145
void 중복되는_닉네임을_입력한_경우_true를_반환한다() {
146146
// given
147-
DuplicatedIdCheckRequest request = new DuplicatedIdCheckRequest("testNickname2");
147+
DuplicatedNicknameCheckRequest request =
148+
new DuplicatedNicknameCheckRequest("testNickname2");
148149

149150
// when& then
150151
assertThat(memberService.checkDuplicateNickname(request).duplicated()).isTrue();

0 commit comments

Comments
 (0)