diff --git a/src/docs/asciidoc/message.adoc b/src/docs/asciidoc/message.adoc index 6835679e..5d47a65f 100644 --- a/src/docs/asciidoc/message.adoc +++ b/src/docs/asciidoc/message.adoc @@ -1,6 +1,6 @@ == 그룹별 메세지 보내기 -=== 메시지 보내기 +=== 상태에 따른 메시지 보내기 메세지를 보낼 원서의 상태를 입력해 메시지를 보낼 수 있습니다. ==== 요청 형식 @@ -21,4 +21,25 @@ include::{snippets}/message-controller-test/조회할_상태의_원서를_가진 include::{snippets}/message-controller-test/조회할_상태의_원서를_가진_학생들에게/http-response.adoc[] ===== 입력한 상태의 원서가 없거나 상태를 잘못 입력한 경우 -include::{snippets}/message-controller-test/해당제출상태인_원서가_없으면_오류가난다/http-response.adoc[] \ No newline at end of file +include::{snippets}/message-controller-test/해당제출상태인_원서가_없으면_오류가난다/http-response.adoc[] + +=== 전형에 따른 메시지 보내기 +메세지를 보낼 원서의 전형을 입력해 메시지를 보낼 수 있습니다. + +=== 요청 형식 + +==== Request Header +include::{snippets}/message-controller-test/마이스터전형과_마이스터에서_일반전형으로_바뀐_합격자를_제외한_1차_합격자들에게_메시지를_보낸다/request-headers.adoc[] + +==== Request Body +include::{snippets}/message-controller-test/마이스터전형과_마이스터에서_일반전형으로_바뀐_합격자를_제외한_1차_합격자들에게_메시지를_보낸다/request-fields.adoc[] + +==== 요청 +===== 일반전형(마이스터전형 & 마이스터 -> 일반을 제외한 모든 전형) 1차 합격자에게 메시지를 보내는 경우 +include::{snippets}/message-controller-test/마이스터전형과_마이스터에서_일반전형으로_바뀐_합격자를_제외한_1차_합격자들에게_메시지를_보낸다/http-request.adoc[] + +===== 마이스터 -> 일반 전형으로 바뀐 1차 합격자들에게 메시지를 보내는 경우 +include::{snippets}/message-controller-test/마이스터전형에서_일반전형으로_바뀐_1차_합격자들에게_메시지를_보낸다/http-request.adoc[] + +===== 마이스터전형 1차 합격자들에게 메시지를 보내는 경우 +include::{snippets}/message-controller-test/마이스터_전형_1차_합격자들에게_메시지를_보낸다/http-request.adoc[]https://xxx[] \ No newline at end of file diff --git a/src/main/java/com/bamdoliro/maru/application/message/SendMessageUseCase.java b/src/main/java/com/bamdoliro/maru/application/message/SendMessageUseCase.java index 0aad401d..814e0745 100644 --- a/src/main/java/com/bamdoliro/maru/application/message/SendMessageUseCase.java +++ b/src/main/java/com/bamdoliro/maru/application/message/SendMessageUseCase.java @@ -1,9 +1,11 @@ package com.bamdoliro.maru.application.message; import com.bamdoliro.maru.domain.form.domain.Form; +import com.bamdoliro.maru.domain.form.domain.type.FormType; import com.bamdoliro.maru.infrastructure.message.SendMessageService; import com.bamdoliro.maru.infrastructure.persistence.form.FormRepository; -import com.bamdoliro.maru.presentation.message.dto.request.SendMessageRequest; +import com.bamdoliro.maru.presentation.message.dto.request.SendMessageByStatusRequest; +import com.bamdoliro.maru.presentation.message.dto.request.SendMessageByTypeRequest; import com.bamdoliro.maru.shared.annotation.UseCase; import lombok.RequiredArgsConstructor; @@ -16,11 +18,43 @@ public class SendMessageUseCase { private final FormRepository formRepository; private final SendMessageService sendMessageService; - public void execute(SendMessageRequest request) { + public void execute(SendMessageByStatusRequest request) { List
formList = formRepository.findByStatus(request.getStatus()); - List phoneNumberList = formList.stream() + List phoneNumberList = phoneNumberListConvert(formList); + + sendMessageService.execute(phoneNumberList, request.getText(), request.getTitle()); + } + + public void execute(SendMessageByTypeRequest request) { + List formList = formListFilter(request.getFormType(), request.getIsChangeToRegular()); + List phoneNumberList = phoneNumberListConvert(formList); + + sendMessageService.execute(phoneNumberList, request.getText(), request.getTitle()); + } + + private List formListFilter(FormType formType, Boolean isChangeToRegular) { + List formList; + if (formType.isMeister()) { + formList = formRepository.findMeisterTalentFirstRoundForm(); + } else { + formList = formRepository.findNotExistsMeisterTalentFirstRoundForm(); + if (isChangeToRegular) { + formList = formList.stream() + .filter(Form::getChangedToRegular) + .toList(); + } else { + formList = formList.stream() + .filter(form -> !form.getChangedToRegular()) + .toList(); + } + } + + return formList; + } + + private List phoneNumberListConvert(List formList) { + return formList.stream() .map(form -> form.getUser().getPhoneNumber()) .toList(); - sendMessageService.execute(phoneNumberList, request.getText(), request.getTitle()); } } diff --git a/src/main/java/com/bamdoliro/maru/domain/form/domain/Form.java b/src/main/java/com/bamdoliro/maru/domain/form/domain/Form.java index 24af92b1..793ee92c 100644 --- a/src/main/java/com/bamdoliro/maru/domain/form/domain/Form.java +++ b/src/main/java/com/bamdoliro/maru/domain/form/domain/Form.java @@ -195,6 +195,7 @@ public boolean isFailedNow() { public void changeToRegular(CalculateFormScoreService calculateFormScoreService) { this.changedToRegular = true; + this.type = FormType.REGULAR; Double subjectGradeScore = calculateFormScoreService.calculateSubjectGradeScore(this); this.score.updateSubjectScore(subjectGradeScore); diff --git a/src/main/java/com/bamdoliro/maru/infrastructure/message/SendMessageService.java b/src/main/java/com/bamdoliro/maru/infrastructure/message/SendMessageService.java index 237052f8..6f8726c5 100644 --- a/src/main/java/com/bamdoliro/maru/infrastructure/message/SendMessageService.java +++ b/src/main/java/com/bamdoliro/maru/infrastructure/message/SendMessageService.java @@ -19,7 +19,6 @@ public class SendMessageService { private final MessageProperties messageProperties; private final DefaultMessageService messageService; - private final FormRepository formRepository; public void execute(String to, String text) { Message message = createMessage(to, text); diff --git a/src/main/java/com/bamdoliro/maru/infrastructure/persistence/form/FormRepositoryCustom.java b/src/main/java/com/bamdoliro/maru/infrastructure/persistence/form/FormRepositoryCustom.java index 77801104..ed7dec7e 100644 --- a/src/main/java/com/bamdoliro/maru/infrastructure/persistence/form/FormRepositoryCustom.java +++ b/src/main/java/com/bamdoliro/maru/infrastructure/persistence/form/FormRepositoryCustom.java @@ -12,6 +12,8 @@ public interface FormRepositoryCustom { List findReceivedSpecialForm(); List findReceivedRegularOrSupernumeraryForm(); List findFirstRoundForm(); + List findMeisterTalentFirstRoundForm(); + List findNotExistsMeisterTalentFirstRoundForm(); List findSecondRoundForm(); List findByFormIdList(List idList); List findFormUrlByFormIdList(List idList); diff --git a/src/main/java/com/bamdoliro/maru/infrastructure/persistence/form/FormRepositoryImpl.java b/src/main/java/com/bamdoliro/maru/infrastructure/persistence/form/FormRepositoryImpl.java index e70765f8..f78df470 100644 --- a/src/main/java/com/bamdoliro/maru/infrastructure/persistence/form/FormRepositoryImpl.java +++ b/src/main/java/com/bamdoliro/maru/infrastructure/persistence/form/FormRepositoryImpl.java @@ -86,6 +86,26 @@ public List findFirstRoundForm() { .fetch(); } + @Override + public List findMeisterTalentFirstRoundForm() { + return queryFactory + .selectFrom(form) + .where(form.status.eq(FormStatus.FIRST_PASSED) + .and(form.type.eq(FormType.MEISTER_TALENT)) + ) + .fetch(); + } + + @Override + public List findNotExistsMeisterTalentFirstRoundForm() { + return queryFactory + .selectFrom(form) + .where(form.status.eq(FormStatus.FIRST_PASSED) + .and(form.type.ne(FormType.MEISTER_TALENT)) + ) + .fetch(); + } + @Override public List findSecondRoundForm() { return queryFactory diff --git a/src/main/java/com/bamdoliro/maru/presentation/message/MessageController.java b/src/main/java/com/bamdoliro/maru/presentation/message/MessageController.java index 75c10a52..362569de 100644 --- a/src/main/java/com/bamdoliro/maru/presentation/message/MessageController.java +++ b/src/main/java/com/bamdoliro/maru/presentation/message/MessageController.java @@ -2,8 +2,8 @@ import com.bamdoliro.maru.application.message.SendMessageUseCase; import com.bamdoliro.maru.domain.user.domain.User; -import com.bamdoliro.maru.infrastructure.message.SendMessageService; -import com.bamdoliro.maru.presentation.message.dto.request.SendMessageRequest; +import com.bamdoliro.maru.presentation.message.dto.request.SendMessageByStatusRequest; +import com.bamdoliro.maru.presentation.message.dto.request.SendMessageByTypeRequest; import com.bamdoliro.maru.shared.auth.AuthenticationPrincipal; import com.bamdoliro.maru.shared.auth.Authority; import jakarta.validation.Valid; @@ -22,7 +22,16 @@ public class MessageController { @PostMapping("/status") public void sendMessageByStatus( @AuthenticationPrincipal(authority = Authority.ADMIN) User user, - @RequestBody @Valid SendMessageRequest request + @RequestBody @Valid SendMessageByStatusRequest request + ) { + sendMessageUseCase.execute(request); + } + + @ResponseStatus(HttpStatus.NO_CONTENT) + @PostMapping("/type") + public void sendMessageByType( + @AuthenticationPrincipal(authority = Authority.ADMIN) User user, + @RequestBody @Valid SendMessageByTypeRequest request ) { sendMessageUseCase.execute(request); } diff --git a/src/main/java/com/bamdoliro/maru/presentation/message/dto/request/SendMessageRequest.java b/src/main/java/com/bamdoliro/maru/presentation/message/dto/request/SendMessageByStatusRequest.java similarity index 93% rename from src/main/java/com/bamdoliro/maru/presentation/message/dto/request/SendMessageRequest.java rename to src/main/java/com/bamdoliro/maru/presentation/message/dto/request/SendMessageByStatusRequest.java index 56a24113..9874ea0d 100644 --- a/src/main/java/com/bamdoliro/maru/presentation/message/dto/request/SendMessageRequest.java +++ b/src/main/java/com/bamdoliro/maru/presentation/message/dto/request/SendMessageByStatusRequest.java @@ -10,7 +10,7 @@ @Getter @NoArgsConstructor @AllArgsConstructor -public class SendMessageRequest { +public class SendMessageByStatusRequest { @NotBlank(message = "필수값입니다.") private String title; diff --git a/src/main/java/com/bamdoliro/maru/presentation/message/dto/request/SendMessageByTypeRequest.java b/src/main/java/com/bamdoliro/maru/presentation/message/dto/request/SendMessageByTypeRequest.java new file mode 100644 index 00000000..b33b7ba7 --- /dev/null +++ b/src/main/java/com/bamdoliro/maru/presentation/message/dto/request/SendMessageByTypeRequest.java @@ -0,0 +1,27 @@ +package com.bamdoliro.maru.presentation.message.dto.request; + +import com.bamdoliro.maru.domain.form.domain.type.FormType; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class SendMessageByTypeRequest { + + @NotBlank(message = "필수값입니다.") + private String title; + + @NotBlank(message = "필수값입니다.") + private String text; + + @NotNull(message = "필수값입니다.") + private FormType formType; + + @NotNull(message = "필수값입니다.") + private Boolean isChangeToRegular; +} + diff --git a/src/test/java/com/bamdoliro/maru/application/message/SendMessageUseCaseTest.java b/src/test/java/com/bamdoliro/maru/application/message/SendMessageUseCaseTest.java index c24154fe..8eba4f93 100644 --- a/src/test/java/com/bamdoliro/maru/application/message/SendMessageUseCaseTest.java +++ b/src/test/java/com/bamdoliro/maru/application/message/SendMessageUseCaseTest.java @@ -3,10 +3,12 @@ import com.bamdoliro.maru.domain.form.domain.Form; import com.bamdoliro.maru.domain.form.domain.type.FormStatus; import com.bamdoliro.maru.domain.form.domain.type.FormType; +import com.bamdoliro.maru.domain.form.service.CalculateFormScoreService; import com.bamdoliro.maru.infrastructure.message.SendMessageService; import com.bamdoliro.maru.infrastructure.message.exception.FailedToSendException; import com.bamdoliro.maru.infrastructure.persistence.form.FormRepository; -import com.bamdoliro.maru.presentation.message.dto.request.SendMessageRequest; +import com.bamdoliro.maru.presentation.message.dto.request.SendMessageByStatusRequest; +import com.bamdoliro.maru.presentation.message.dto.request.SendMessageByTypeRequest; import com.bamdoliro.maru.shared.fixture.FormFixture; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -33,14 +35,17 @@ public class SendMessageUseCaseTest { @Mock private FormRepository formRepository; + @Mock + private CalculateFormScoreService calculateFormScoreService; + @Test - void 원서를_최종제출한_학생들에게_메시지를_보낸다(){ + void 원서를_최종제출한_학생들에게_메시지를_보낸다() { //given Form form = FormFixture.createForm(FormType.REGULAR); form.submit("https://maru.bamdoliro.com/pdf/1"); given(formRepository.findByStatus(FormStatus.FINAL_SUBMITTED)).willReturn(List.of(form)); - SendMessageRequest request = new SendMessageRequest("부산소마고 공지사항", "테스트입니다", FormStatus.FINAL_SUBMITTED); + SendMessageByStatusRequest request = new SendMessageByStatusRequest("부산소마고 공지사항", "테스트입니다", FormStatus.FINAL_SUBMITTED); //when sendMessageUseCase.execute(request); @@ -51,13 +56,13 @@ public class SendMessageUseCaseTest { } @Test - void 원서를_승인받은_학생들에게_메시지를_보낸다(){ + void 원서를_승인받은_학생들에게_메시지를_보낸다() { //given Form form = FormFixture.createForm(FormType.REGULAR); form.approve(); given(formRepository.findByStatus(FormStatus.APPROVED)).willReturn(List.of(form)); - SendMessageRequest request = new SendMessageRequest("부산소마고 공지사항", "테스트입니다", FormStatus.APPROVED); + SendMessageByStatusRequest request = new SendMessageByStatusRequest("부산소마고 공지사항", "테스트입니다", FormStatus.APPROVED); //when sendMessageUseCase.execute(request); @@ -68,13 +73,13 @@ public class SendMessageUseCaseTest { } @Test - void 원서를_반려받은_학생들에게_메시지를_보낸다(){ + void 원서를_반려받은_학생들에게_메시지를_보낸다() { //given Form form = FormFixture.createForm(FormType.REGULAR); form.reject(); given(formRepository.findByStatus(FormStatus.REJECTED)).willReturn(List.of(form)); - SendMessageRequest request = new SendMessageRequest("부산소마고 공지사항", "학생들의 원서가 조건을 충족하지 못해 반려되었습니다.", FormStatus.REJECTED); + SendMessageByStatusRequest request = new SendMessageByStatusRequest("부산소마고 공지사항", "학생들의 원서가 조건을 충족하지 못해 반려되었습니다.", FormStatus.REJECTED); //when sendMessageUseCase.execute(request); @@ -85,13 +90,13 @@ public class SendMessageUseCaseTest { } @Test - void 원서를_접수한_학생들에게_메시지를_보낸다(){ + void 원서를_접수한_학생들에게_메시지를_보낸다() { //given Form form = FormFixture.createForm(FormType.REGULAR); form.receive(); given(formRepository.findByStatus(FormStatus.RECEIVED)).willReturn(List.of(form)); - SendMessageRequest request = new SendMessageRequest("부산소마고 공지사항", "제출하신 원서가 접수되었습니다.", FormStatus.RECEIVED); + SendMessageByStatusRequest request = new SendMessageByStatusRequest("부산소마고 공지사항", "제출하신 원서가 접수되었습니다.", FormStatus.RECEIVED); //when sendMessageUseCase.execute(request); @@ -102,13 +107,13 @@ public class SendMessageUseCaseTest { } @Test - void 제1차_합격자들에게_메시지를_보낸다(){ + void 제1차_합격자들에게_메시지를_보낸다() { //given Form form = FormFixture.createForm(FormType.REGULAR); form.firstPass(); given(formRepository.findByStatus(FormStatus.FIRST_PASSED)).willReturn(List.of(form)); - SendMessageRequest request = new SendMessageRequest("부산소마고 공지사항", "1차 전형에 합격하신것을 축하드립니다. 면접 장소를 확인하시고 꼭 제시간에 방문하시길 바라겠습니다,", FormStatus.FIRST_PASSED); + SendMessageByStatusRequest request = new SendMessageByStatusRequest("부산소마고 공지사항", "1차 전형에 합격하신것을 축하드립니다. 면접 장소를 확인하시고 꼭 제시간에 방문하시길 바라겠습니다,", FormStatus.FIRST_PASSED); //when sendMessageUseCase.execute(request); @@ -119,13 +124,13 @@ public class SendMessageUseCaseTest { } @Test - void 제1차_불합격자들에게_메시지를_보낸다(){ + void 제1차_불합격자들에게_메시지를_보낸다() { //given Form form = FormFixture.createForm(FormType.REGULAR); form.firstFail(); given(formRepository.findByStatus(FormStatus.FIRST_FAILED)).willReturn(List.of(form)); - SendMessageRequest request = new SendMessageRequest("부산소마고 공지사항", "1차 전형에 불합격하신것에 대해 유감입니당~", FormStatus.FIRST_FAILED); + SendMessageByStatusRequest request = new SendMessageByStatusRequest("부산소마고 공지사항", "1차 전형에 불합격하신것에 대해 유감입니당~", FormStatus.FIRST_FAILED); //when sendMessageUseCase.execute(request); @@ -136,13 +141,13 @@ public class SendMessageUseCaseTest { } @Test - void 제2차전형에_불참한_학생들에게_메시지를_보낸다(){ + void 제2차전형에_불참한_학생들에게_메시지를_보낸다() { //given Form form = FormFixture.createForm(FormType.REGULAR); form.noShow(); given(formRepository.findByStatus(FormStatus.NO_SHOW)).willReturn(List.of(form)); - SendMessageRequest request = new SendMessageRequest("부산소마고 공지사항", "해당 지원자들은 2차전형에 '불참'하였으므로 패널티가 있을 예정입니다.", FormStatus.NO_SHOW); + SendMessageByStatusRequest request = new SendMessageByStatusRequest("부산소마고 공지사항", "해당 지원자들은 2차전형에 '불참'하였으므로 패널티가 있을 예정입니다.", FormStatus.NO_SHOW); //when sendMessageUseCase.execute(request); @@ -153,13 +158,13 @@ public class SendMessageUseCaseTest { } @Test - void 최종합격자들에게_메시지를_보낸다(){ + void 최종합격자들에게_메시지를_보낸다() { //given Form form = FormFixture.createForm(FormType.REGULAR); form.pass(); given(formRepository.findByStatus(FormStatus.PASSED)).willReturn(List.of(form)); - SendMessageRequest request = new SendMessageRequest("부산소마고 공지사항", "합격하였습니다. 축하드립니다.", FormStatus.PASSED); + SendMessageByStatusRequest request = new SendMessageByStatusRequest("부산소마고 공지사항", "합격하였습니다. 축하드립니다.", FormStatus.PASSED); //when sendMessageUseCase.execute(request); @@ -170,13 +175,13 @@ public class SendMessageUseCaseTest { } @Test - void 최종불합격자들에게_메시지를_보낸다(){ + void 최종불합격자들에게_메시지를_보낸다() { //given Form form = FormFixture.createForm(FormType.REGULAR); form.fail(); given(formRepository.findByStatus(FormStatus.FAILED)).willReturn(List.of(form)); - SendMessageRequest request = new SendMessageRequest("부산소마고 공지사항", "불합격", FormStatus.FAILED); + SendMessageByStatusRequest request = new SendMessageByStatusRequest("부산소마고 공지사항", "불합격", FormStatus.FAILED); //when sendMessageUseCase.execute(request); @@ -187,11 +192,67 @@ public class SendMessageUseCaseTest { } @Test - void 보낼메시지대상이_존재하지_않으면_오류가_발생한다(){ + void 마이스터전형과_마이스터전형에서_일반전형으로_바뀐_합격자를_제외한_1차_전형_합격자들에게_메시지를_보낸다() { + + //given + Form form = FormFixture.createForm(FormType.REGULAR); + form.firstPass(); + given(formRepository.findNotExistsMeisterTalentFirstRoundForm()).willReturn(List.of(form)); + SendMessageByTypeRequest request = new SendMessageByTypeRequest("부산소마고 공지사항", "살려줘요..", FormType.REGULAR, false); + + //when + sendMessageUseCase.execute(request); + + //then + verify(formRepository, times(1)).findNotExistsMeisterTalentFirstRoundForm(); + verify(sendMessageService, times(1)).execute(List.of(form.getUser().getPhoneNumber()), request.getText(), request.getTitle()); + } + + @Test + void 마이스터전형_1차_합격자들에게_메시지를_보낸다() { + + //given + Form form = FormFixture.createForm(FormType.MEISTER_TALENT); + form.firstPass(); + given(formRepository.findMeisterTalentFirstRoundForm()).willReturn(List.of(form)); + SendMessageByTypeRequest request = new SendMessageByTypeRequest("부산소마고 공지사항", "배고파요...", FormType.MEISTER_TALENT, false); + + //when + sendMessageUseCase.execute(request); + + //then + verify(formRepository, times(1)).findMeisterTalentFirstRoundForm(); + verify(sendMessageService, times(1)).execute(List.of(form.getUser().getPhoneNumber()), request.getText(), request.getTitle()); + } + + @Test + void 마이스터전형에서_일반전형으로_바뀐_1차_합격자들에게_메시지를_보낸다() { + + //given + Form form = FormFixture.createForm(FormType.MEISTER_TALENT); + + when(calculateFormScoreService.calculateSubjectGradeScore(any())).thenReturn(100.0); + when(formRepository.findNotExistsMeisterTalentFirstRoundForm()).thenReturn(List.of(form)); + + form.firstPass(); + form.changeToRegular(calculateFormScoreService); + SendMessageByTypeRequest request = new SendMessageByTypeRequest("부산소마고 공지사항", "헤헤", FormType.REGULAR, true); + + //when + sendMessageUseCase.execute(request); + System.out.println(form.getUser().getPhoneNumber()); + + //then + verify(formRepository, times(1)).findNotExistsMeisterTalentFirstRoundForm(); + verify(sendMessageService, times(1)).execute(List.of(form.getUser().getPhoneNumber()), request.getText(), request.getTitle()); + } + + @Test + void 상태에_따라_메시지를_보낼_대상이_존재하지_않으면_오류가_발생한다() { //given willThrow(new FailedToSendException()).given(formRepository).findByStatus(FormStatus.SUBMITTED); - SendMessageRequest request = new SendMessageRequest("부산소마고 공지사항", "제출이 완료되었습니다.", FormStatus.SUBMITTED); + SendMessageByStatusRequest request = new SendMessageByStatusRequest("부산소마고 공지사항", "제출이 완료되었습니다.", FormStatus.SUBMITTED); //when and then Assertions.assertThrows(FailedToSendException.class, @@ -199,4 +260,18 @@ public class SendMessageUseCaseTest { verify(formRepository, times(1)).findByStatus(FormStatus.SUBMITTED); verify(sendMessageService, never()).execute(anyList(), anyString(), anyString()); } + + @Test + void 조회할_전형대상이_없으면_오류가_발생한다() { + + //given + willThrow(new FailedToSendException()).given(formRepository).findMeisterTalentFirstRoundForm(); + SendMessageByTypeRequest request = new SendMessageByTypeRequest("부산소마고 공지사항", "오늘은 꼭 롯데가..!", FormType.MEISTER_TALENT, false); + + //when and then + Assertions.assertThrows(FailedToSendException.class, + () -> sendMessageUseCase.execute(request)); + verify(formRepository, times(1)).findMeisterTalentFirstRoundForm(); + verify(sendMessageService, never()).execute(anyList(), anyString(), anyString()); + } } diff --git a/src/test/java/com/bamdoliro/maru/presentation/message/MessageControllerTest.java b/src/test/java/com/bamdoliro/maru/presentation/message/MessageControllerTest.java index 972970bc..103367f4 100644 --- a/src/test/java/com/bamdoliro/maru/presentation/message/MessageControllerTest.java +++ b/src/test/java/com/bamdoliro/maru/presentation/message/MessageControllerTest.java @@ -1,8 +1,10 @@ package com.bamdoliro.maru.presentation.message; import com.bamdoliro.maru.domain.form.domain.type.FormStatus; +import com.bamdoliro.maru.domain.form.domain.type.FormType; import com.bamdoliro.maru.domain.user.domain.User; -import com.bamdoliro.maru.presentation.message.dto.request.SendMessageRequest; +import com.bamdoliro.maru.presentation.message.dto.request.SendMessageByStatusRequest; +import com.bamdoliro.maru.presentation.message.dto.request.SendMessageByTypeRequest; import com.bamdoliro.maru.shared.fixture.AuthFixture; import com.bamdoliro.maru.shared.fixture.UserFixture; import com.bamdoliro.maru.shared.util.RestDocsTestSupport; @@ -29,7 +31,7 @@ public class MessageControllerTest extends RestDocsTestSupport { given(authenticationArgumentResolver.supportsParameter(any(MethodParameter.class))).willReturn(true); given(authenticationArgumentResolver.resolveArgument(any(), any(), any(), any())).willReturn(user); - SendMessageRequest request = new SendMessageRequest("부산소마고 공지사항", "테스트임니다...", FormStatus.FINAL_SUBMITTED); + SendMessageByStatusRequest request = new SendMessageByStatusRequest("부산소마고 공지사항", "테스트임니다...", FormStatus.FINAL_SUBMITTED); willDoNothing().given(sendMessageUseCase).execute(request); mockMvc.perform(post("/message/status") @@ -55,9 +57,9 @@ public class MessageControllerTest extends RestDocsTestSupport { given(authenticationArgumentResolver.supportsParameter(any(MethodParameter.class))).willReturn(true); given(authenticationArgumentResolver.resolveArgument(any(), any(), any(), any())).willReturn(user); - SendMessageRequest request = new SendMessageRequest("부산소마고 공지사항", "배고파요..", FormStatus.FINAL_SUBMITTED); + SendMessageByStatusRequest request = new SendMessageByStatusRequest("부산소마고 공지사항", "배고파요..", FormStatus.FINAL_SUBMITTED); - willThrow(new RuntimeException("원서를 찾을 수 없음")).given(sendMessageUseCase).execute(any(SendMessageRequest.class)); + willThrow(new RuntimeException("원서를 찾을 수 없음")).given(sendMessageUseCase).execute(any(SendMessageByStatusRequest.class)); mockMvc.perform(post("/message/status") .header(HttpHeaders.AUTHORIZATION, AuthFixture.createAuthHeader()) @@ -75,4 +77,95 @@ public class MessageControllerTest extends RestDocsTestSupport { ) )); } + + @Test + void 마이스터전형과_마이스터에서_일반전형으로_바뀐_합격자를_제외한_1차_합격자들에게_메시지를_보낸다() throws Exception { + User user = UserFixture.createAdminUser(); + given(authenticationArgumentResolver.supportsParameter(any(MethodParameter.class))).willReturn(true); + given(authenticationArgumentResolver.resolveArgument(any(), any(), any(), any())).willReturn(user); + + SendMessageByTypeRequest request = new SendMessageByTypeRequest("부산소마고 공지사항", "추카추카", FormType.REGULAR, false); + willDoNothing().given(sendMessageUseCase).execute(request); + + mockMvc.perform(post("/message/type") + .header(HttpHeaders.AUTHORIZATION, AuthFixture.createAuthHeader()) + .contentType(MediaType.APPLICATION_JSON) + .content(toJson(request))) + .andExpect(status().isNoContent()) + .andDo(restDocs.document( + requestHeaders( + headerWithName(HttpHeaders.AUTHORIZATION).description("Bearer token") + ), + requestFields( + fieldWithPath("title").type(JsonFieldType.STRING).description("문자 메시지 제목"), + fieldWithPath("text").type(JsonFieldType.STRING).description("문자 메시지 내용"), + fieldWithPath("formType").type(JsonFieldType.STRING).description("메시지를 보낼 원서 전형(MEISTER_TALENT, REGULAR)"), + fieldWithPath("isChangeToRegular").type(JsonFieldType.BOOLEAN).description("만약 마이스터 -> 일반 전형이면 true 아니면 false") + ) + )); + } + + @Test + void 마이스터_전형_1차_합격자들에게_메시지를_보낸다() throws Exception { + User user = UserFixture.createAdminUser(); + given(authenticationArgumentResolver.supportsParameter(any(MethodParameter.class))).willReturn(true); + given(authenticationArgumentResolver.resolveArgument(any(), any(), any(), any())).willReturn(user); + + SendMessageByTypeRequest request = new SendMessageByTypeRequest("부산소마고 공지사항", "추카추카", FormType.MEISTER_TALENT, false); + willDoNothing().given(sendMessageUseCase).execute(request); + + mockMvc.perform(post("/message/type") + .header(HttpHeaders.AUTHORIZATION, AuthFixture.createAuthHeader()) + .contentType(MediaType.APPLICATION_JSON) + .content(toJson(request))) + .andExpect(status().isNoContent()) + + .andDo(restDocs.document()); + } + + @Test + void 마이스터전형에서_일반전형으로_바뀐_1차_합격자들에게_메시지를_보낸다() throws Exception { + User user = UserFixture.createAdminUser(); + given(authenticationArgumentResolver.supportsParameter(any(MethodParameter.class))).willReturn(true); + given(authenticationArgumentResolver.resolveArgument(any(), any(), any(), any())).willReturn(user); + + SendMessageByTypeRequest request = new SendMessageByTypeRequest("부산소마고 공지사항", "추카추카", FormType.REGULAR, true); + willDoNothing().given(sendMessageUseCase).execute(request); + + mockMvc.perform(post("/message/type") + .header(HttpHeaders.AUTHORIZATION, AuthFixture.createAuthHeader()) + .contentType(MediaType.APPLICATION_JSON) + .content(toJson(request))) + .andExpect(status().isNoContent()) + + .andDo(restDocs.document()); + } + + @Test + void 해당전형의_원서가_없다면_오류가_발생한다() throws Exception { + User user = UserFixture.createAdminUser(); + given(authenticationArgumentResolver.supportsParameter(any(MethodParameter.class))).willReturn(true); + given(authenticationArgumentResolver.resolveArgument(any(), any(), any(), any())).willReturn(user); + + SendMessageByTypeRequest request = new SendMessageByTypeRequest("부산소마고 공지사항", "오류가 발생하겠죠?", FormType.REGULAR, false); + + willThrow(new RuntimeException("원서를 찾을 수 없음")).given(sendMessageUseCase).execute(any(SendMessageByTypeRequest.class)); + + mockMvc.perform(post("/message/type") + .header(HttpHeaders.AUTHORIZATION, AuthFixture.createAuthHeader()) + .contentType(MediaType.APPLICATION_JSON) + .content(toJson(request))) + .andExpect(status().isInternalServerError()) + .andDo(restDocs.document( + requestHeaders( + headerWithName(HttpHeaders.AUTHORIZATION).description("Bearer token") + ), + requestFields( + fieldWithPath("title").type(JsonFieldType.STRING).description("문자 메시지 제목"), + fieldWithPath("text").type(JsonFieldType.STRING).description("문자 메시지 내용"), + fieldWithPath("formType").type(JsonFieldType.STRING).description("메시지를 보낼 원서 전형(MEISTER_TALENT, REGULAR)"), + fieldWithPath("isChangeToRegular").type(JsonFieldType.BOOLEAN).description("만약 마이스터 -> 일반 전형이면 true 아니면 false") + ) + )); + } }