From 11f93a1961342d66b543df49b517b206f972024b Mon Sep 17 00:00:00 2001 From: yongckim Date: Wed, 6 Mar 2024 20:52:43 +0900 Subject: [PATCH 1/4] =?UTF-8?q?:sparkles:=20[STMT-199]=20=EB=82=B4=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=20=EC=A1=B0=ED=9A=8C=20API=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adapter/in/web/MemberProfileApi.java | 13 ++++++++++++ .../web/response/MemberProfileResponse.java | 15 +++++++++++++ .../port/in/MemberProfileUseCase.java | 3 +++ .../port/in/mapper/MemberUseCaseMapper.java | 21 +++++++++++++++++++ .../service/MemberProfileService.java | 12 +++++++++++ 5 files changed, 64 insertions(+) create mode 100644 src/main/java/com/stumeet/server/member/adapter/in/web/response/MemberProfileResponse.java create mode 100644 src/main/java/com/stumeet/server/member/application/port/in/mapper/MemberUseCaseMapper.java diff --git a/src/main/java/com/stumeet/server/member/adapter/in/web/MemberProfileApi.java b/src/main/java/com/stumeet/server/member/adapter/in/web/MemberProfileApi.java index ee56e226..ac36d990 100644 --- a/src/main/java/com/stumeet/server/member/adapter/in/web/MemberProfileApi.java +++ b/src/main/java/com/stumeet/server/member/adapter/in/web/MemberProfileApi.java @@ -3,6 +3,7 @@ import com.stumeet.server.common.annotation.WebAdapter; import com.stumeet.server.common.auth.model.LoginMember; import com.stumeet.server.common.model.ApiResponse; +import com.stumeet.server.member.adapter.in.web.response.MemberProfileResponse; import com.stumeet.server.member.application.port.in.MemberProfileUseCase; import com.stumeet.server.member.application.port.in.command.MemberUpdateCommand; import jakarta.validation.Valid; @@ -10,6 +11,7 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PatchMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -31,4 +33,15 @@ public ResponseEntity> updateMyProfile( HttpStatus.OK ); } + + @GetMapping("/me") + public ResponseEntity> getMyProfile( + @AuthenticationPrincipal LoginMember member + ) { + MemberProfileResponse response = memberProfileUseCase.getProfileById(member.getMember().getId()); + return new ResponseEntity<>( + ApiResponse.success(HttpStatus.OK.value(), "내 프로필 조회에 성공했습니다.", response), + HttpStatus.OK + ); + } } diff --git a/src/main/java/com/stumeet/server/member/adapter/in/web/response/MemberProfileResponse.java b/src/main/java/com/stumeet/server/member/adapter/in/web/response/MemberProfileResponse.java new file mode 100644 index 00000000..1c7e3e61 --- /dev/null +++ b/src/main/java/com/stumeet/server/member/adapter/in/web/response/MemberProfileResponse.java @@ -0,0 +1,15 @@ +package com.stumeet.server.member.adapter.in.web.response; + +import lombok.Builder; + +@Builder +public record MemberProfileResponse( + Long id, + String image, + String nickname, + String region, + String profession, + String rank, + double experience +) { +} diff --git a/src/main/java/com/stumeet/server/member/application/port/in/MemberProfileUseCase.java b/src/main/java/com/stumeet/server/member/application/port/in/MemberProfileUseCase.java index 821dc99a..73d710ea 100644 --- a/src/main/java/com/stumeet/server/member/application/port/in/MemberProfileUseCase.java +++ b/src/main/java/com/stumeet/server/member/application/port/in/MemberProfileUseCase.java @@ -1,5 +1,6 @@ package com.stumeet.server.member.application.port.in; +import com.stumeet.server.member.adapter.in.web.response.MemberProfileResponse; import com.stumeet.server.member.application.port.in.command.MemberSignupCommand; import com.stumeet.server.member.application.port.in.command.MemberUpdateCommand; import com.stumeet.server.member.domain.Member; @@ -8,4 +9,6 @@ public interface MemberProfileUseCase { void signup(Member member, MemberSignupCommand request); void updateProfile(Member member, MemberUpdateCommand request); + + MemberProfileResponse getProfileById(Long id); } diff --git a/src/main/java/com/stumeet/server/member/application/port/in/mapper/MemberUseCaseMapper.java b/src/main/java/com/stumeet/server/member/application/port/in/mapper/MemberUseCaseMapper.java new file mode 100644 index 00000000..1374cb84 --- /dev/null +++ b/src/main/java/com/stumeet/server/member/application/port/in/mapper/MemberUseCaseMapper.java @@ -0,0 +1,21 @@ +package com.stumeet.server.member.application.port.in.mapper; + +import com.stumeet.server.member.adapter.in.web.response.MemberProfileResponse; +import com.stumeet.server.member.domain.Member; +import org.springframework.stereotype.Component; + +@Component +public class MemberUseCaseMapper { + + public MemberProfileResponse toProfileResponse(Member member) { + return MemberProfileResponse.builder() + .id(member.getId()) + .image(member.getImage()) + .nickname(member.getName()) + .region(member.getRegion()) + .profession(member.getProfession().getName()) + .rank(member.getLevel().getRank().getName()) + .experience(member.getLevel().getExperience()) + .build(); + } +} diff --git a/src/main/java/com/stumeet/server/member/application/service/MemberProfileService.java b/src/main/java/com/stumeet/server/member/application/service/MemberProfileService.java index b1e214e8..4df75290 100644 --- a/src/main/java/com/stumeet/server/member/application/service/MemberProfileService.java +++ b/src/main/java/com/stumeet/server/member/application/service/MemberProfileService.java @@ -2,11 +2,14 @@ import com.stumeet.server.common.annotation.UseCase; import com.stumeet.server.file.application.port.in.FileUploadUseCase; +import com.stumeet.server.member.adapter.in.web.response.MemberProfileResponse; import com.stumeet.server.member.application.port.in.MemberProfileUseCase; import com.stumeet.server.member.application.port.in.command.MemberProfileCommand; import com.stumeet.server.member.application.port.in.command.MemberSignupCommand; import com.stumeet.server.member.application.port.in.command.MemberUpdateCommand; +import com.stumeet.server.member.application.port.in.mapper.MemberUseCaseMapper; import com.stumeet.server.member.application.port.out.MemberCommandPort; +import com.stumeet.server.member.application.port.out.MemberQueryPort; import com.stumeet.server.member.domain.Member; import com.stumeet.server.profession.application.port.in.ProfessionQueryUseCase; import com.stumeet.server.profession.domain.Profession; @@ -21,6 +24,9 @@ public class MemberProfileService implements MemberProfileUseCase { private final ProfessionQueryUseCase professionQueryUseCase; private final FileUploadUseCase fileUploadUseCase; private final MemberCommandPort memberCommandPort; + private final MemberQueryPort memberQueryPort; + private final MemberUseCaseMapper memberUseCaseMapper; + @Override public void signup(Member member, MemberSignupCommand request) { @@ -61,4 +67,10 @@ public void updateProfile(Member member, MemberUpdateCommand request) { memberCommandPort.update(member); } + @Override + public MemberProfileResponse getProfileById(Long id) { + Member member = memberQueryPort.getById(id); + return memberUseCaseMapper.toProfileResponse(member); + } + } From e639c92458dd4d2a0de1caf72e70d1e0ecf889f6 Mon Sep 17 00:00:00 2001 From: yongckim Date: Wed, 6 Mar 2024 20:55:48 +0900 Subject: [PATCH 2/4] =?UTF-8?q?:white=5Fcheck=5Fmark:=20[STMT-199]=20?= =?UTF-8?q?=EB=A9=A4=EB=B2=84=20=EC=A0=95=EB=B3=B4=20=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?=EC=9C=A0=EC=A6=88=20=EC=BC=80=EC=9D=B4=EC=8A=A4=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/MemberProfileServiceTest.java | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/test/java/com/stumeet/server/member/application/service/MemberProfileServiceTest.java b/src/test/java/com/stumeet/server/member/application/service/MemberProfileServiceTest.java index 70d64ee1..58e95e52 100644 --- a/src/test/java/com/stumeet/server/member/application/service/MemberProfileServiceTest.java +++ b/src/test/java/com/stumeet/server/member/application/service/MemberProfileServiceTest.java @@ -1,8 +1,11 @@ package com.stumeet.server.member.application.service; import com.stumeet.server.file.application.port.in.FileUploadUseCase; +import com.stumeet.server.member.adapter.in.web.response.MemberProfileResponse; import com.stumeet.server.member.application.port.in.command.MemberUpdateCommand; +import com.stumeet.server.member.application.port.in.mapper.MemberUseCaseMapper; import com.stumeet.server.member.application.port.out.MemberCommandPort; +import com.stumeet.server.member.application.port.out.MemberQueryPort; import com.stumeet.server.member.domain.Member; import com.stumeet.server.profession.application.port.in.ProfessionQueryUseCase; import com.stumeet.server.stub.FileStub; @@ -15,6 +18,7 @@ import org.mockito.InjectMocks; import org.mockito.Mock; +import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.BDDMockito.given; import static org.mockito.BDDMockito.then; @@ -33,6 +37,12 @@ class MemberProfileServiceTest extends UnitTest { @Mock private ProfessionQueryUseCase professionQueryUseCase; + @Mock + private MemberQueryPort memberQueryPort; + + @Mock + private MemberUseCaseMapper memberUseCaseMapper; + @Nested @DisplayName("멤버 프로필 업데이트") class UpdateProfile { @@ -54,4 +64,24 @@ void successTest() { } } + @Nested + @DisplayName("프로필 조회") + class GetProfileById { + @Test + @DisplayName("[성공] 멤버 프로필 조회에 성공한다.") + void successTest() { + Member member = MemberStub.getMember(); + MemberProfileResponse want = MemberStub.getMemberProfileResponse(member); + + given(memberQueryPort.getById(member.getId())) + .willReturn(member); + given(memberUseCaseMapper.toProfileResponse(member)) + .willReturn(want); + + MemberProfileResponse got = memberProfileService.getProfileById(member.getId()); + + assertThat(got).usingRecursiveComparison().isEqualTo(want); + } + } + } \ No newline at end of file From ee5a4d7166f12533e310e61a3b5c52bcf6ea42fb Mon Sep 17 00:00:00 2001 From: yongckim Date: Wed, 6 Mar 2024 20:58:36 +0900 Subject: [PATCH 3/4] =?UTF-8?q?:sparkles:=20[STMT-199]=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=8B=A4?= =?UTF-8?q?=ED=96=89=20=EC=A0=84=ED=9B=84=EB=A1=9C=20SQL=20=EB=AC=B8?= =?UTF-8?q?=EC=9D=84=20=EC=8B=A4=ED=96=89=EC=8B=9C=EC=BC=9C=20DB=20?= =?UTF-8?q?=EC=B4=88=EA=B8=B0=20=EC=84=B8=ED=8C=85=20=EB=B0=8F=20=EC=B4=88?= =?UTF-8?q?=EA=B8=B0=ED=99=94=20=EC=A7=84=ED=96=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/common/auth/filter/LogoutFilterTest.java | 4 +--- .../auth/filter/OAuthAuthenticationFilterTest.java | 1 - .../server/member/adapter/in/web/MemberAuthApiTest.java | 4 +--- .../server/member/adapter/in/web/MemberValidApiTest.java | 9 +-------- .../adapter/in/web/ProfessionQueryApiTest.java | 1 - src/test/java/com/stumeet/server/template/ApiTest.java | 3 +++ src/test/resources/db/setup.sql | 3 +++ src/test/resources/db/teardown.sql | 6 ++++++ 8 files changed, 15 insertions(+), 16 deletions(-) create mode 100644 src/test/resources/db/setup.sql create mode 100644 src/test/resources/db/teardown.sql diff --git a/src/test/java/com/stumeet/server/common/auth/filter/LogoutFilterTest.java b/src/test/java/com/stumeet/server/common/auth/filter/LogoutFilterTest.java index 293c793a..38267141 100644 --- a/src/test/java/com/stumeet/server/common/auth/filter/LogoutFilterTest.java +++ b/src/test/java/com/stumeet/server/common/auth/filter/LogoutFilterTest.java @@ -29,7 +29,6 @@ import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -@Transactional public class LogoutFilterTest extends ApiTest { @Container @@ -54,11 +53,10 @@ class Logout { @BeforeEach void setUp() { - MemberJpaEntity entity = jpaMemberRepository.save(MemberStub.getMemberEntity()); redisTemplate.opsForValue() .set( JwtUtil.resolveToken(TokenStub.getMockAccessToken()), - jwtTokenProvider.generateRefreshToken(entity.getId()) + jwtTokenProvider.generateRefreshToken(MemberStub.getMember().getId()) ); } diff --git a/src/test/java/com/stumeet/server/common/auth/filter/OAuthAuthenticationFilterTest.java b/src/test/java/com/stumeet/server/common/auth/filter/OAuthAuthenticationFilterTest.java index 161ac529..8a073ce6 100644 --- a/src/test/java/com/stumeet/server/common/auth/filter/OAuthAuthenticationFilterTest.java +++ b/src/test/java/com/stumeet/server/common/auth/filter/OAuthAuthenticationFilterTest.java @@ -29,7 +29,6 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @WireMockTest(httpPort = 8089) -@Transactional class OAuthAuthenticationFilterTest extends ApiTest { @Container diff --git a/src/test/java/com/stumeet/server/member/adapter/in/web/MemberAuthApiTest.java b/src/test/java/com/stumeet/server/member/adapter/in/web/MemberAuthApiTest.java index 21b6f425..f81363f4 100644 --- a/src/test/java/com/stumeet/server/member/adapter/in/web/MemberAuthApiTest.java +++ b/src/test/java/com/stumeet/server/member/adapter/in/web/MemberAuthApiTest.java @@ -34,7 +34,6 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -@Transactional class MemberAuthApiTest extends ApiTest { @Container @@ -61,8 +60,7 @@ class tokenRenew { @BeforeEach void setUp() { - MemberJpaEntity entity = jpaMemberRepository.save(MemberStub.getMemberEntity()); - refreshToken = jwtTokenProvider.generateRefreshToken(entity.getId()); + refreshToken = jwtTokenProvider.generateRefreshToken(MemberStub.getMember().getId()); redisTemplate.opsForValue() .set(TokenStub.getExpiredAccessToken(), refreshToken); } diff --git a/src/test/java/com/stumeet/server/member/adapter/in/web/MemberValidApiTest.java b/src/test/java/com/stumeet/server/member/adapter/in/web/MemberValidApiTest.java index b53f8a2c..d6712605 100644 --- a/src/test/java/com/stumeet/server/member/adapter/in/web/MemberValidApiTest.java +++ b/src/test/java/com/stumeet/server/member/adapter/in/web/MemberValidApiTest.java @@ -26,7 +26,6 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -@Transactional class MemberValidApiTest extends ApiTest { @Autowired @@ -37,12 +36,6 @@ class MemberValidApiTest extends ApiTest { class IsDuplicateNickname { private final String path = "/api/v1/members/validate-nickname"; - private MemberJpaEntity member; - - @BeforeEach - void setUp() { - member = jpaMemberRepository.save(MemberStub.getMemberEntity()); - } @Test @WithMockMember @@ -96,7 +89,7 @@ void invalidRequestTest() throws Exception { @WithMockMember @DisplayName("[실패] 닉네임이 중복되면 검증에 실패합니다.") void duplicateNicknameTest() throws Exception { - String nickname = member.getName(); + String nickname = MemberStub.getMember().getName(); mockMvc.perform(get(path) .header(AuthenticationHeader.ACCESS_TOKEN.getName(), TokenStub.getMockAccessToken()) .param("nickname", nickname)) diff --git a/src/test/java/com/stumeet/server/profession/adapter/in/web/ProfessionQueryApiTest.java b/src/test/java/com/stumeet/server/profession/adapter/in/web/ProfessionQueryApiTest.java index 0bf7a58c..f3f7304f 100644 --- a/src/test/java/com/stumeet/server/profession/adapter/in/web/ProfessionQueryApiTest.java +++ b/src/test/java/com/stumeet/server/profession/adapter/in/web/ProfessionQueryApiTest.java @@ -20,7 +20,6 @@ import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -@Transactional class ProfessionQueryApiTest extends ApiTest { @Nested diff --git a/src/test/java/com/stumeet/server/template/ApiTest.java b/src/test/java/com/stumeet/server/template/ApiTest.java index ecbaf37b..3a833e22 100644 --- a/src/test/java/com/stumeet/server/template/ApiTest.java +++ b/src/test/java/com/stumeet/server/template/ApiTest.java @@ -11,6 +11,7 @@ import org.springframework.restdocs.RestDocumentationContextProvider; import org.springframework.restdocs.RestDocumentationExtension; import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.jdbc.Sql; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; @@ -23,6 +24,8 @@ import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; @SpringBootTest +@Sql(scripts = "classpath:db/setup.sql", executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) +@Sql(scripts = "classpath:db/teardown.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) @ExtendWith(RestDocumentationExtension.class) @ActiveProfiles("test") @Import({TestAwsS3Config.class}) diff --git a/src/test/resources/db/setup.sql b/src/test/resources/db/setup.sql new file mode 100644 index 00000000..649cb84e --- /dev/null +++ b/src/test/resources/db/setup.sql @@ -0,0 +1,3 @@ +INSERT INTO member (id, name, image, region, profession_id, role, auth_type, rank, experience, is_deleted, deleted_at) +VALUES (1, 'test', 'http://localhost:4572/user/1/profile/2024030416531039839905-b7e8-4ad3-9552-7d9cbc01cb14-test.jpg', + '서울', 1, 'FIRST_LOGIN', 'OAUTH', 'SEED', 0.0, false, null); \ No newline at end of file diff --git a/src/test/resources/db/teardown.sql b/src/test/resources/db/teardown.sql new file mode 100644 index 00000000..816158a4 --- /dev/null +++ b/src/test/resources/db/teardown.sql @@ -0,0 +1,6 @@ +SET FOREIGN_KEY_CHECKS = 0; + +TRUNCATE TABLE member; +TRUNCATE TABLE oauth_login; + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file From 563a438d8a4c99feb5970ea5a33b5fa0c38a11c1 Mon Sep 17 00:00:00 2001 From: yongckim Date: Wed, 6 Mar 2024 20:58:59 +0900 Subject: [PATCH 4/4] =?UTF-8?q?:white=5Fcheck=5Fmark:=20[STMT-199]=20?= =?UTF-8?q?=EB=82=B4=20=EC=A0=95=EB=B3=B4=20=EC=A1=B0=ED=9A=8C=20API=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/docs/asciidoc/index.adoc | 12 ++++++ .../adapter/in/web/MemberProfileApiTest.java | 43 +++++++++++++------ .../com/stumeet/server/stub/MemberStub.java | 28 +++++++++--- .../stumeet/server/stub/ProfessionStub.java | 9 ++++ 4 files changed, 73 insertions(+), 19 deletions(-) diff --git a/src/docs/asciidoc/index.adoc b/src/docs/asciidoc/index.adoc index cc318977..1d6f5c54 100644 --- a/src/docs/asciidoc/index.adoc +++ b/src/docs/asciidoc/index.adoc @@ -144,6 +144,18 @@ 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[] +=== 내 정보 조회 + +==== GET /api/v1/members/me + +===== 요청 +include::{snippets}/get-my-profile/success/http-request.adoc[] +include::{snippets}/get-my-profile/success/request-headers.adoc[] + +===== 응답 (200) +include::{snippets}/get-my-profile/success/response-body.adoc[] +include::{snippets}/get-my-profile/success/response-fields.adoc[] + === 사용자 정보 수정 ==== PATCH /api/v1/members/me diff --git a/src/test/java/com/stumeet/server/member/adapter/in/web/MemberProfileApiTest.java b/src/test/java/com/stumeet/server/member/adapter/in/web/MemberProfileApiTest.java index f0e38065..694fcd0e 100644 --- a/src/test/java/com/stumeet/server/member/adapter/in/web/MemberProfileApiTest.java +++ b/src/test/java/com/stumeet/server/member/adapter/in/web/MemberProfileApiTest.java @@ -2,23 +2,20 @@ import com.stumeet.server.common.auth.model.AuthenticationHeader; import com.stumeet.server.helper.WithMockMember; -import com.stumeet.server.member.adapter.out.persistence.JpaMemberRepository; import com.stumeet.server.member.application.port.in.command.MemberUpdateCommand; 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.mock.web.MockMultipartFile; import org.springframework.test.web.servlet.request.RequestPostProcessor; -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; @@ -26,23 +23,14 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.multipart; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -@Transactional class MemberProfileApiTest extends ApiTest { - @Autowired - private JpaMemberRepository memberRepository; - @Nested @DisplayName("내 프로필 수정") class UpdateMyProfile { private final String path = "/api/v1/members/me"; - @BeforeEach - void setUp() { - memberRepository.save(MemberStub.getMemberEntity()); - } - @Test @WithMockMember @DisplayName("[성공] 회원 프로필 수정에 성공한다.") @@ -112,4 +100,33 @@ void invalidRequestTest() throws Exception { ))); } } + + @Nested + @DisplayName("내 프로필 조회") + class GetMyProfile { + + @Test + @WithMockMember + @DisplayName("[성공] 회원 프로필 조회에 성공한다.") + void successTest() throws Exception { + mockMvc.perform(get("/api/v1/members/me") + .header(AuthenticationHeader.ACCESS_TOKEN.getName(), TokenStub.getMockAccessToken())) + .andExpect(status().isOk()) + .andDo(document("get-my-profile/success", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()), + requestHeaders(headerWithName(AuthenticationHeader.ACCESS_TOKEN.getName()).description("서버로부터 전달받은 액세스 토큰")), + responseFields( + fieldWithPath("code").description("응답 상태"), + fieldWithPath("message").description("응답 메시지"), + fieldWithPath("data.id").description("회원 ID"), + fieldWithPath("data.image").description("프로필 이미지 URL"), + fieldWithPath("data.nickname").description("닉네임"), + fieldWithPath("data.region").description("지역"), + fieldWithPath("data.profession").description("분야 이름"), + fieldWithPath("data.rank").description("회원 레벨 - 랭크"), + fieldWithPath("data.experience").description("회원 레벨 - 경험치") + ))); + } + } } \ No newline at end of file diff --git a/src/test/java/com/stumeet/server/stub/MemberStub.java b/src/test/java/com/stumeet/server/stub/MemberStub.java index e32215ec..9d801852 100644 --- a/src/test/java/com/stumeet/server/stub/MemberStub.java +++ b/src/test/java/com/stumeet/server/stub/MemberStub.java @@ -1,5 +1,6 @@ package com.stumeet.server.stub; +import com.stumeet.server.member.adapter.in.web.response.MemberProfileResponse; import com.stumeet.server.member.adapter.out.persistence.MemberJpaEntity; import com.stumeet.server.member.application.port.in.command.MemberSignupCommand; import com.stumeet.server.member.application.port.in.command.MemberUpdateCommand; @@ -27,6 +28,9 @@ public static MemberJpaEntity getMemberEntity() { return MemberJpaEntity.builder() .id(1L) .name("test") + .image(FileStub.getFileUrl().url()) + .region("서울") + .profession(ProfessionStub.getProfessionEntity()) .role(UserRole.FIRST_LOGIN) .authType(AuthType.OAUTH) .rank(MemberRank.SEED) @@ -51,9 +55,9 @@ public static Member getMember(WithMockMember annotation) { .role(annotation.authority()) .authType(AuthType.OAUTH) .level(level) - .profession(null) - .region(null) - .image(null) + .profession(ProfessionStub.getProfession()) + .region("서울") + .image(FileStub.getFileUrl().url()) .build(); } @@ -68,9 +72,9 @@ public static Member getMember() { .role(UserRole.MEMBER) .authType(AuthType.OAUTH) .level(level) - .profession(null) - .region(null) - .image(null) + .profession(ProfessionStub.getProfession()) + .region("서울") + .image(FileStub.getFileUrl().url()) .build(); } @@ -83,4 +87,16 @@ public static MemberUpdateCommand getInvalidMemberUpdateCommand() { MockMultipartFile invalidImage = new MockMultipartFile("image", "test.jpa", "plain/text", "test".getBytes()); return new MemberUpdateCommand(invalidImage, "닉", " ", -1L); } + + public static MemberProfileResponse getMemberProfileResponse(Member member) { + return MemberProfileResponse.builder() + .id(member.getId()) + .image(member.getImage()) + .nickname(member.getName()) + .region(member.getRegion()) + .profession(member.getProfession().getName()) + .rank(member.getLevel().getRank().getName()) + .experience(member.getLevel().getExperience()) + .build(); + } } diff --git a/src/test/java/com/stumeet/server/stub/ProfessionStub.java b/src/test/java/com/stumeet/server/stub/ProfessionStub.java index 0c6b53ca..81c3283a 100644 --- a/src/test/java/com/stumeet/server/stub/ProfessionStub.java +++ b/src/test/java/com/stumeet/server/stub/ProfessionStub.java @@ -1,5 +1,6 @@ package com.stumeet.server.stub; +import com.stumeet.server.profession.adapter.out.persistence.ProfessionJpaEntity; import com.stumeet.server.profession.domain.Profession; public class ProfessionStub { @@ -14,4 +15,12 @@ public static Profession getProfession() { .parent(null) .build(); } + + public static ProfessionJpaEntity getProfessionEntity() { + return ProfessionJpaEntity.builder() + .id(1L) + .name("경영사무") + .parent(null) + .build(); + } }