From c3f7f537d5c9198ee8a9f9d8985f471063272a3c Mon Sep 17 00:00:00 2001 From: leebs0521 Date: Fri, 7 Feb 2025 12:34:48 +0900 Subject: [PATCH 1/5] =?UTF-8?q?refactor(note):=20=EC=AA=BD=EC=A7=80=20?= =?UTF-8?q?=EC=BB=A4=EB=A7=A8=EB=93=9C=20=EA=B8=B0=EB=8A=A5=20=EB=A6=AC?= =?UTF-8?q?=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/NoteCommandApiController.java | 15 ++++++++---- .../note/service/SendNoteToCenterService.java | 7 +++--- .../service/SendNoteToVolunteerService.java | 9 ++++--- .../repository/NEWVolunteerRepository.java | 5 ++++ .../NEWVolunteerRepositoryImpl.java | 24 +++++++++++++++---- .../service/NEWVolunteerQueryService.java | 23 +++++++++++++----- .../usecase/NEWVolunteerQueryUseCase.java | 1 + 7 files changed, 59 insertions(+), 25 deletions(-) diff --git a/src/main/java/com/somemore/domains/note/controller/NoteCommandApiController.java b/src/main/java/com/somemore/domains/note/controller/NoteCommandApiController.java index f3700f81..fb12a3f1 100644 --- a/src/main/java/com/somemore/domains/note/controller/NoteCommandApiController.java +++ b/src/main/java/com/somemore/domains/note/controller/NoteCommandApiController.java @@ -4,11 +4,12 @@ import com.somemore.domains.note.dto.SendNoteToVolunteerRequestDto; import com.somemore.domains.note.usecase.SendNoteToCenterUseCase; import com.somemore.domains.note.usecase.SendNoteToVolunteerUseCase; -import com.somemore.global.auth.annotation.CurrentUser; +import com.somemore.global.auth.annotation.RoleId; import com.somemore.global.common.response.ApiResponse; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; +import java.util.UUID; import lombok.RequiredArgsConstructor; import org.springframework.security.access.annotation.Secured; import org.springframework.web.bind.annotation.PostMapping; @@ -16,8 +17,6 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import java.util.UUID; - @Tag(name = "Note Command API", description = "쪽지 송신 삭제 API") @RequiredArgsConstructor @RequestMapping("/api/note") @@ -30,7 +29,10 @@ public class NoteCommandApiController { @Secured("ROLE_VOLUNTEER") @Operation(summary = "봉사자 to 기관 쪽지 송신") @PostMapping("/volunteer-to-center") - public ApiResponse sendNoteToCenter(@CurrentUser UUID volunteerId, @Valid @RequestBody SendNoteToCenterRequestDto requestDto) { + public ApiResponse sendNoteToCenter( + @RoleId UUID volunteerId, + @Valid @RequestBody SendNoteToCenterRequestDto requestDto + ) { Long noteId = sendNoteToCenterUseCase.sendNoteToCenter(volunteerId, requestDto); @@ -40,7 +42,10 @@ public ApiResponse sendNoteToCenter(@CurrentUser UUID volunteerId, @Valid @Secured("ROLE_CENTER") @Operation(summary = "기관 to 봉사자 쪽지 송신") @PostMapping("/center-to-volunteer") - public ApiResponse sendNoteToCenter(@CurrentUser UUID centerId, @Valid @RequestBody SendNoteToVolunteerRequestDto requestDto) { + public ApiResponse sendNoteToCenter( + @RoleId UUID centerId, + @Valid @RequestBody SendNoteToVolunteerRequestDto requestDto + ) { Long noteId = sendNoteToVolunteerUseCase.sendNoteToVolunteer(centerId, requestDto); diff --git a/src/main/java/com/somemore/domains/note/service/SendNoteToCenterService.java b/src/main/java/com/somemore/domains/note/service/SendNoteToCenterService.java index 0451e76c..d2075893 100644 --- a/src/main/java/com/somemore/domains/note/service/SendNoteToCenterService.java +++ b/src/main/java/com/somemore/domains/note/service/SendNoteToCenterService.java @@ -1,22 +1,21 @@ package com.somemore.domains.note.service; -import com.somemore.domains.center.usecase.query.CenterQueryUseCase; +import com.somemore.center.usecase.NEWCenterQueryUseCase; import com.somemore.domains.note.domain.Note; import com.somemore.domains.note.dto.SendNoteToCenterRequestDto; import com.somemore.domains.note.repository.NoteRepository; import com.somemore.domains.note.usecase.SendNoteToCenterUseCase; +import java.util.UUID; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.UUID; - @RequiredArgsConstructor @Service @Transactional public class SendNoteToCenterService implements SendNoteToCenterUseCase { - private final CenterQueryUseCase centerQueryUseCase; + private final NEWCenterQueryUseCase centerQueryUseCase; private final NoteRepository noteRepository; @Override diff --git a/src/main/java/com/somemore/domains/note/service/SendNoteToVolunteerService.java b/src/main/java/com/somemore/domains/note/service/SendNoteToVolunteerService.java index 058cdac1..1cdb9ce4 100644 --- a/src/main/java/com/somemore/domains/note/service/SendNoteToVolunteerService.java +++ b/src/main/java/com/somemore/domains/note/service/SendNoteToVolunteerService.java @@ -4,25 +4,24 @@ import com.somemore.domains.note.dto.SendNoteToVolunteerRequestDto; import com.somemore.domains.note.repository.NoteRepository; import com.somemore.domains.note.usecase.SendNoteToVolunteerUseCase; -import com.somemore.domains.volunteer.usecase.VolunteerQueryUseCase; +import com.somemore.volunteer.usecase.NEWVolunteerQueryUseCase; +import java.util.UUID; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.UUID; - @RequiredArgsConstructor @Service @Transactional public class SendNoteToVolunteerService implements SendNoteToVolunteerUseCase { - private final VolunteerQueryUseCase volunteerQueryUseCase; + private final NEWVolunteerQueryUseCase volunteerQueryUseCase; private final NoteRepository noteRepository; @Override public Long sendNoteToVolunteer(UUID senderId, SendNoteToVolunteerRequestDto requestDto) { - volunteerQueryUseCase.validateVolunteerExists(senderId); + volunteerQueryUseCase.validateExistsById(requestDto.receiverId()); Note note = requestDto.toEntity(senderId); noteRepository.save(note); diff --git a/src/main/java/com/somemore/volunteer/repository/NEWVolunteerRepository.java b/src/main/java/com/somemore/volunteer/repository/NEWVolunteerRepository.java index 035843d5..867cd12c 100644 --- a/src/main/java/com/somemore/volunteer/repository/NEWVolunteerRepository.java +++ b/src/main/java/com/somemore/volunteer/repository/NEWVolunteerRepository.java @@ -21,4 +21,9 @@ public interface NEWVolunteerRepository { List findVolunteerNicknameAndIdsByIds(List ids); + boolean existsById(UUID id); + + default boolean doesNotExistById(UUID id) { + return !existsById(id); + } } diff --git a/src/main/java/com/somemore/volunteer/repository/NEWVolunteerRepositoryImpl.java b/src/main/java/com/somemore/volunteer/repository/NEWVolunteerRepositoryImpl.java index a8120133..ec7b00da 100644 --- a/src/main/java/com/somemore/volunteer/repository/NEWVolunteerRepositoryImpl.java +++ b/src/main/java/com/somemore/volunteer/repository/NEWVolunteerRepositoryImpl.java @@ -7,12 +7,11 @@ import com.somemore.volunteer.domain.QNEWVolunteer; import com.somemore.volunteer.repository.record.VolunteerNickname; import com.somemore.volunteer.repository.record.VolunteerNicknameAndId; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Repository; - import java.util.List; import java.util.Optional; import java.util.UUID; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; @Repository("newVolunteerRepository") @RequiredArgsConstructor @@ -33,7 +32,7 @@ public Optional findById(UUID id) { return Optional.ofNullable( queryFactory.selectFrom(volunteer) .where( - volunteer.id.eq(id), + idEq(id), isNotDeleted() ) .fetchOne() @@ -58,7 +57,7 @@ public Optional findNicknameById(UUID id) { queryFactory.select(volunteer.nickname) .from(volunteer) .where( - volunteer.id.eq(id), + idEq(id), isNotDeleted() ) .fetchOne() @@ -95,6 +94,21 @@ public List findVolunteerNicknameAndIdsByIds(List .fetch(); } + public boolean existsById(UUID id) { + return queryFactory + .selectOne() + .from(volunteer) + .where( + idEq(id), + isNotDeleted() + ) + .fetchFirst() != null; + } + + private static BooleanExpression idEq(UUID id) { + return volunteer.id.eq(id); + } + private static BooleanExpression isNotDeleted() { return volunteer.deleted.eq(false); } diff --git a/src/main/java/com/somemore/volunteer/service/NEWVolunteerQueryService.java b/src/main/java/com/somemore/volunteer/service/NEWVolunteerQueryService.java index 612c7754..7374fc92 100644 --- a/src/main/java/com/somemore/volunteer/service/NEWVolunteerQueryService.java +++ b/src/main/java/com/somemore/volunteer/service/NEWVolunteerQueryService.java @@ -1,18 +1,19 @@ package com.somemore.volunteer.service; +import static com.somemore.global.exception.ExceptionMessage.NOT_EXISTS_VOLUNTEER; + import com.somemore.global.exception.ExceptionMessage; import com.somemore.global.exception.NoSuchElementException; import com.somemore.volunteer.domain.NEWVolunteer; import com.somemore.volunteer.repository.NEWVolunteerRepository; import com.somemore.volunteer.repository.record.VolunteerNicknameAndId; import com.somemore.volunteer.usecase.NEWVolunteerQueryUseCase; +import java.util.List; +import java.util.UUID; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.List; -import java.util.UUID; - @Service @RequiredArgsConstructor @Transactional(readOnly = true) @@ -23,13 +24,15 @@ public class NEWVolunteerQueryService implements NEWVolunteerQueryUseCase { @Override public NEWVolunteer getById(UUID id) { return volunteerRepository.findById(id) - .orElseThrow(() -> new NoSuchElementException(ExceptionMessage.NOT_EXISTS_VOLUNTEER)); + .orElseThrow( + () -> new NoSuchElementException(ExceptionMessage.NOT_EXISTS_VOLUNTEER)); } @Override public NEWVolunteer getByUserId(UUID userId) { return volunteerRepository.findByUserId(userId) - .orElseThrow(() -> new NoSuchElementException(ExceptionMessage.NOT_EXISTS_VOLUNTEER)); + .orElseThrow( + () -> new NoSuchElementException(ExceptionMessage.NOT_EXISTS_VOLUNTEER)); } @Override @@ -45,11 +48,19 @@ public UUID getIdByUserId(UUID userId) { @Override public String getNicknameById(UUID id) { return volunteerRepository.findNicknameById(id) - .orElseThrow(() -> new NoSuchElementException(ExceptionMessage.NOT_EXISTS_VOLUNTEER)); + .orElseThrow( + () -> new NoSuchElementException(ExceptionMessage.NOT_EXISTS_VOLUNTEER)); } @Override public List getVolunteerNicknameAndIdsByIds(List ids) { return volunteerRepository.findVolunteerNicknameAndIdsByIds(ids); } + + @Override + public void validateExistsById(UUID id) { + if (volunteerRepository.doesNotExistById(id)) { + throw new NoSuchElementException(NOT_EXISTS_VOLUNTEER); + } + } } diff --git a/src/main/java/com/somemore/volunteer/usecase/NEWVolunteerQueryUseCase.java b/src/main/java/com/somemore/volunteer/usecase/NEWVolunteerQueryUseCase.java index b991239b..a95955a3 100644 --- a/src/main/java/com/somemore/volunteer/usecase/NEWVolunteerQueryUseCase.java +++ b/src/main/java/com/somemore/volunteer/usecase/NEWVolunteerQueryUseCase.java @@ -19,4 +19,5 @@ public interface NEWVolunteerQueryUseCase { List getVolunteerNicknameAndIdsByIds(List ids); + void validateExistsById(UUID id); } From e14a4fe5474c5021eebbea20ae6611687224d661 Mon Sep 17 00:00:00 2001 From: leebs0521 Date: Fri, 7 Feb 2025 12:34:58 +0900 Subject: [PATCH 2/5] =?UTF-8?q?test(note):=20=EC=AA=BD=EC=A7=80=20?= =?UTF-8?q?=EC=BB=A4=EB=A7=A8=EB=93=9C=20=EA=B8=B0=EB=8A=A5=20=EB=A6=AC?= =?UTF-8?q?=ED=8C=A9=ED=86=A0=EB=A7=81=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../NoteCommandApiControllerTest.java | 29 +++---- .../service/SendNoteToCenterServiceTest.java | 80 +++++++++---------- .../SendNoteToVolunteerServiceTest.java | 52 ++++++------ .../NEWVolunteerRepositoryImplTest.java | 15 ++++ .../service/NEWVolunteerQueryServiceTest.java | 14 ++++ 5 files changed, 110 insertions(+), 80 deletions(-) diff --git a/src/test/java/com/somemore/domains/note/controller/NoteCommandApiControllerTest.java b/src/test/java/com/somemore/domains/note/controller/NoteCommandApiControllerTest.java index 06122b85..7171a27a 100644 --- a/src/test/java/com/somemore/domains/note/controller/NoteCommandApiControllerTest.java +++ b/src/test/java/com/somemore/domains/note/controller/NoteCommandApiControllerTest.java @@ -1,25 +1,24 @@ package com.somemore.domains.note.controller; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + import com.somemore.domains.note.dto.SendNoteToCenterRequestDto; import com.somemore.domains.note.dto.SendNoteToVolunteerRequestDto; import com.somemore.domains.note.usecase.SendNoteToCenterUseCase; import com.somemore.domains.note.usecase.SendNoteToVolunteerUseCase; import com.somemore.support.ControllerTestSupport; -import com.somemore.support.annotation.WithMockCustomUser; +import com.somemore.support.annotation.MockUser; +import java.util.UUID; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.MediaType; -import java.util.UUID; - -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.when; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -class NoteCommandApiControllerTest extends ControllerTestSupport{ +class NoteCommandApiControllerTest extends ControllerTestSupport { @MockBean private SendNoteToCenterUseCase sendNoteToCenterUseCase; @@ -29,7 +28,7 @@ class NoteCommandApiControllerTest extends ControllerTestSupport{ @DisplayName("봉사자는 기관에게 쪽지를 보낼수 있다 (controller)") @Test - @WithMockCustomUser + @MockUser void sendNoteToCenter_Success() throws Exception { // Given UUID receiverId = UUID.randomUUID(); @@ -39,7 +38,8 @@ void sendNoteToCenter_Success() throws Exception { "쪽지 내용" ); - when(sendNoteToCenterUseCase.sendNoteToCenter(any(UUID.class), any(SendNoteToCenterRequestDto.class))) + when(sendNoteToCenterUseCase.sendNoteToCenter(any(UUID.class), + any(SendNoteToCenterRequestDto.class))) .thenReturn(1L); // When & Then @@ -73,7 +73,7 @@ void sendNoteToCenter_ValidationFail() throws Exception { @DisplayName("기관은 봉사자에게 쪽지를 보낼수 있다 (controller)") @Test - @WithMockCustomUser(role = "CENTER") + @MockUser(role = "ROLE_CENTER") void sendNoteToVolunteer_Success() throws Exception { // Given UUID receiverId = UUID.randomUUID(); @@ -83,7 +83,8 @@ void sendNoteToVolunteer_Success() throws Exception { "쪽지 내용" ); - when(sendNoteToVolunteerUseCase.sendNoteToVolunteer(any(UUID.class), any(SendNoteToVolunteerRequestDto.class))) + when(sendNoteToVolunteerUseCase.sendNoteToVolunteer(any(UUID.class), + any(SendNoteToVolunteerRequestDto.class))) .thenReturn(1L); // When & Then diff --git a/src/test/java/com/somemore/domains/note/service/SendNoteToCenterServiceTest.java b/src/test/java/com/somemore/domains/note/service/SendNoteToCenterServiceTest.java index 0d644515..44dabeb0 100644 --- a/src/test/java/com/somemore/domains/note/service/SendNoteToCenterServiceTest.java +++ b/src/test/java/com/somemore/domains/note/service/SendNoteToCenterServiceTest.java @@ -1,22 +1,24 @@ package com.somemore.domains.note.service; -import com.somemore.domains.center.domain.Center; -import com.somemore.domains.center.repository.center.CenterRepository; +import static com.somemore.global.exception.ExceptionMessage.NOT_EXISTS_CENTER; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import com.somemore.center.domain.NEWCenter; +import com.somemore.center.repository.NEWCenterRepository; import com.somemore.domains.note.domain.Note; import com.somemore.domains.note.dto.SendNoteToCenterRequestDto; -import com.somemore.domains.note.repository.NoteJpaRepository; -import com.somemore.global.exception.BadRequestException; +import com.somemore.domains.note.repository.NoteRepository; +import com.somemore.global.exception.NoSuchElementException; import com.somemore.support.IntegrationTestSupport; +import java.util.Optional; +import java.util.UUID; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; -import java.util.UUID; - -import static com.somemore.global.exception.ExceptionMessage.NOT_EXISTS_CENTER; -import static org.junit.jupiter.api.Assertions.*; - @Transactional class SendNoteToCenterServiceTest extends IntegrationTestSupport { @@ -24,34 +26,41 @@ class SendNoteToCenterServiceTest extends IntegrationTestSupport { private SendNoteToCenterService sendNoteToCenterService; @Autowired - private NoteJpaRepository noteJpaRepository; + private NoteRepository noteRepository; @Autowired - private CenterRepository centerRepository; + private NEWCenterRepository centerRepository; + private NEWCenter center; + + @BeforeEach + void setUp() { + center = createCenter(UUID.randomUUID()); + centerRepository.save(center); + } @DisplayName("봉사자는 기관에게 쪽지를 보낼 수 있다.") @Test void sendNoteToCenter() { // given - Center center = createCenter(); UUID senderId = UUID.randomUUID(); // 봉사자 ID UUID receiverId = center.getId(); // 기관 ID + String title = "안녕하세요, 봉사 신청 관련 문의드립니다."; String content = "안녕하세요, 이번 주말 봉사 일정에 대해 문의드립니다."; - SendNoteToCenterRequestDto requestDto = new SendNoteToCenterRequestDto(receiverId, title, content); + SendNoteToCenterRequestDto requestDto = new SendNoteToCenterRequestDto(receiverId, title, + content); // when Long noteId = sendNoteToCenterService.sendNoteToCenter(senderId, requestDto); // then - Note savedNote = noteJpaRepository.findById(noteId).orElseThrow(() -> - new IllegalStateException("쪽지가 저장되지 않았습니다.")); - assertEquals(senderId, savedNote.getSenderId(), "발신자가 올바르지 않습니다."); - assertEquals(receiverId, savedNote.getReceiverId(), "수신자가 올바르지 않습니다."); - assertEquals(title, savedNote.getTitle(), "쪽지 제목이 올바르지 않습니다."); - assertEquals(content, savedNote.getContent(), "쪽지 내용이 올바르지 않습니다."); - assertFalse(savedNote.getIsRead(), "새로 생성된 쪽지는 읽음 상태가 기본적으로 false여야 합니다."); + Optional findNote = noteRepository.findById(noteId); + assertThat(findNote).isPresent(); + assertThat(findNote.get().getSenderId()).isEqualTo(senderId); + assertThat(findNote.get().getReceiverId()).isEqualTo(receiverId); + assertThat(findNote.get().getTitle()).isEqualTo(title); + assertThat(findNote.get().getContent()).isEqualTo(content); } @DisplayName("기관 아이디가 올바르지 않으면 예외를 반환한다.") @@ -62,30 +71,19 @@ void sendNoteToNonexistentCenter_ThrowsBadRequestException() { UUID nonexistentReceiverId = UUID.randomUUID(); // 존재하지 않는 기관 ID String title = "안녕하세요, 봉사 신청 관련 문의드립니다."; String content = "안녕하세요, 이번 주말 봉사 일정에 대해 문의드립니다."; - SendNoteToCenterRequestDto requestDto = new SendNoteToCenterRequestDto(nonexistentReceiverId, title, content); - - assertFalse(centerRepository.existsById(nonexistentReceiverId), ""); + SendNoteToCenterRequestDto requestDto = new SendNoteToCenterRequestDto( + nonexistentReceiverId, title, content); - // when & then - BadRequestException exception = assertThrows(BadRequestException.class, - () -> sendNoteToCenterService.sendNoteToCenter(senderId, requestDto)); - - // 예외 메시지 검증 - assertEquals(NOT_EXISTS_CENTER.getMessage(), exception.getMessage(), "예외 메시지가 올바르지 않습니다."); + // when + // then + assertThatThrownBy( + () -> sendNoteToCenterService.sendNoteToCenter(senderId, requestDto)) + .isInstanceOf(NoSuchElementException.class) + .hasMessage(NOT_EXISTS_CENTER.getMessage()); } - private Center createCenter() { - Center center = Center.create( - "기본 기관 이름", - "010-1234-5678", - "http://example.com/image.jpg", - "기관 소개 내용", - "http://example.com" - ); - - centerRepository.save(center); - - return center; + private NEWCenter createCenter(UUID userId) { + return NEWCenter.createDefault(userId); } } diff --git a/src/test/java/com/somemore/domains/note/service/SendNoteToVolunteerServiceTest.java b/src/test/java/com/somemore/domains/note/service/SendNoteToVolunteerServiceTest.java index 514e4d6c..1b8935ca 100644 --- a/src/test/java/com/somemore/domains/note/service/SendNoteToVolunteerServiceTest.java +++ b/src/test/java/com/somemore/domains/note/service/SendNoteToVolunteerServiceTest.java @@ -1,22 +1,21 @@ package com.somemore.domains.note.service; +import static org.assertj.core.api.Assertions.assertThat; + import com.somemore.domains.note.domain.Note; import com.somemore.domains.note.dto.SendNoteToVolunteerRequestDto; -import com.somemore.domains.note.repository.NoteJpaRepository; -import com.somemore.domains.volunteer.domain.Volunteer; -import com.somemore.domains.volunteer.repository.VolunteerJpaRepository; +import com.somemore.domains.note.repository.NoteRepository; import com.somemore.support.IntegrationTestSupport; +import com.somemore.volunteer.domain.NEWVolunteer; +import com.somemore.volunteer.repository.NEWVolunteerRepository; +import java.util.Optional; +import java.util.UUID; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; -import java.util.UUID; - -import static com.somemore.global.auth.oauth.domain.OAuthProvider.NAVER; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; - @Transactional class SendNoteToVolunteerServiceTest extends IntegrationTestSupport { @@ -24,37 +23,40 @@ class SendNoteToVolunteerServiceTest extends IntegrationTestSupport { private SendNoteToVolunteerService sendNoteToVolunteerService; @Autowired - private NoteJpaRepository noteJpaRepository; + private NoteRepository noteRepository; @Autowired - private VolunteerJpaRepository volunteerJpaRepository; + private NEWVolunteerRepository volunteerRepository; + + private NEWVolunteer volunteer; + + @BeforeEach + void setUp() { + volunteer = NEWVolunteer.createDefault(UUID.randomUUID()); + volunteerRepository.save(volunteer); + } @DisplayName("기관은 봉사자에게 쪽지를 보낼수 있다. (service)") @Test void sendNoteToVolunteer() { //given - Volunteer volunteer = createVolunteer(); - UUID senderId = volunteer.getId(); // 기관 ID + UUID senderId = UUID.randomUUID(); // 기관 ID UUID receiverId = volunteer.getId(); // 봉사자 ID String title = "안녕하세요, 서울 도서관입니다."; String content = "문의 주신 내용 답장드립니다."; - SendNoteToVolunteerRequestDto requestDto = new SendNoteToVolunteerRequestDto(receiverId, title, content); + SendNoteToVolunteerRequestDto requestDto = new SendNoteToVolunteerRequestDto(receiverId, + title, content); //when Long noteId = sendNoteToVolunteerService.sendNoteToVolunteer(senderId, requestDto); //then - Note savedNote = noteJpaRepository.findById(noteId).orElseThrow(() -> - new IllegalStateException("쪽지가 저장되지 않았습니다.")); - assertEquals(senderId, savedNote.getSenderId(), "발신자가 올바르지 않습니다."); - assertEquals(receiverId, savedNote.getReceiverId(), "수신자가 올바르지 않습니다."); - assertEquals(title, savedNote.getTitle(), "쪽지 제목이 올바르지 않습니다."); - assertEquals(content, savedNote.getContent(), "쪽지 내용이 올바르지 않습니다."); - assertFalse(savedNote.getIsRead(), "새로 생성된 쪽지는 읽음 상태가 기본적으로 false여야 합니다."); + Optional findNote = noteRepository.findById(noteId); + assertThat(findNote).isPresent(); + assertThat(findNote.get().getSenderId()).isEqualTo(senderId); + assertThat(findNote.get().getReceiverId()).isEqualTo(receiverId); + assertThat(findNote.get().getTitle()).isEqualTo(title); + assertThat(findNote.get().getContent()).isEqualTo(content); } - private Volunteer createVolunteer() { - Volunteer volunteer = Volunteer.createDefault(NAVER, "r1frewgergw"); - return volunteerJpaRepository.save(volunteer); - } } diff --git a/src/test/java/com/somemore/volunteer/repository/NEWVolunteerRepositoryImplTest.java b/src/test/java/com/somemore/volunteer/repository/NEWVolunteerRepositoryImplTest.java index 24653747..dca77269 100644 --- a/src/test/java/com/somemore/volunteer/repository/NEWVolunteerRepositoryImplTest.java +++ b/src/test/java/com/somemore/volunteer/repository/NEWVolunteerRepositoryImplTest.java @@ -114,4 +114,19 @@ void findVolunteerNicknameAndIdsByIds() { volunteer2.getUserId(), volunteer3.getUserId()); } + + @DisplayName("아이디로 존재 여부를 조회할 수 있다.") + @Test + void existsById() { + // given + NEWVolunteer volunteer = NEWVolunteer.createDefault(UUID.randomUUID()); + volunteerRepository.save(volunteer); + UUID id = volunteer.getId(); + + // when + boolean result = volunteerRepository.existsById(id); + + // then + assertThat(result).isTrue(); + } } diff --git a/src/test/java/com/somemore/volunteer/service/NEWVolunteerQueryServiceTest.java b/src/test/java/com/somemore/volunteer/service/NEWVolunteerQueryServiceTest.java index 89e5bf61..69d5ff9e 100644 --- a/src/test/java/com/somemore/volunteer/service/NEWVolunteerQueryServiceTest.java +++ b/src/test/java/com/somemore/volunteer/service/NEWVolunteerQueryServiceTest.java @@ -124,4 +124,18 @@ void findVolunteerNicknameAndIdsByIds() { volunteer2.getUserId(), volunteer3.getUserId()); } + + @DisplayName("존재하지 않는 아이디로 봉사자 존재여부를 검증하면 에러가 발생한다.") + @Test + void validateExistsById() { + // given + UUID wrongId = UUID.randomUUID(); + + // when + // then + assertThatThrownBy( + () -> volunteerQueryService.validateExistsById(wrongId)) + .isInstanceOf(NoSuchElementException.class) + .hasMessage(NOT_EXISTS_VOLUNTEER.getMessage()); + } } From ebe965375c0ee6b5004076755f5f9b67e138a8a6 Mon Sep 17 00:00:00 2001 From: leebs0521 Date: Fri, 7 Feb 2025 13:05:04 +0900 Subject: [PATCH 3/5] =?UTF-8?q?refactor(note):=20=EC=AA=BD=EC=A7=80=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=EA=B8=B0=EB=8A=A5=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/NoteQueryApiController.java | 23 +++++++----- .../note/repository/NoteRepositoryImpl.java | 36 +++++++++++-------- .../note/service/NoteMarkAsReadService.java | 5 ++- 3 files changed, 39 insertions(+), 25 deletions(-) diff --git a/src/main/java/com/somemore/domains/note/controller/NoteQueryApiController.java b/src/main/java/com/somemore/domains/note/controller/NoteQueryApiController.java index dce7bd80..0a45af20 100644 --- a/src/main/java/com/somemore/domains/note/controller/NoteQueryApiController.java +++ b/src/main/java/com/somemore/domains/note/controller/NoteQueryApiController.java @@ -5,10 +5,11 @@ import com.somemore.domains.note.repository.mapper.NoteReceiverViewForCenter; import com.somemore.domains.note.repository.mapper.NoteReceiverViewForVolunteer; import com.somemore.domains.note.usecase.NoteQueryUseCase; -import com.somemore.global.auth.annotation.CurrentUser; +import com.somemore.global.auth.annotation.RoleId; import com.somemore.global.common.response.ApiResponse; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import java.util.UUID; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -18,8 +19,6 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import java.util.UUID; - @Tag(name = "Note Query API", description = "쪽지 조회 API") @RequiredArgsConstructor @RequestMapping("/api/note") @@ -31,9 +30,12 @@ public class NoteQueryApiController { @Secured("ROLE_CENTER") @Operation(summary = "기관의 자신에게 온 쪽지 조회") @GetMapping("/center") - public ApiResponse> getNotesByCenterId(@CurrentUser UUID centerId, Pageable pageable) { + public ApiResponse> getNotesByCenterId( + @RoleId UUID centerId, + Pageable pageable) { - Page response = noteQueryUseCase.getNotesForCenter(centerId, pageable); + Page response = noteQueryUseCase.getNotesForCenter(centerId, + pageable); return ApiResponse.ok(200, response, "내 쪽지 조회 성공"); } @@ -41,9 +43,13 @@ public ApiResponse> getNotesByCenterId(@CurrentU @Secured("ROLE_VOLUNTEER") @Operation(summary = "봉사자의 자신에게 온 쪽지 조회") @GetMapping("/volunteer") - public ApiResponse> getNotesByVolunteerId(@CurrentUser UUID volunteerId, Pageable pageable) { + public ApiResponse> getNotesByVolunteerId( + @RoleId UUID volunteerId, + Pageable pageable + ) { - Page response = noteQueryUseCase.getNotesForVolunteer(volunteerId, pageable); + Page response = noteQueryUseCase.getNotesForVolunteer( + volunteerId, pageable); return ApiResponse.ok(200, response, "내 쪽지 조회 성공"); } @@ -61,7 +67,8 @@ public ApiResponse getNoteDetailForCenter(@PathVariable @Secured("ROLE_VOLUNTEER") @Operation(summary = "봉사자의 자신에게 온 쪽지 상세 조회") @GetMapping("/volunteer/{noteId}") - public ApiResponse getNoteDetailForVolunteer(@PathVariable Long noteId) { + public ApiResponse getNoteDetailForVolunteer( + @PathVariable Long noteId) { NoteDetailViewForVolunteer response = noteQueryUseCase.getNoteDetailForVolunteer(noteId); diff --git a/src/main/java/com/somemore/domains/note/repository/NoteRepositoryImpl.java b/src/main/java/com/somemore/domains/note/repository/NoteRepositoryImpl.java index e6653012..33ab27ae 100644 --- a/src/main/java/com/somemore/domains/note/repository/NoteRepositoryImpl.java +++ b/src/main/java/com/somemore/domains/note/repository/NoteRepositoryImpl.java @@ -4,24 +4,24 @@ import com.querydsl.core.types.dsl.BooleanExpression; import com.querydsl.jpa.impl.JPAQuery; import com.querydsl.jpa.impl.JPAQueryFactory; -import com.somemore.domains.center.domain.QCenter; +import com.somemore.center.domain.QNEWCenter; import com.somemore.domains.note.domain.Note; import com.somemore.domains.note.domain.QNote; import com.somemore.domains.note.repository.mapper.NoteDetailViewForCenter; import com.somemore.domains.note.repository.mapper.NoteDetailViewForVolunteer; import com.somemore.domains.note.repository.mapper.NoteReceiverViewForCenter; import com.somemore.domains.note.repository.mapper.NoteReceiverViewForVolunteer; -import com.somemore.domains.volunteer.domain.QVolunteer; +import com.somemore.user.domain.QUserCommonAttribute; +import com.somemore.volunteer.domain.QNEWVolunteer; +import java.util.List; +import java.util.Optional; +import java.util.UUID; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.support.PageableExecutionUtils; import org.springframework.stereotype.Repository; -import java.util.List; -import java.util.Optional; -import java.util.UUID; - @RequiredArgsConstructor @Repository public class NoteRepositoryImpl implements NoteRepository { @@ -30,8 +30,9 @@ public class NoteRepositoryImpl implements NoteRepository { private final NoteJpaRepository noteJpaRepository; private static final QNote note = QNote.note; - private static final QVolunteer volunteer = QVolunteer.volunteer; - private static final QCenter center = QCenter.center; + private static final QNEWVolunteer volunteer = QNEWVolunteer.nEWVolunteer; + private static final QNEWCenter center = QNEWCenter.nEWCenter; + private static final QUserCommonAttribute userCommonAttribute = QUserCommonAttribute.userCommonAttribute; private static final String SENDER_ID = "senderId"; private static final String SENDER_NAME = "senderName"; @@ -48,7 +49,8 @@ public Optional findById(Long noteId) { } @Override - public Page findNotesByReceiverIsCenter(UUID centerId, Pageable pageable) { + public Page findNotesByReceiverIsCenter(UUID centerId, + Pageable pageable) { BooleanExpression activeVolunteer = isActiveVolunteer(); BooleanExpression condition = isReceiver(centerId); @@ -79,7 +81,8 @@ public Page findNotesByReceiverIsCenter(UUID centerId } @Override - public Page findNotesByReceiverIsVolunteer(UUID volunteerId, Pageable pageable) { + public Page findNotesByReceiverIsVolunteer(UUID volunteerId, + Pageable pageable) { BooleanExpression activeCenter = isActiveCenter(); BooleanExpression condition = isReceiver(volunteerId); @@ -89,11 +92,12 @@ public Page findNotesByReceiverIsVolunteer(UUID vo note.id, note.title, center.id.as(SENDER_ID), - center.name.as(SENDER_NAME), + userCommonAttribute.name.as(SENDER_NAME), note.isRead )) .from(note) .join(center).on(note.senderId.eq(center.id).and(activeCenter)) + .join(userCommonAttribute).on(center.userId.eq(userCommonAttribute.userId)) .where(condition) .offset(pageable.getOffset()) .limit(pageable.getPageSize()) @@ -103,6 +107,8 @@ public Page findNotesByReceiverIsVolunteer(UUID vo JPAQuery count = queryFactory .select(note.count()) .from(note) + .join(center).on(note.senderId.eq(center.id).and(activeCenter)) + .join(userCommonAttribute).on(center.userId.eq(userCommonAttribute.userId)) .where(condition); return PageableExecutionUtils.getPage(results, pageable, count::fetchOne); @@ -121,11 +127,12 @@ public Optional findNoteDetailViewReceiverIsCenter(Long note.content, volunteer.id.as(SENDER_ID), volunteer.nickname.as(SENDER_NAME), - volunteer.imgUrl.as(SENDER_PROFILE_IMG_LINK), + userCommonAttribute.imgUrl.as(SENDER_PROFILE_IMG_LINK), note.createdAt )) .from(note) .join(volunteer).on(note.senderId.eq(volunteer.id).and(activeVolunteer)) + .join(userCommonAttribute).on(volunteer.userId.eq(userCommonAttribute.userId)) .where(note.id.eq(noteId).and(note.deleted.eq(false))) .fetchOne(); @@ -144,12 +151,13 @@ public Optional findNoteDetailViewReceiverIsVoluntee note.title, note.content, center.id.as(SENDER_ID), - center.name.as(SENDER_NAME), - center.imgUrl.as(SENDER_PROFILE_IMG_LINK), + userCommonAttribute.name.as(SENDER_NAME), + userCommonAttribute.imgUrl.as(SENDER_PROFILE_IMG_LINK), note.createdAt )) .from(note) .join(center).on(note.senderId.eq(center.id).and(activeCenter)) + .join(userCommonAttribute).on(center.userId.eq(userCommonAttribute.userId)) .where(note.id.eq(noteId).and(note.deleted.eq(false))) .fetchOne(); diff --git a/src/main/java/com/somemore/domains/note/service/NoteMarkAsReadService.java b/src/main/java/com/somemore/domains/note/service/NoteMarkAsReadService.java index da3afcda..ae9b49ba 100644 --- a/src/main/java/com/somemore/domains/note/service/NoteMarkAsReadService.java +++ b/src/main/java/com/somemore/domains/note/service/NoteMarkAsReadService.java @@ -1,5 +1,7 @@ package com.somemore.domains.note.service; +import static com.somemore.global.exception.ExceptionMessage.NOT_EXISTS_NOTE; + import com.somemore.domains.note.domain.Note; import com.somemore.domains.note.repository.NoteRepository; import com.somemore.domains.note.usecase.NoteMarkAsReadUseCase; @@ -8,8 +10,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import static com.somemore.global.exception.ExceptionMessage.NOT_EXISTS_NOTE; - @RequiredArgsConstructor @Service @Transactional @@ -21,7 +21,6 @@ public class NoteMarkAsReadService implements NoteMarkAsReadUseCase { public void noteMarkAsRead(Long noteId) { Note note = getNote(noteId); note.markAsRead(); - noteRepository.save(note); } private Note getNote(Long noteId) { From 6a7d076ea654748f25ac83785ffd11aa186f860b Mon Sep 17 00:00:00 2001 From: leebs0521 Date: Fri, 7 Feb 2025 13:05:18 +0900 Subject: [PATCH 4/5] =?UTF-8?q?test(note):=20=EC=AA=BD=EC=A7=80=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=EA=B8=B0=EB=8A=A5=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A7=81=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../NoteQueryApiControllerTest.java | 43 +++---- .../repository/NoteRepositoryImplTest.java | 115 ++++++++--------- .../note/service/NoteQueryServiceTest.java | 119 +++++++++--------- 3 files changed, 143 insertions(+), 134 deletions(-) diff --git a/src/test/java/com/somemore/domains/note/controller/NoteQueryApiControllerTest.java b/src/test/java/com/somemore/domains/note/controller/NoteQueryApiControllerTest.java index d2068326..13e0e69b 100644 --- a/src/test/java/com/somemore/domains/note/controller/NoteQueryApiControllerTest.java +++ b/src/test/java/com/somemore/domains/note/controller/NoteQueryApiControllerTest.java @@ -1,5 +1,13 @@ package com.somemore.domains.note.controller; +import static com.somemore.global.exception.ExceptionMessage.NOT_EXISTS_NOTE; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.when; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + import com.somemore.domains.note.repository.mapper.NoteDetailViewForCenter; import com.somemore.domains.note.repository.mapper.NoteDetailViewForVolunteer; import com.somemore.domains.note.repository.mapper.NoteReceiverViewForCenter; @@ -7,7 +15,10 @@ import com.somemore.domains.note.usecase.NoteQueryUseCase; import com.somemore.global.exception.NoSuchElementException; import com.somemore.support.ControllerTestSupport; -import com.somemore.support.annotation.WithMockCustomUser; +import com.somemore.support.annotation.MockUser; +import java.time.LocalDateTime; +import java.util.List; +import java.util.UUID; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.boot.test.mock.mockito.MockBean; @@ -17,18 +28,6 @@ import org.springframework.data.domain.Pageable; import org.springframework.http.MediaType; -import java.time.LocalDateTime; -import java.util.List; -import java.util.UUID; - -import static com.somemore.global.exception.ExceptionMessage.NOT_EXISTS_NOTE; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.when; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - class NoteQueryApiControllerTest extends ControllerTestSupport { @MockBean @@ -36,7 +35,7 @@ class NoteQueryApiControllerTest extends ControllerTestSupport { @DisplayName("기관은 자신에게 온 쪽지를 페이지 형태로 확인할 수 있다. (Controller)") @Test - @WithMockCustomUser(role = "CENTER") + @MockUser(role = "ROLE_CENTER") void getNotesByCenterId() throws Exception { // given Pageable pageable = PageRequest.of(0, 6); @@ -54,7 +53,8 @@ void getNotesByCenterId() throws Exception { .isRead(true) .build() ); - Page mockResponse = new PageImpl<>(notes, pageable, notes.size()); + Page mockResponse = new PageImpl<>(notes, pageable, + notes.size()); when(noteQueryUseCase.getNotesForCenter(any(UUID.class), eq(pageable))) .thenReturn(mockResponse); @@ -83,7 +83,7 @@ void getNotesByCenterId() throws Exception { @DisplayName("봉사자는 자신에게 온 쪽지를 페이지 형태로 확인할 수 있다. (Controller)") @Test - @WithMockCustomUser + @MockUser void getNotesByVolunteerId() throws Exception { // given Pageable pageable = PageRequest.of(0, 6); @@ -101,7 +101,8 @@ void getNotesByVolunteerId() throws Exception { .isRead(true) .build() ); - Page mockResponse = new PageImpl<>(notes, pageable, notes.size()); + Page mockResponse = new PageImpl<>(notes, pageable, + notes.size()); when(noteQueryUseCase.getNotesForVolunteer(any(UUID.class), eq(pageable))) .thenReturn(mockResponse); @@ -130,7 +131,7 @@ void getNotesByVolunteerId() throws Exception { @DisplayName("기관은 특정 쪽지의 상세 내용을 조회할 수 있다. (Controller)") @Test - @WithMockCustomUser(role = "CENTER") + @MockUser(role = "ROLE_CENTER") void getNoteDetailForCenter() throws Exception { // given Long noteId = 1L; @@ -162,7 +163,7 @@ void getNoteDetailForCenter() throws Exception { @DisplayName("봉사자는 특정 쪽지의 상세 내용을 조회할 수 있다. (Controller)") @Test - @WithMockCustomUser + @MockUser void getNoteDetailForVolunteer() throws Exception { // given Long noteId = 1L; @@ -194,7 +195,7 @@ void getNoteDetailForVolunteer() throws Exception { @DisplayName("존재하지 않는 쪽지를 기관이 조회할 경우 예외를 반환한다.") @Test - @WithMockCustomUser(role = "CENTER") + @MockUser(role = "ROLE_CENTER") void getNoteDetailForCenter_NotFound() throws Exception { // given Long nonExistentNoteId = 9999L; @@ -213,7 +214,7 @@ void getNoteDetailForCenter_NotFound() throws Exception { @DisplayName("존재하지 않는 쪽지를 봉사자가 조회할 경우 예외를 반환한다.") @Test - @WithMockCustomUser + @MockUser void getNoteDetailForVolunteer_NotFound() throws Exception { // given Long nonExistentNoteId = 9999L; diff --git a/src/test/java/com/somemore/domains/note/repository/NoteRepositoryImplTest.java b/src/test/java/com/somemore/domains/note/repository/NoteRepositoryImplTest.java index 6a1085d2..be016972 100644 --- a/src/test/java/com/somemore/domains/note/repository/NoteRepositoryImplTest.java +++ b/src/test/java/com/somemore/domains/note/repository/NoteRepositoryImplTest.java @@ -1,15 +1,23 @@ package com.somemore.domains.note.repository; -import com.somemore.domains.center.domain.Center; -import com.somemore.domains.center.repository.center.CenterJpaRepository; +import static org.assertj.core.api.Assertions.assertThat; + +import com.somemore.center.domain.NEWCenter; +import com.somemore.center.repository.NEWCenterRepository; import com.somemore.domains.note.domain.Note; import com.somemore.domains.note.repository.mapper.NoteDetailViewForCenter; import com.somemore.domains.note.repository.mapper.NoteDetailViewForVolunteer; import com.somemore.domains.note.repository.mapper.NoteReceiverViewForCenter; import com.somemore.domains.note.repository.mapper.NoteReceiverViewForVolunteer; -import com.somemore.domains.volunteer.domain.Volunteer; -import com.somemore.domains.volunteer.repository.VolunteerJpaRepository; import com.somemore.support.IntegrationTestSupport; +import com.somemore.user.domain.UserCommonAttribute; +import com.somemore.user.domain.UserRole; +import com.somemore.user.repository.usercommonattribute.UserCommonAttributeRepository; +import com.somemore.volunteer.domain.NEWVolunteer; +import com.somemore.volunteer.repository.NEWVolunteerRepository; +import java.util.Optional; +import java.util.UUID; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -18,12 +26,6 @@ import org.springframework.data.domain.Pageable; import org.springframework.transaction.annotation.Transactional; -import java.util.Optional; -import java.util.UUID; - -import static com.somemore.global.auth.oauth.domain.OAuthProvider.NAVER; -import static org.assertj.core.api.Assertions.assertThat; - @Transactional class NoteRepositoryImplTest extends IntegrationTestSupport { @@ -31,21 +33,46 @@ class NoteRepositoryImplTest extends IntegrationTestSupport { private NoteRepository noteRepository; @Autowired - private VolunteerJpaRepository volunteerJpaRepository; + private NEWVolunteerRepository volunteerRepository; + + @Autowired + private NEWCenterRepository centerRepository; @Autowired - private CenterJpaRepository centerJpaRepository; + private UserCommonAttributeRepository userCommonAttributeRepository; + + private NEWCenter center; + private UserCommonAttribute centerInfo; + private NEWVolunteer volunteer; + private UserCommonAttribute volunteerInfo; + + @BeforeEach + void setUp() { + center = NEWCenter.createDefault(UUID.randomUUID()); + centerRepository.save(center); + + volunteer = NEWVolunteer.createDefault(UUID.randomUUID()); + volunteerRepository.save(volunteer); + + centerInfo = UserCommonAttribute.createDefault(center.getUserId(), UserRole.CENTER); + volunteerInfo = UserCommonAttribute.createDefault(volunteer.getUserId(), + UserRole.VOLUNTEER); + + userCommonAttributeRepository.save(centerInfo); + userCommonAttributeRepository.save(volunteerInfo); + } @DisplayName("기관은 자신에게 수신된 쪽지를 페이지로 확인할 수 있다. (Repository)") @Test void findNotesByReceiverIsCenter() { //given - UUID centerId = UUID.randomUUID(); + UUID centerId = center.getId(); createTestNotesForCenter(centerId); Pageable pageable = PageRequest.of(1, 6); //when - Page result = noteRepository.findNotesByReceiverIsCenter(centerId, pageable); + Page result = noteRepository.findNotesByReceiverIsCenter( + centerId, pageable); //then assertThat(result).isNotNull(); @@ -58,12 +85,13 @@ void findNotesByReceiverIsCenter() { @Test void findNotesByReceiverIsVolunteer() { //given - UUID volunteerId = UUID.randomUUID(); + UUID volunteerId = volunteer.getId(); createTestNotesForVolunteer(volunteerId); Pageable pageable = PageRequest.of(1, 6); //when - Page result = noteRepository.findNotesByReceiverIsVolunteer(volunteerId, pageable); + Page result = noteRepository.findNotesByReceiverIsVolunteer( + volunteerId, pageable); //then assertThat(result).isNotNull(); @@ -76,12 +104,13 @@ void findNotesByReceiverIsVolunteer() { @Test void findNoteDetailViewReceiverIsCenter() { // given - Center center = createCenter(); - Volunteer volunteer = createVolunteer(); - Note note = createNote(center.getId(), volunteer.getId()); + String title = "쪽지 제목1"; + Note note = createNote(center.getId(), volunteer.getId(), title); + noteRepository.save(note); // when - Optional result = noteRepository.findNoteDetailViewReceiverIsCenter(note.getId()); + Optional result = noteRepository.findNoteDetailViewReceiverIsCenter( + note.getId()); // then assertThat(result).isPresent(); @@ -93,19 +122,20 @@ void findNoteDetailViewReceiverIsCenter() { assertThat(detailView.content()).isEqualTo(note.getContent()); assertThat(detailView.senderId()).isEqualTo(volunteer.getId()); assertThat(detailView.senderName()).isEqualTo(volunteer.getNickname()); - assertThat(detailView.senderProfileImgLink()).isEqualTo(volunteer.getImgUrl()); + assertThat(detailView.senderProfileImgLink()).isEqualTo(volunteerInfo.getImgUrl()); } @DisplayName("봉사자는 자신에게 온 쪽지의 상세 내용을 확인할 수 있다 (Repository)") @Test void findNoteDetailViewReceiverIsVolunteer() { //given - Center center = createCenter(); - Volunteer volunteer = createVolunteer(); - Note note = createNote(volunteer.getId(), center.getId()); + String title = "쪽지 제목2"; + Note note = createNote(volunteer.getId(), center.getId(), title); + noteRepository.save(note); //when - Optional result = noteRepository.findNoteDetailViewReceiverIsVolunteer(note.getId()); + Optional result = noteRepository.findNoteDetailViewReceiverIsVolunteer( + note.getId()); //then assertThat(result).isPresent(); @@ -116,50 +146,23 @@ void findNoteDetailViewReceiverIsVolunteer() { assertThat(detailView.title()).isEqualTo(note.getTitle()); assertThat(detailView.content()).isEqualTo(note.getContent()); assertThat(detailView.senderId()).isEqualTo(center.getId()); - assertThat(detailView.senderName()).isEqualTo(center.getName()); - assertThat(detailView.senderProfileImgLink()).isEqualTo(center.getImgUrl()); + assertThat(detailView.senderName()).isEqualTo(centerInfo.getName()); + assertThat(detailView.senderProfileImgLink()).isEqualTo(centerInfo.getImgUrl()); } - private Note createNote(UUID receiverId, UUID senderId){ - Note note = Note.create(senderId, receiverId, "제목", "내용"); - noteRepository.save(note); - - return note; + private Note createNote(UUID receiverId, UUID senderId, String title) { + return Note.create(senderId, receiverId, title, "내용"); } private void createTestNotesForCenter(UUID centerId) { for (int i = 1; i <= 15; i++) { - Volunteer volunteer = createVolunteer(); - volunteerJpaRepository.save(volunteer); - Note note = Note.create(volunteer.getId(), centerId, "Note " + i, "내용"); noteRepository.save(note); } } - private Center createCenter() { - Center center = Center.create( - "기본 기관 이름", - "010-1234-5678", - "http://example.com/image.jpg", - "기관 소개 내용", - "http://example.com" - ); - - centerJpaRepository.save(center); - - return center; - } - - private Volunteer createVolunteer() { - Volunteer volunteer = Volunteer.createDefault(NAVER, UUID.randomUUID().toString()); - return volunteerJpaRepository.save(volunteer); - } - private void createTestNotesForVolunteer(UUID volunteerId) { for (int i = 1; i <= 15; i++) { - Center center = createCenter(); - Note note = Note.create(center.getId(), volunteerId, "Note " + i, "내용"); noteRepository.save(note); } diff --git a/src/test/java/com/somemore/domains/note/service/NoteQueryServiceTest.java b/src/test/java/com/somemore/domains/note/service/NoteQueryServiceTest.java index 059d42be..50478a34 100644 --- a/src/test/java/com/somemore/domains/note/service/NoteQueryServiceTest.java +++ b/src/test/java/com/somemore/domains/note/service/NoteQueryServiceTest.java @@ -1,17 +1,26 @@ package com.somemore.domains.note.service; -import com.somemore.domains.center.domain.Center; -import com.somemore.domains.center.repository.center.CenterJpaRepository; +import static com.somemore.global.exception.ExceptionMessage.NOT_EXISTS_NOTE; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import com.somemore.center.domain.NEWCenter; +import com.somemore.center.repository.NEWCenterRepository; import com.somemore.domains.note.domain.Note; import com.somemore.domains.note.repository.NoteRepository; import com.somemore.domains.note.repository.mapper.NoteDetailViewForCenter; import com.somemore.domains.note.repository.mapper.NoteDetailViewForVolunteer; import com.somemore.domains.note.repository.mapper.NoteReceiverViewForCenter; import com.somemore.domains.note.repository.mapper.NoteReceiverViewForVolunteer; -import com.somemore.domains.volunteer.domain.Volunteer; -import com.somemore.domains.volunteer.repository.VolunteerJpaRepository; import com.somemore.global.exception.NoSuchElementException; import com.somemore.support.IntegrationTestSupport; +import com.somemore.user.domain.UserCommonAttribute; +import com.somemore.user.domain.UserRole; +import com.somemore.user.repository.usercommonattribute.UserCommonAttributeRepository; +import com.somemore.volunteer.domain.NEWVolunteer; +import com.somemore.volunteer.repository.NEWVolunteerRepository; +import java.util.UUID; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -20,13 +29,6 @@ import org.springframework.data.domain.Pageable; import org.springframework.transaction.annotation.Transactional; -import java.util.UUID; - -import static com.somemore.global.auth.oauth.domain.OAuthProvider.NAVER; -import static com.somemore.global.exception.ExceptionMessage.NOT_EXISTS_NOTE; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - @Transactional class NoteQueryServiceTest extends IntegrationTestSupport { @@ -37,21 +39,46 @@ class NoteQueryServiceTest extends IntegrationTestSupport { private NoteRepository noteRepository; @Autowired - private VolunteerJpaRepository volunteerJpaRepository; + private NEWVolunteerRepository volunteerRepository; + + @Autowired + private NEWCenterRepository centerRepository; @Autowired - private CenterJpaRepository centerJpaRepository; + private UserCommonAttributeRepository userCommonAttributeRepository; + + private NEWCenter center; + private UserCommonAttribute centerInfo; + private NEWVolunteer volunteer; + private UserCommonAttribute volunteerInfo; + + @BeforeEach + void setUp() { + center = NEWCenter.createDefault(UUID.randomUUID()); + centerRepository.save(center); + + volunteer = NEWVolunteer.createDefault(UUID.randomUUID()); + volunteerRepository.save(volunteer); + + centerInfo = UserCommonAttribute.createDefault(center.getUserId(), UserRole.CENTER); + volunteerInfo = UserCommonAttribute.createDefault(volunteer.getUserId(), + UserRole.VOLUNTEER); + + userCommonAttributeRepository.save(centerInfo); + userCommonAttributeRepository.save(volunteerInfo); + } @DisplayName("기관은 자신에게 온 쪽지를 페이지 형태로 확인할 수 있다. (Service)") @Test void getNotesForCenter() { //given - UUID centerId = UUID.randomUUID(); + UUID centerId = center.getId(); createTestNotesForCenter(centerId); Pageable pageable = PageRequest.of(1, 6); //when - Page result = noteQueryService.getNotesForCenter(centerId, pageable); + Page result = noteQueryService.getNotesForCenter(centerId, + pageable); //then assertThat(result).isNotNull(); @@ -64,12 +91,13 @@ void getNotesForCenter() { @Test void getNotesForVolunteer() { //given - UUID volunteerId = UUID.randomUUID(); + UUID volunteerId = volunteer.getId(); createTestNotesForVolunteer(volunteerId); Pageable pageable = PageRequest.of(1, 6); //when - Page result = noteQueryService.getNotesForVolunteer(volunteerId, pageable); + Page result = noteQueryService.getNotesForVolunteer( + volunteerId, pageable); //then assertThat(result).isNotNull(); @@ -82,9 +110,10 @@ void getNotesForVolunteer() { @Test void getNoteDetailForCenter() { // given - UUID centerId = UUID.randomUUID(); - Volunteer volunteer = createVolunteer(); - Note note = createNote(centerId, volunteer.getId()); + String title = "제목 1"; + UUID centerId = center.getId(); + Note note = createNote(centerId, volunteer.getId(), title); + noteRepository.save(note); // when NoteDetailViewForCenter result = noteQueryService.getNoteDetailForCenter(note.getId()); @@ -96,7 +125,7 @@ void getNoteDetailForCenter() { assertThat(result.content()).isEqualTo(note.getContent()); assertThat(result.senderId()).isEqualTo(volunteer.getId()); assertThat(result.senderName()).isEqualTo(volunteer.getNickname()); - assertThat(result.senderProfileImgLink()).isEqualTo(volunteer.getImgUrl()); + assertThat(result.senderProfileImgLink()).isEqualTo(volunteerInfo.getImgUrl()); } @DisplayName("존재하지 않는 쪽지 조회 시 예외를 던진다 - 기관") @@ -106,7 +135,8 @@ void getNoteDetailForCenter_NotFound() { Long nonExistentNoteId = 9999L; // when, then - assertThatThrownBy(() -> noteQueryService.getNoteDetailForCenter(nonExistentNoteId)) + assertThatThrownBy( + () -> noteQueryService.getNoteDetailForCenter(nonExistentNoteId)) .isInstanceOf(NoSuchElementException.class) .hasMessage(NOT_EXISTS_NOTE.getMessage()); } @@ -115,12 +145,14 @@ void getNoteDetailForCenter_NotFound() { @Test void getNoteDetailForVolunteer() { // given - UUID volunteerId = UUID.randomUUID(); - Center center = createCenter(); - Note note = createNote(volunteerId, center.getId()); + String title = "제목 2"; + UUID volunteerId = volunteer.getId(); + Note note = createNote(volunteerId, center.getId(), title); + noteRepository.save(note); // when - NoteDetailViewForVolunteer result = noteQueryService.getNoteDetailForVolunteer(note.getId()); + NoteDetailViewForVolunteer result = noteQueryService.getNoteDetailForVolunteer( + note.getId()); //then assertThat(result).isNotNull(); @@ -128,8 +160,8 @@ void getNoteDetailForVolunteer() { assertThat(result.title()).isEqualTo(note.getTitle()); assertThat(result.content()).isEqualTo(note.getContent()); assertThat(result.senderId()).isEqualTo(center.getId()); - assertThat(result.senderName()).isEqualTo(center.getName()); - assertThat(result.senderProfileImgLink()).isEqualTo(center.getImgUrl()); + assertThat(result.senderName()).isEqualTo(centerInfo.getName()); + assertThat(result.senderProfileImgLink()).isEqualTo(centerInfo.getImgUrl()); } @DisplayName("존재하지 않는 쪽지 조회 시 예외를 던진다 - 봉사자") @@ -144,48 +176,21 @@ void getNoteDetailForVolunteer_NotFound() { .hasMessage(NOT_EXISTS_NOTE.getMessage()); } - private Note createNote(UUID receiverId, UUID senderId){ - Note note = Note.create(senderId, receiverId, "제목", "내용"); - noteRepository.save(note); - - return note; + private Note createNote(UUID receiverId, UUID senderId, String title) { + return Note.create(senderId, receiverId, title, "내용"); } private void createTestNotesForCenter(UUID centerId) { for (int i = 1; i <= 15; i++) { - Volunteer volunteer = createVolunteer(); - volunteerJpaRepository.save(volunteer); - Note note = Note.create(volunteer.getId(), centerId, "Note " + i, "내용"); noteRepository.save(note); } } - private Volunteer createVolunteer() { - Volunteer volunteer = Volunteer.createDefault(NAVER, UUID.randomUUID().toString()); - return volunteerJpaRepository.save(volunteer); - } - private void createTestNotesForVolunteer(UUID volunteerId) { for (int i = 1; i <= 15; i++) { - Center center = createCenter(); - Note note = Note.create(center.getId(), volunteerId, "Note " + i, "내용"); noteRepository.save(note); } } - - private Center createCenter() { - Center center = Center.create( - "기본 기관 이름", - "010-1234-5678", - "http://example.com/image.jpg", - "기관 소개 내용", - "http://example.com" - ); - - centerJpaRepository.save(center); - - return center; - } } From faa92370bc70346503d61795af204eb088c0c8fd Mon Sep 17 00:00:00 2001 From: leebs0521 Date: Fri, 7 Feb 2025 13:09:26 +0900 Subject: [PATCH 5/5] =?UTF-8?q?refactor(note):=20=EC=AA=BD=EC=A7=80=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=95=20=EC=A1=B0=ED=9A=8C=20=EC=B9=B4?= =?UTF-8?q?=EC=9A=B4=ED=8A=B8=20=EC=BF=BC=EB=A6=AC=20=EC=A1=B0=EA=B1=B4=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/somemore/domains/note/repository/NoteRepositoryImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/somemore/domains/note/repository/NoteRepositoryImpl.java b/src/main/java/com/somemore/domains/note/repository/NoteRepositoryImpl.java index 33ab27ae..c7711daf 100644 --- a/src/main/java/com/somemore/domains/note/repository/NoteRepositoryImpl.java +++ b/src/main/java/com/somemore/domains/note/repository/NoteRepositoryImpl.java @@ -75,6 +75,7 @@ public Page findNotesByReceiverIsCenter(UUID centerId JPAQuery count = queryFactory .select(note.count()) .from(note) + .join(volunteer).on(note.senderId.eq(volunteer.id).and(activeVolunteer)) .where(condition); return PageableExecutionUtils.getPage(results, pageable, count::fetchOne);