Skip to content

Commit 2fb800c

Browse files
committed
Member 실패 성공 통합테스트
1 parent ea7fd1c commit 2fb800c

3 files changed

Lines changed: 194 additions & 1 deletion

File tree

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
package io.twogether.nbe_5_7_2_02team.member;
2+
3+
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
4+
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.multipart;
5+
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
6+
7+
import com.github.database.rider.core.api.dataset.DataSet;
8+
import io.twogether.nbe_5_7_2_02team.browser.template.BrowserTestTemplate;
9+
import io.twogether.nbe_5_7_2_02team.global.annotation.FlywayReset;
10+
import io.twogether.nbe_5_7_2_02team.member.dao.MemberRepository;
11+
import io.twogether.nbe_5_7_2_02team.member.domain.Member;
12+
import io.twogether.nbe_5_7_2_02team.oauth.dto.common.TokenPair;
13+
import org.junit.jupiter.api.DisplayName;
14+
import org.junit.jupiter.api.Test;
15+
import org.springframework.beans.factory.annotation.Autowired;
16+
import org.springframework.http.HttpMethod;
17+
import org.springframework.mock.web.MockMultipartFile;
18+
19+
@FlywayReset
20+
public class MemberBrowserFailureTest extends BrowserTestTemplate {
21+
22+
@Autowired
23+
MemberRepository memberRepository;
24+
25+
@Test
26+
@DataSet(value = "datasets/v2/member.yml", cleanBefore = true, cleanAfter = true)
27+
@DisplayName("GET: /api/member/me - 인증 토큰 없음")
28+
void getMyProfile_Unauthorized() throws Exception {
29+
30+
mockMvc.perform(get("/api/member/me"))
31+
.andExpect(status().isUnauthorized()); // 401
32+
}
33+
34+
@Test
35+
@DataSet(value = "datasets/v2/member.yml", cleanBefore = true, cleanAfter = true)
36+
@DisplayName("GET: /api/member/{id} - 존재하지 않는 회원 ID 조회")
37+
void getOtherProfile_NotFound() throws Exception {
38+
39+
long memberId = 1L;
40+
Member member = memberRepository.findById(memberId).orElseThrow();
41+
TokenPair tokenPair = jwtTokenProvider.generateTokenPair(member);
42+
43+
long invalidId = 9999L;
44+
45+
mockMvc.perform(get("/api/member/" + invalidId)
46+
.header("Authorization", "Bearer " + tokenPair.getAccessToken()))
47+
.andExpect(status().isNotFound()); // 404
48+
49+
}
50+
51+
@Test
52+
@DataSet(value = "datasets/v2/member.yml", cleanBefore = true, cleanAfter = true)
53+
@DisplayName("PATCH: /api/member/me - 인증 토큰 없음")
54+
void updateMyProfile_Unauthorized() throws Exception {
55+
MockMultipartFile image = new MockMultipartFile(
56+
"image",
57+
"a.png",
58+
"image/png",
59+
"dummy".getBytes());
60+
61+
mockMvc.perform(multipart(HttpMethod.PATCH, "/api/member/me")
62+
.file(image)
63+
.param("nickname", "memberNickname"))
64+
.andExpect(status().isUnauthorized());
65+
}
66+
67+
@Test
68+
@DataSet(value = "datasets/v2/member.yml", cleanBefore = true, cleanAfter = true)
69+
@DisplayName("PATCH: /api/member/me - 닉네임 누락 (공백)")
70+
void updateMyProfile_NicknameBlank() throws Exception {
71+
72+
long memberId = 1L;
73+
74+
Member member = memberRepository.findById(memberId).orElseThrow();
75+
TokenPair tokenPair = jwtTokenProvider.generateTokenPair(member);
76+
77+
MockMultipartFile image = new MockMultipartFile(
78+
"image",
79+
"a.png",
80+
"image/png",
81+
"dummy".getBytes());
82+
83+
mockMvc.perform(multipart(HttpMethod.PATCH, "/api/member/me")
84+
.file(image)
85+
.param("nickname", " ") // 공백
86+
.header("Authorization", "Bearer " + tokenPair.getAccessToken()))
87+
.andExpect(status().isBadRequest());
88+
}
89+
90+
}
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
package io.twogether.nbe_5_7_2_02team.member;
2+
3+
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
4+
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.multipart;
5+
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
6+
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
7+
8+
import com.github.database.rider.core.api.dataset.DataSet;
9+
import io.twogether.nbe_5_7_2_02team.browser.template.BrowserTestTemplate;
10+
import io.twogether.nbe_5_7_2_02team.global.annotation.FlywayReset;
11+
import io.twogether.nbe_5_7_2_02team.member.dao.MemberRepository;
12+
import io.twogether.nbe_5_7_2_02team.member.domain.Member;
13+
import io.twogether.nbe_5_7_2_02team.oauth.dto.common.TokenPair;
14+
import org.junit.jupiter.api.DisplayName;
15+
import org.junit.jupiter.api.Test;
16+
import org.springframework.beans.factory.annotation.Autowired;
17+
import org.springframework.http.HttpMethod;
18+
import org.springframework.http.MediaType;
19+
import org.springframework.mock.web.MockMultipartFile;
20+
21+
@FlywayReset
22+
public class MemberBrowserSuccessTest extends BrowserTestTemplate {
23+
24+
@Autowired
25+
MemberRepository memberRepository;
26+
27+
@Test
28+
@DataSet(value = "datasets/v2/member.yml", cleanBefore = true, cleanAfter = true)
29+
@DisplayName("GET: /api/member/me - 자기 정보 조회 성공")
30+
void getMyProfileSuccess() throws Exception {
31+
32+
long memberId = 1L;
33+
Member member = memberRepository.findById(memberId).orElseThrow();
34+
TokenPair tokenPair = jwtTokenProvider.generateTokenPair(member);
35+
36+
mockMvc.perform(
37+
get("/api/member/me")
38+
.header("Authorization", "Bearer " + tokenPair.getAccessToken()))
39+
.andExpect(status().isOk())
40+
.andExpect(jsonPath("$.id").value(memberId))
41+
.andExpect(jsonPath("$.name").value(member.getName()))
42+
.andExpect(jsonPath("$.email").value(member.getEmail()));
43+
44+
}
45+
46+
@Test
47+
@DataSet(value = "datasets/v2/member.yml", cleanBefore = true, cleanAfter = true)
48+
@DisplayName("GET: /api/member/{id} - 타인 정보 조회 성공")
49+
void getOtherMemberProfileSuccess() throws Exception {
50+
51+
long loginMemberId = 1L;
52+
long targetMemberId = 2L;
53+
54+
Member loginMember = memberRepository.findById(loginMemberId).orElseThrow();
55+
Member targetMember = memberRepository.findById(targetMemberId).orElseThrow();
56+
57+
TokenPair tokenPair = jwtTokenProvider.generateTokenPair(loginMember);
58+
59+
mockMvc.perform(
60+
get("/api/member/" + targetMemberId)
61+
.header("Authorization", "Bearer " + tokenPair.getAccessToken()))
62+
.andExpect(status().isOk())
63+
.andExpect(jsonPath("$.id").value(targetMemberId))
64+
.andExpect(jsonPath("$.name").value(targetMember.getName()))
65+
.andExpect(jsonPath("$.email").value(targetMember.getEmail()));
66+
67+
}
68+
69+
@Test
70+
@DataSet(value = "datasets/v2/member.yml", cleanBefore = true, cleanAfter = true)
71+
@DisplayName("PATCH: /api/member/me - 본인 닉네임과 이미지 수정 성공")
72+
void updateMyProfileSuccess() throws Exception {
73+
74+
long memberId = 1L;
75+
Member member = memberRepository.findById(memberId).orElseThrow();
76+
TokenPair tokenPair = jwtTokenProvider.generateTokenPair(member);
77+
78+
String newNickName = "newNickName";
79+
String imageUrl = "newImageUrl";
80+
MockMultipartFile newImage = new MockMultipartFile(
81+
"image",
82+
"image.png",
83+
"image/png",
84+
"image".getBytes());
85+
86+
mockMvc.perform(
87+
multipart(HttpMethod.PATCH, "/api/member/me")
88+
.file(newImage)
89+
.param("nickname", newNickName)
90+
.header("Authorization", "Bearer " + tokenPair.getAccessToken())
91+
.contentType(MediaType.MULTIPART_FORM_DATA_VALUE))
92+
.andExpect(status().isOk())
93+
.andExpect(jsonPath("$.nickname").value(newNickName))
94+
.andExpect(jsonPath("$.image").isNotEmpty())
95+
.andExpect(jsonPath("$.image").value(imageUrl));
96+
97+
}
98+
99+
}

NBE_5_7_2_02TEAM/src/test/resources/datasets/v2/member.yml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,20 @@ member:
33
name: 'backend'
44
github_id: 'be_github'
55
email: 'backend@test.com'
6+
profile_image: "https://example.com/profile.jpg"
67
job: '백엔드 개발자'
78
course: '데브코스'
89
role: 'MEMBER'
910
created_at: 2025-06-03T15:36:35.223973
11+
updated_at: 2025-06-04T15:36:35.223973
1012

1113
- id: 2
1214
name: 'frontend'
1315
github_id: 'fe_github'
1416
email: 'frontend@test.com'
17+
profile_image: "https://example.com/otherprofile.jpg"
1518
job: '프론트엔드 개발자'
1619
course: '데브코스'
1720
role: 'MEMBER'
18-
created_at: 2025-06-04T15:36:35.223973
21+
created_at: 2025-06-04T15:36:35.223973
22+
updated_at: 2025-06-04T17:36:35.223973

0 commit comments

Comments
 (0)