From 8de6562c17d5512627e89171de7c727bea5f255f Mon Sep 17 00:00:00 2001 From: Donggyu Date: Tue, 26 Jul 2022 11:00:31 +0900 Subject: [PATCH 01/28] =?UTF-8?q?refactor:=20=EB=84=A4=EC=9D=B4=EB=B0=8D?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...Service.java => CreatingStudyService.java} | 10 +++---- ...Request.java => CreatingStudyRequest.java} | 2 +- .../acceptance/AcceptanceTest.java | 4 +-- .../review/GettingReviewsAcceptanceTest.java | 4 +-- .../GettingStudiesSummaryAcceptanceTest.java | 15 +++++----- .../study/controller/StudyControllerTest.java | 28 +++++++++---------- 6 files changed, 31 insertions(+), 32 deletions(-) rename backend/src/main/java/com/woowacourse/moamoa/study/service/{CreateStudyService.java => CreatingStudyService.java} (81%) rename backend/src/main/java/com/woowacourse/moamoa/study/service/request/{CreateStudyRequest.java => CreatingStudyRequest.java} (98%) diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/service/CreateStudyService.java b/backend/src/main/java/com/woowacourse/moamoa/study/service/CreatingStudyService.java similarity index 81% rename from backend/src/main/java/com/woowacourse/moamoa/study/service/CreateStudyService.java rename to backend/src/main/java/com/woowacourse/moamoa/study/service/CreatingStudyService.java index b76228e01..5316f1047 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/study/service/CreateStudyService.java +++ b/backend/src/main/java/com/woowacourse/moamoa/study/service/CreatingStudyService.java @@ -3,7 +3,7 @@ import com.woowacourse.moamoa.common.exception.UnauthorizedException; import com.woowacourse.moamoa.member.domain.Member; import com.woowacourse.moamoa.member.domain.repository.MemberRepository; -import com.woowacourse.moamoa.study.service.request.CreateStudyRequest; +import com.woowacourse.moamoa.study.service.request.CreatingStudyRequest; import com.woowacourse.moamoa.study.domain.AttachedTags; import com.woowacourse.moamoa.study.domain.Details; import com.woowacourse.moamoa.study.domain.Participants; @@ -15,18 +15,18 @@ @Service @Transactional -public class CreateStudyService { +public class CreatingStudyService { private final MemberRepository memberRepository; private final StudyRepository studyRepository; - public CreateStudyService(final MemberRepository memberRepository, - final StudyRepository studyRepository) { + public CreatingStudyService(final MemberRepository memberRepository, + final StudyRepository studyRepository) { this.memberRepository = memberRepository; this.studyRepository = studyRepository; } - public Study createStudy(final Long githubId, final CreateStudyRequest request) { + public Study createStudy(final Long githubId, final CreatingStudyRequest request) { final Member owner = memberRepository.findByGithubId(githubId) .orElseThrow(() -> new UnauthorizedException(String.format("%d의 githubId를 가진 사용자는 없습니다.", githubId))); diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/service/request/CreateStudyRequest.java b/backend/src/main/java/com/woowacourse/moamoa/study/service/request/CreatingStudyRequest.java similarity index 98% rename from backend/src/main/java/com/woowacourse/moamoa/study/service/request/CreateStudyRequest.java rename to backend/src/main/java/com/woowacourse/moamoa/study/service/request/CreatingStudyRequest.java index 537c3e3cf..66b507ef4 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/study/service/request/CreateStudyRequest.java +++ b/backend/src/main/java/com/woowacourse/moamoa/study/service/request/CreatingStudyRequest.java @@ -21,7 +21,7 @@ @NoArgsConstructor @Getter @Builder -public class CreateStudyRequest { +public class CreatingStudyRequest { @NotBlank private String title; diff --git a/backend/src/test/java/com/woowacourse/acceptance/AcceptanceTest.java b/backend/src/test/java/com/woowacourse/acceptance/AcceptanceTest.java index 0f61dfbc6..cd1e26a71 100644 --- a/backend/src/test/java/com/woowacourse/acceptance/AcceptanceTest.java +++ b/backend/src/test/java/com/woowacourse/acceptance/AcceptanceTest.java @@ -11,7 +11,7 @@ import com.woowacourse.moamoa.MoamoaApplication; import com.woowacourse.moamoa.auth.service.oauthclient.response.GithubProfileResponse; import com.woowacourse.moamoa.auth.service.request.AccessTokenRequest; -import com.woowacourse.moamoa.study.service.request.CreateStudyRequest; +import com.woowacourse.moamoa.study.service.request.CreatingStudyRequest; import io.restassured.RestAssured; import java.util.Map; import org.junit.jupiter.api.AfterEach; @@ -93,7 +93,7 @@ protected String getBearerTokenBySignInOrUp(GithubProfileResponse response) { return "bearer " + token; } - protected long createStudy(String jwtToken, CreateStudyRequest request) { + protected long createStudy(String jwtToken, CreatingStudyRequest request) { try { final String location = RestAssured.given().log().all() .header(HttpHeaders.AUTHORIZATION, jwtToken) diff --git a/backend/src/test/java/com/woowacourse/acceptance/review/GettingReviewsAcceptanceTest.java b/backend/src/test/java/com/woowacourse/acceptance/review/GettingReviewsAcceptanceTest.java index 5a620b819..e962f6209 100644 --- a/backend/src/test/java/com/woowacourse/acceptance/review/GettingReviewsAcceptanceTest.java +++ b/backend/src/test/java/com/woowacourse/acceptance/review/GettingReviewsAcceptanceTest.java @@ -7,7 +7,7 @@ import com.woowacourse.acceptance.AcceptanceTest; import com.woowacourse.moamoa.auth.service.oauthclient.response.GithubProfileResponse; -import com.woowacourse.moamoa.study.service.request.CreateStudyRequest; +import com.woowacourse.moamoa.study.service.request.CreatingStudyRequest; import io.restassured.RestAssured; import java.time.LocalDate; import org.junit.jupiter.api.BeforeEach; @@ -29,7 +29,7 @@ void initDataBase() { getBearerTokenBySignInOrUp(new GithubProfileResponse(3L, "dwoo", "https://image", "github.com")); getBearerTokenBySignInOrUp(new GithubProfileResponse(4L, "verus", "https://image", "github.com")); - final CreateStudyRequest request = CreateStudyRequest.builder() + final CreatingStudyRequest request = CreatingStudyRequest.builder() .title("Java 스터디").excerpt("자바 설명").thumbnail("java thumbnail") .description("짱구의 우당탕탕 자바 스터디입니다.").startDate(LocalDate.now().plusDays(1)) .build(); diff --git a/backend/src/test/java/com/woowacourse/acceptance/study/GettingStudiesSummaryAcceptanceTest.java b/backend/src/test/java/com/woowacourse/acceptance/study/GettingStudiesSummaryAcceptanceTest.java index f879515b0..6c6f3a5c8 100644 --- a/backend/src/test/java/com/woowacourse/acceptance/study/GettingStudiesSummaryAcceptanceTest.java +++ b/backend/src/test/java/com/woowacourse/acceptance/study/GettingStudiesSummaryAcceptanceTest.java @@ -5,11 +5,10 @@ import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.not; -import static org.hamcrest.Matchers.notNullValue; import com.woowacourse.acceptance.AcceptanceTest; import com.woowacourse.moamoa.auth.service.oauthclient.response.GithubProfileResponse; -import com.woowacourse.moamoa.study.service.request.CreateStudyRequest; +import com.woowacourse.moamoa.study.service.request.CreatingStudyRequest; import io.restassured.RestAssured; import io.restassured.response.ValidatableResponse; import java.time.LocalDate; @@ -34,37 +33,37 @@ public class GettingStudiesSummaryAcceptanceTest extends AcceptanceTest { void initDataBase() { String token = getBearerTokenBySignInOrUp(new GithubProfileResponse(1L, "jjanggu", "https://image", "github.com")); - CreateStudyRequest javaRequest = CreateStudyRequest.builder() + CreatingStudyRequest javaRequest = CreatingStudyRequest.builder() .title("Java 스터디").excerpt("자바 설명").thumbnail("java thumbnail") .description("그린론의 우당탕탕 자바 스터디입니다.").startDate(LocalDate.now().plusDays(1)) .build(); javaStudyId = (int) createStudy(token, javaRequest); - CreateStudyRequest reactRequest = CreateStudyRequest.builder() + CreatingStudyRequest reactRequest = CreatingStudyRequest.builder() .title("React 스터디").excerpt("리액트 설명").thumbnail("react thumbnail") .description("디우의 뤼액트 스터디입니다.").startDate(LocalDate.now().plusDays(2)) .build(); reactStudyId = (int) createStudy(token, reactRequest); - CreateStudyRequest javascriptRequest = CreateStudyRequest.builder() + CreatingStudyRequest javascriptRequest = CreatingStudyRequest.builder() .title("javaScript 스터디").excerpt("자바스크립트 설명").thumbnail("javascript thumbnail") .description("그린론의 자바스크립트 접해보기").startDate(LocalDate.now().plusDays(3)) .build(); javascriptStudyId = (int) createStudy(token, javascriptRequest); - CreateStudyRequest httpRequest = CreateStudyRequest.builder() + CreatingStudyRequest httpRequest = CreatingStudyRequest.builder() .title("HTTP 스터디").excerpt("HTTP 설명").thumbnail("http thumbnail") .description("디우의 HTTP 정복하기").startDate(LocalDate.now().plusDays(3)) .build(); httpStudyId = (int) createStudy(token, httpRequest); - CreateStudyRequest algorithmRequest = CreateStudyRequest.builder() + CreatingStudyRequest algorithmRequest = CreatingStudyRequest.builder() .title("알고리즘 스터디").excerpt("알고리즘 설명").thumbnail("algorithm thumbnail") .description("알고리즘을 TDD로 풀자의 베루스입니다.").startDate(LocalDate.now().plusDays(2)) .build(); algorithmStudyId = (int) createStudy(token, algorithmRequest); - CreateStudyRequest linuxRequest = CreateStudyRequest.builder() + CreatingStudyRequest linuxRequest = CreatingStudyRequest.builder() .title("Linux 스터디").excerpt("리눅스 설명").thumbnail("linux thumbnail") .description("Linux를 공부하자의 베루스입니다.").startDate(LocalDate.now().plusDays(2)) .build(); diff --git a/backend/src/test/java/com/woowacourse/moamoa/study/controller/StudyControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/study/controller/StudyControllerTest.java index 10f3992c1..dc10e4059 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/study/controller/StudyControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/study/controller/StudyControllerTest.java @@ -7,14 +7,14 @@ import com.woowacourse.moamoa.common.exception.UnauthorizedException; import com.woowacourse.moamoa.member.domain.Member; import com.woowacourse.moamoa.member.domain.repository.MemberRepository; -import com.woowacourse.moamoa.study.service.request.CreateStudyRequest; +import com.woowacourse.moamoa.study.service.request.CreatingStudyRequest; import com.woowacourse.moamoa.study.domain.Details; import com.woowacourse.moamoa.study.domain.Participants; import com.woowacourse.moamoa.study.domain.Period; import com.woowacourse.moamoa.study.domain.Study; import com.woowacourse.moamoa.study.domain.exception.InvalidPeriodException; import com.woowacourse.moamoa.study.domain.repository.StudyRepository; -import com.woowacourse.moamoa.study.service.CreateStudyService; +import com.woowacourse.moamoa.study.service.CreatingStudyService; import java.time.LocalDate; import java.util.List; import java.util.Optional; @@ -43,8 +43,8 @@ void initDataBase() { @Test void openStudy() { // given - StudyController sut = new StudyController(new CreateStudyService(memberRepository, studyRepository)); - final CreateStudyRequest createStudyRequest = CreateStudyRequest.builder() + StudyController sut = new StudyController(new CreatingStudyService(memberRepository, studyRepository)); + final CreatingStudyRequest creatingStudyRequest = CreatingStudyRequest.builder() .title("Java") .excerpt("java excerpt") .thumbnail("java image") @@ -57,7 +57,7 @@ void openStudy() { .build(); // when - final ResponseEntity response = sut.createStudy(1L, createStudyRequest); + final ResponseEntity response = sut.createStudy(1L, creatingStudyRequest); // then final String id = response.getHeaders().getLocation().getPath().replace("/api/studies/", ""); @@ -70,17 +70,17 @@ void openStudy() { memberRepository.findByGithubId(1L).get().getId())); assertThat(study.get().getCreatedAt()).isNotNull(); assertThat(study.get().getPeriod()).isEqualTo( - new Period(LocalDate.parse(createStudyRequest.getEnrollmentEndDate()), - createStudyRequest.getStartDate(), LocalDate.parse(createStudyRequest.getEndDate()))); + new Period(LocalDate.parse(creatingStudyRequest.getEnrollmentEndDate()), + creatingStudyRequest.getStartDate(), LocalDate.parse(creatingStudyRequest.getEndDate()))); assertThat(study.get().getAttachedTags().getValue()) - .extracting("tagId").containsAnyElementsOf(createStudyRequest.getTagIds()); + .extracting("tagId").containsAnyElementsOf(creatingStudyRequest.getTagIds()); } @DisplayName("유효하지 않은 스터디 기간으로 생성 시 예외 발생") @Test void createStudyByInvalidPeriod() { - StudyController sut = new StudyController(new CreateStudyService(memberRepository, studyRepository)); - final CreateStudyRequest createStudyRequest = CreateStudyRequest.builder() + StudyController sut = new StudyController(new CreatingStudyService(memberRepository, studyRepository)); + final CreatingStudyRequest creatingStudyRequest = CreatingStudyRequest.builder() .title("Java") .excerpt("java excerpt") .thumbnail("java image") @@ -93,15 +93,15 @@ void createStudyByInvalidPeriod() { .build(); // when - assertThatThrownBy(() -> sut.createStudy(1L, createStudyRequest)) + assertThatThrownBy(() -> sut.createStudy(1L, creatingStudyRequest)) .isInstanceOf(InvalidPeriodException.class); } @DisplayName("존재하지 않은 사용자로 생성 시 예외 발생") @Test void createStudyByNotFoundUser() { - StudyController sut = new StudyController(new CreateStudyService(memberRepository, studyRepository)); - final CreateStudyRequest createStudyRequest = CreateStudyRequest.builder() + StudyController sut = new StudyController(new CreatingStudyService(memberRepository, studyRepository)); + final CreatingStudyRequest creatingStudyRequest = CreatingStudyRequest.builder() .title("Java") .excerpt("java excerpt") .thumbnail("java image") @@ -114,7 +114,7 @@ void createStudyByNotFoundUser() { .build(); // when - assertThatThrownBy(() -> sut.createStudy(100L, createStudyRequest)) // 존재하지 않는 사용자로 추가 시 예외 발생 + assertThatThrownBy(() -> sut.createStudy(100L, creatingStudyRequest)) // 존재하지 않는 사용자로 추가 시 예외 발생 .isInstanceOf(UnauthorizedException.class); } } From 40a88b4b5b60747e03ee4decbf5a0968f682a387 Mon Sep 17 00:00:00 2001 From: Donggyu Date: Tue, 26 Jul 2022 13:37:40 +0900 Subject: [PATCH 02/28] =?UTF-8?q?feat:=20StudyService=20=EA=B5=AC=ED=98=84?= =?UTF-8?q?=20=EB=B0=8F=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 --- .../study/controller/StudyController.java | 26 +++++++++----- .../moamoa/study/domain/Participants.java | 19 +++++++--- .../moamoa/study/domain/Period.java | 30 +++++++++++++--- .../moamoa/study/domain/Study.java | 9 +++-- ...ingStudyService.java => StudyService.java} | 35 +++++++++++++------ .../InvalidParticipationStudyException.java | 8 +++++ .../study/controller/StudyControllerTest.java | 8 ++--- 7 files changed, 102 insertions(+), 33 deletions(-) rename backend/src/main/java/com/woowacourse/moamoa/study/service/{CreatingStudyService.java => StudyService.java} (65%) create mode 100644 backend/src/main/java/com/woowacourse/moamoa/study/service/exception/InvalidParticipationStudyException.java diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/controller/StudyController.java b/backend/src/main/java/com/woowacourse/moamoa/study/controller/StudyController.java index f2c993e4a..92506ae52 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/study/controller/StudyController.java +++ b/backend/src/main/java/com/woowacourse/moamoa/study/controller/StudyController.java @@ -1,31 +1,41 @@ package com.woowacourse.moamoa.study.controller; import com.woowacourse.moamoa.auth.config.AuthenticationPrincipal; -import com.woowacourse.moamoa.study.service.request.CreateStudyRequest; import com.woowacourse.moamoa.study.domain.Study; -import com.woowacourse.moamoa.study.service.CreateStudyService; +import com.woowacourse.moamoa.study.service.StudyService; +import com.woowacourse.moamoa.study.service.request.CreatingStudyRequest; import java.net.URI; import javax.validation.Valid; -import lombok.Getter; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequiredArgsConstructor -@Getter +@RequestMapping("/api/studies") public class StudyController { - private final CreateStudyService createStudyService; + private final StudyService studyService; - @PostMapping("/api/studies") + @PostMapping public ResponseEntity createStudy( @AuthenticationPrincipal final Long githubId, - @Valid @RequestBody(required = false) final CreateStudyRequest createStudyRequest + @Valid @RequestBody(required = false) final CreatingStudyRequest creatingStudyRequest ) { - final Study study = createStudyService.createStudy(githubId, createStudyRequest); + final Study study = studyService.createStudy(githubId, creatingStudyRequest); return ResponseEntity.created(URI.create("/api/studies/" + study.getId())).build(); } + + @PostMapping("/{study-id}") + public ResponseEntity participateStudy(@AuthenticationPrincipal final Long githubId, + @PathVariable("study-id") final Long studyId + ) { + + + return ResponseEntity.ok().build(); + } } diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Participants.java b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Participants.java index 2bc45ad90..140c0063e 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Participants.java +++ b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Participants.java @@ -1,5 +1,8 @@ package com.woowacourse.moamoa.study.domain; +import static lombok.AccessLevel.PROTECTED; + +import com.woowacourse.moamoa.study.service.exception.InvalidParticipationStudyException; import java.util.ArrayList; import java.util.List; import java.util.Objects; @@ -7,12 +10,13 @@ import javax.persistence.Column; import javax.persistence.ElementCollection; import javax.persistence.Embeddable; -import javax.persistence.FetchType; import javax.persistence.JoinColumn; +import lombok.NoArgsConstructor; import lombok.ToString; @Embeddable @ToString +@NoArgsConstructor(access = PROTECTED) public class Participants { @Column(name = "current_member_count") @@ -28,9 +32,6 @@ public class Participants { @CollectionTable(name = "study_member", joinColumns = @JoinColumn(name = "study_id")) private List participants = new ArrayList<>(); - protected Participants() { - } - public Participants(final Integer size, final Integer max, final List participants, Long ownerId) { this.size = size; @@ -43,6 +44,16 @@ public List getParticipants() { return new ArrayList<>(participants); } + public void checkStudyParticipating(Long memberId) { + if (max == null || max <= size) { + throw new InvalidParticipationStudyException(); + } + + if (Objects.equals(memberId, ownerId) || participants.contains(memberId)) { + throw new InvalidParticipationStudyException(); + } + } + public static Participants createByMaxSizeAndOwnerId(final Integer maxSize, Long id) { return new Participants(1, maxSize, new ArrayList<>(), id); } diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Period.java b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Period.java index 34b5620d6..2f3f1e933 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Period.java +++ b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Period.java @@ -1,13 +1,16 @@ package com.woowacourse.moamoa.study.domain; import com.woowacourse.moamoa.study.domain.exception.InvalidPeriodException; +import com.woowacourse.moamoa.study.service.exception.InvalidParticipationStudyException; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.Objects; import javax.persistence.Column; import javax.persistence.Embeddable; +import lombok.Getter; @Embeddable +@Getter public class Period { private LocalDate enrollmentEndDate; @@ -21,16 +24,21 @@ public Period() { } public Period(final LocalDate enrollmentEndDate, final LocalDate startDate, final LocalDate endDate) { - if ((endDate != null && startDate.isAfter(endDate)) || (enrollmentEndDate != null && endDate != null && enrollmentEndDate.isAfter(endDate))) { - throw new InvalidPeriodException(); - } + validatePeriod(enrollmentEndDate, startDate, endDate); this.enrollmentEndDate = enrollmentEndDate; this.startDate = startDate; this.endDate = endDate; } public boolean isBefore(final LocalDateTime createAt) { - return startDate.isBefore(createAt.toLocalDate()) || (enrollmentEndDate != null && enrollmentEndDate.isBefore(createAt.toLocalDate())); + return startDate.isBefore(createAt.toLocalDate()) || (enrollmentEndDate != null && enrollmentEndDate.isBefore( + createAt.toLocalDate())); + } + + public void checkParticipatingPeriod() { + if (enrollmentEndDate.isAfter(LocalDate.now())) { + throw new InvalidParticipationStudyException(); + } } @Override @@ -50,4 +58,18 @@ public boolean equals(final Object o) { public int hashCode() { return Objects.hash(enrollmentEndDate, startDate, endDate); } + + private void validatePeriod(final LocalDate enrollmentEndDate, final LocalDate startDate, final LocalDate endDate) { + if (isImproperStudyDate(startDate, endDate) || isImproperEnrollmentEndDate(enrollmentEndDate, endDate)) { + throw new InvalidPeriodException(); + } + } + + private boolean isImproperStudyDate(final LocalDate startDate, final LocalDate endDate) { + return endDate != null && startDate.isAfter(endDate); + } + + private boolean isImproperEnrollmentEndDate(final LocalDate enrollmentEndDate, final LocalDate endDate) { + return enrollmentEndDate != null && endDate != null && enrollmentEndDate.isAfter(endDate); + } } diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Study.java b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Study.java index 44e7cf4dc..179fa4bec 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Study.java +++ b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Study.java @@ -46,14 +46,19 @@ public Study(final Details details, final Participants participants, public Study(final Long id, final Details details, final Participants participants, final Period period, final AttachedTags attachedTags) { - validatePeriod(period); - this.id = id; this.details = details; this.participants = participants; this.period = period; this.createdAt = LocalDateTime.now(); this.attachedTags = attachedTags; + + validatePeriod(period); + } + + public void checkStudyParticipating(Long memberId) { + period.checkParticipatingPeriod(); + participants.checkStudyParticipating(memberId); } private void validatePeriod(final Period period) { diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/service/CreatingStudyService.java b/backend/src/main/java/com/woowacourse/moamoa/study/service/StudyService.java similarity index 65% rename from backend/src/main/java/com/woowacourse/moamoa/study/service/CreatingStudyService.java rename to backend/src/main/java/com/woowacourse/moamoa/study/service/StudyService.java index 5316f1047..888a61f74 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/study/service/CreatingStudyService.java +++ b/backend/src/main/java/com/woowacourse/moamoa/study/service/StudyService.java @@ -3,32 +3,28 @@ import com.woowacourse.moamoa.common.exception.UnauthorizedException; import com.woowacourse.moamoa.member.domain.Member; import com.woowacourse.moamoa.member.domain.repository.MemberRepository; -import com.woowacourse.moamoa.study.service.request.CreatingStudyRequest; import com.woowacourse.moamoa.study.domain.AttachedTags; import com.woowacourse.moamoa.study.domain.Details; import com.woowacourse.moamoa.study.domain.Participants; import com.woowacourse.moamoa.study.domain.Period; import com.woowacourse.moamoa.study.domain.Study; import com.woowacourse.moamoa.study.domain.repository.StudyRepository; +import com.woowacourse.moamoa.study.service.exception.StudyNotFoundException; +import com.woowacourse.moamoa.study.service.request.CreatingStudyRequest; +import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service -@Transactional -public class CreatingStudyService { +@Transactional(readOnly = true) +@RequiredArgsConstructor +public class StudyService { private final MemberRepository memberRepository; private final StudyRepository studyRepository; - public CreatingStudyService(final MemberRepository memberRepository, - final StudyRepository studyRepository) { - this.memberRepository = memberRepository; - this.studyRepository = studyRepository; - } - public Study createStudy(final Long githubId, final CreatingStudyRequest request) { - final Member owner = memberRepository.findByGithubId(githubId) - .orElseThrow(() -> new UnauthorizedException(String.format("%d의 githubId를 가진 사용자는 없습니다.", githubId))); + final Member owner = findMemberBy(githubId); final Participants participants = request.mapToParticipants(owner.getId()); final Details details = request.mapToDetails(); @@ -38,4 +34,21 @@ public Study createStudy(final Long githubId, final CreatingStudyRequest request return studyRepository.save(new Study(details, participants, period, attachedTags)); } + @Transactional + public void participantStudy(final Long githubId, final Long studyId) { + final Member member = findMemberBy(githubId); + final Study study = findStudyBy(studyId); + + study.checkStudyParticipating(member.getId()); + } + + private Study findStudyBy(final Long studyId) { + return studyRepository.findById(studyId) + .orElseThrow(StudyNotFoundException::new); + } + + private Member findMemberBy(final Long githubId) { + return memberRepository.findByGithubId(githubId) + .orElseThrow(() -> new UnauthorizedException(String.format("%d의 githubId를 가진 사용자는 없습니다.", githubId))); + } } diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/service/exception/InvalidParticipationStudyException.java b/backend/src/main/java/com/woowacourse/moamoa/study/service/exception/InvalidParticipationStudyException.java new file mode 100644 index 000000000..0bb32bf2a --- /dev/null +++ b/backend/src/main/java/com/woowacourse/moamoa/study/service/exception/InvalidParticipationStudyException.java @@ -0,0 +1,8 @@ +package com.woowacourse.moamoa.study.service.exception; + +public class InvalidParticipationStudyException extends RuntimeException { + + public InvalidParticipationStudyException() { + super("스터디 가입이 불가능합니다."); + } +} diff --git a/backend/src/test/java/com/woowacourse/moamoa/study/controller/StudyControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/study/controller/StudyControllerTest.java index dc10e4059..2add49e7c 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/study/controller/StudyControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/study/controller/StudyControllerTest.java @@ -14,7 +14,7 @@ import com.woowacourse.moamoa.study.domain.Study; import com.woowacourse.moamoa.study.domain.exception.InvalidPeriodException; import com.woowacourse.moamoa.study.domain.repository.StudyRepository; -import com.woowacourse.moamoa.study.service.CreatingStudyService; +import com.woowacourse.moamoa.study.service.StudyService; import java.time.LocalDate; import java.util.List; import java.util.Optional; @@ -43,7 +43,7 @@ void initDataBase() { @Test void openStudy() { // given - StudyController sut = new StudyController(new CreatingStudyService(memberRepository, studyRepository)); + StudyController sut = new StudyController(new StudyService(memberRepository, studyRepository)); final CreatingStudyRequest creatingStudyRequest = CreatingStudyRequest.builder() .title("Java") .excerpt("java excerpt") @@ -79,7 +79,7 @@ void openStudy() { @DisplayName("유효하지 않은 스터디 기간으로 생성 시 예외 발생") @Test void createStudyByInvalidPeriod() { - StudyController sut = new StudyController(new CreatingStudyService(memberRepository, studyRepository)); + StudyController sut = new StudyController(new StudyService(memberRepository, studyRepository)); final CreatingStudyRequest creatingStudyRequest = CreatingStudyRequest.builder() .title("Java") .excerpt("java excerpt") @@ -100,7 +100,7 @@ void createStudyByInvalidPeriod() { @DisplayName("존재하지 않은 사용자로 생성 시 예외 발생") @Test void createStudyByNotFoundUser() { - StudyController sut = new StudyController(new CreatingStudyService(memberRepository, studyRepository)); + StudyController sut = new StudyController(new StudyService(memberRepository, studyRepository)); final CreatingStudyRequest creatingStudyRequest = CreatingStudyRequest.builder() .title("Java") .excerpt("java excerpt") From b0dc328de0af34b309e1ebc0744fb495c8795461 Mon Sep 17 00:00:00 2001 From: Donggyu Date: Tue, 26 Jul 2022 14:44:33 +0900 Subject: [PATCH 03/28] =?UTF-8?q?feat:=20Participants=20=EA=B2=80=EC=A6=9D?= =?UTF-8?q?=20=EB=A1=9C=EC=A7=81=20=EB=B0=8F=20=EC=B0=B8=EC=97=AC=EC=9E=90?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../moamoa/study/domain/Participants.java | 25 +++++--- .../moamoa/study/domain/ParticipantsTest.java | 60 +++++++++++++++++++ 2 files changed, 77 insertions(+), 8 deletions(-) create mode 100644 backend/src/test/java/com/woowacourse/moamoa/study/domain/ParticipantsTest.java diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Participants.java b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Participants.java index 140c0063e..bc1a139f1 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Participants.java +++ b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Participants.java @@ -44,18 +44,27 @@ public List getParticipants() { return new ArrayList<>(participants); } - public void checkStudyParticipating(Long memberId) { - if (max == null || max <= size) { - throw new InvalidParticipationStudyException(); - } + public static Participants createByMaxSizeAndOwnerId(final Integer maxSize, Long id) { + return new Participants(1, maxSize, new ArrayList<>(), id); + } - if (Objects.equals(memberId, ownerId) || participants.contains(memberId)) { + protected void participate(final Participant participant) { + participants.add(participant); + this.size = this.size + 1; + } + + protected void checkParticipating(Long memberId) { + if (isInvalidMemberSize() || isAlreadyParticipation(memberId)) { throw new InvalidParticipationStudyException(); } } - public static Participants createByMaxSizeAndOwnerId(final Integer maxSize, Long id) { - return new Participants(1, maxSize, new ArrayList<>(), id); + private boolean isInvalidMemberSize() { + return max == null || max <= size; + } + + private boolean isAlreadyParticipation(final Long memberId) { + return Objects.equals(memberId, ownerId) || participants.contains(memberId); } @Override @@ -72,7 +81,7 @@ public boolean equals(final Object o) { } @Override - public int hashCode() { + public int hashCode() { return Objects.hash(size, max, ownerId, participants); } } diff --git a/backend/src/test/java/com/woowacourse/moamoa/study/domain/ParticipantsTest.java b/backend/src/test/java/com/woowacourse/moamoa/study/domain/ParticipantsTest.java new file mode 100644 index 000000000..c0d0d05fc --- /dev/null +++ b/backend/src/test/java/com/woowacourse/moamoa/study/domain/ParticipantsTest.java @@ -0,0 +1,60 @@ +package com.woowacourse.moamoa.study.domain; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; + +import java.util.ArrayList; +import java.util.List; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class ParticipantsTest { + + private static final List PARTICIPANTS = new ArrayList<>( + List.of(new Participant(2L), new Participant(3L), new Participant(4L)) + ); + + @DisplayName("스터디장은 이미 스터디에 참여한 것이므로 검사 시에 예외가 발생한다.") + @Test + public void checkParticipatingAboutOwner() { + final Participants participants = new Participants(3, 10, PARTICIPANTS, 1L); + + assertThatThrownBy(() -> participants.checkParticipating(1L)); + } + + @DisplayName("이미 참여한 회원은 참여 여부 검사 시에 예외가 발생한다.") + @Test + public void checkAlreadyParticipating() { + final Participants participants = new Participants(3, 10, PARTICIPANTS, 1L); + + assertThatThrownBy(() -> participants.checkParticipating(1L)); + } + + @DisplayName("스터디 회원 수가 꽉 차지 않은 경우 정상적으로 가입이 된다.") + @Test + public void checkStudyMemberCountLessThanMaxCount() { + final Participants participants = new Participants(3, 4, PARTICIPANTS, 1L); + + assertDoesNotThrow(() -> participants.checkParticipating(4L)); + } + + @DisplayName("스터디 회원 수가 꽉 찬 경우 예외가 발생한다.") + @Test + public void checkStudyMemberCount() { + final Participants participants = new Participants(3, 3, PARTICIPANTS, 1L); + + assertThatThrownBy(() -> participants.checkParticipating(4L)); + } + + @DisplayName("스터디 참여 이후에는 현재 스터디원 수가 증가한다.") + @Test + public void IncreaseCurrentMemberCount() { + final Participants participants = new Participants(3, 4, PARTICIPANTS, 1L); + + participants.participate(new Participant(4L)); + + assertThat(participants.getParticipants().size()).isEqualTo(4); + assertThatThrownBy(() -> participants.checkParticipating(5L)); + } +} From 0f79069e3a183170c7e487265192dda9db0d7bd4 Mon Sep 17 00:00:00 2001 From: Donggyu Date: Tue, 26 Jul 2022 16:00:23 +0900 Subject: [PATCH 04/28] =?UTF-8?q?feat:=20Details=20`CLOSE`=20=ED=99=95?= =?UTF-8?q?=EC=9D=B8=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../moamoa/study/domain/Details.java | 16 +++++++++++++--- .../moamoa/study/domain/DetailsTest.java | 19 +++++++++++++++++++ 2 files changed, 32 insertions(+), 3 deletions(-) create mode 100644 backend/src/test/java/com/woowacourse/moamoa/study/domain/DetailsTest.java diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Details.java b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Details.java index 5e0c047a1..dfbac8a03 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Details.java +++ b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Details.java @@ -1,12 +1,19 @@ package com.woowacourse.moamoa.study.domain; +import static lombok.AccessLevel.PROTECTED; + +import com.woowacourse.moamoa.study.service.exception.InvalidParticipationStudyException; import java.util.Objects; import javax.persistence.Column; import javax.persistence.Embeddable; +import lombok.NoArgsConstructor; @Embeddable +@NoArgsConstructor(access = PROTECTED) public class Details { + private static final String CLOSE = "CLOSE"; + @Column(nullable = false) private String title; @@ -22,9 +29,6 @@ public class Details { @Column(nullable = false) private String description; - protected Details() { - } - public Details(final String title, final String excerpt, final String thumbnail, final String status, final String description) { this.title = title; @@ -34,6 +38,12 @@ public Details(final String title, final String excerpt, final String thumbnail, this.description = description; } + protected void checkStudyStatus() { + if (status.equals(CLOSE)) { + throw new InvalidParticipationStudyException(); + } + } + @Override public boolean equals(final Object o) { if (this == o) { diff --git a/backend/src/test/java/com/woowacourse/moamoa/study/domain/DetailsTest.java b/backend/src/test/java/com/woowacourse/moamoa/study/domain/DetailsTest.java new file mode 100644 index 000000000..7579412bd --- /dev/null +++ b/backend/src/test/java/com/woowacourse/moamoa/study/domain/DetailsTest.java @@ -0,0 +1,19 @@ +package com.woowacourse.moamoa.study.domain; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class DetailsTest { + + private static final String CLOSE = "CLOSE"; + + @DisplayName("Study의 상태가 CLOSE 이면 모집 기간이 아니므로 예외가 발생한다.") + @Test + public void checkStudyStatus() { + final Details details = new Details("title", "excerpt", "thumbnail", CLOSE, "description"); + + assertThatThrownBy(() -> details.checkStudyStatus()); + } +} From bbc410ad23fae8a87ae9cd40a62a9b44fd98a04d Mon Sep 17 00:00:00 2001 From: Donggyu Date: Tue, 26 Jul 2022 16:05:08 +0900 Subject: [PATCH 05/28] =?UTF-8?q?feat:=20Period=20=EB=AA=A8=EC=A7=91=20?= =?UTF-8?q?=EA=B8=B0=EA=B0=84=20=ED=99=95=EC=9D=B8=20=EB=A1=9C=EC=A7=81=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/woowacourse/moamoa/study/domain/Period.java | 4 ++-- .../woowacourse/moamoa/study/domain/PeriodTest.java | 13 +++++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Period.java b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Period.java index 2f3f1e933..ba405ca99 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Period.java +++ b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Period.java @@ -35,8 +35,8 @@ public boolean isBefore(final LocalDateTime createAt) { createAt.toLocalDate())); } - public void checkParticipatingPeriod() { - if (enrollmentEndDate.isAfter(LocalDate.now())) { + protected void checkParticipatingPeriod() { + if (!enrollmentEndDate.isAfter(LocalDate.now())) { throw new InvalidParticipationStudyException(); } } diff --git a/backend/src/test/java/com/woowacourse/moamoa/study/domain/PeriodTest.java b/backend/src/test/java/com/woowacourse/moamoa/study/domain/PeriodTest.java index 05f5a7186..4cdaa483e 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/study/domain/PeriodTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/study/domain/PeriodTest.java @@ -6,6 +6,7 @@ import com.woowacourse.moamoa.study.domain.exception.InvalidPeriodException; import java.time.LocalDate; import java.util.stream.Stream; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -47,4 +48,16 @@ private static Stream provideEnrollmentEndDateAndStartDate() { Arguments.of(LocalDate.of(2022, 7, 10), LocalDate.of(2022, 7, 11)) ); } + + @DisplayName("모집 상태의 기간인지를 확인한다.") + @Test + public void checkParticipatingPeriod() { + final LocalDate enrollmentEndDate = LocalDate.now().plusDays(1); + final LocalDate startDate = LocalDate.now().plusDays(1); + final LocalDate endDate = LocalDate.now().plusDays(1); + + final Period period = new Period(enrollmentEndDate, startDate, endDate); + + Assertions.assertDoesNotThrow(period::checkParticipatingPeriod); + } } From 9f0a622ad082b8f34ad7ccbb16882fb2a654f9ac Mon Sep 17 00:00:00 2001 From: Donggyu Date: Tue, 26 Jul 2022 16:10:35 +0900 Subject: [PATCH 06/28] =?UTF-8?q?feat:=20Study=20=EC=B0=B8=EC=97=AC=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../moamoa/study/domain/Participants.java | 4 ++-- .../moamoa/study/domain/Study.java | 13 ++++++++++-- .../moamoa/study/domain/StudyTest.java | 20 +++++++++++++++++++ 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Participants.java b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Participants.java index bc1a139f1..efb66e4e1 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Participants.java +++ b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Participants.java @@ -44,8 +44,8 @@ public List getParticipants() { return new ArrayList<>(participants); } - public static Participants createByMaxSizeAndOwnerId(final Integer maxSize, Long id) { - return new Participants(1, maxSize, new ArrayList<>(), id); + public static Participants createByMaxSizeAndOwnerId(final Integer maxSize, Long ownerId) { + return new Participants(1, maxSize, new ArrayList<>(), ownerId); } protected void participate(final Participant participant) { diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Study.java b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Study.java index 179fa4bec..3660519b3 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Study.java +++ b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Study.java @@ -3,6 +3,7 @@ import static javax.persistence.GenerationType.IDENTITY; import static lombok.AccessLevel.PROTECTED; +import com.woowacourse.moamoa.member.domain.Member; import com.woowacourse.moamoa.study.domain.exception.InvalidPeriodException; import java.time.LocalDateTime; import javax.persistence.Column; @@ -56,9 +57,17 @@ public Study(final Long id, final Details details, final Participants participan validatePeriod(period); } - public void checkStudyParticipating(Long memberId) { + public void participate(final Member member) { + checkStudyParticipating(member.getId()); + + final Participant participant = new Participant(member.getId()); + participants.participate(participant); + } + + private void checkStudyParticipating(Long memberId) { + details.checkStudyStatus(); period.checkParticipatingPeriod(); - participants.checkStudyParticipating(memberId); + participants.checkParticipating(memberId); } private void validatePeriod(final Period period) { diff --git a/backend/src/test/java/com/woowacourse/moamoa/study/domain/StudyTest.java b/backend/src/test/java/com/woowacourse/moamoa/study/domain/StudyTest.java index 0ce587e18..583dcb7fd 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/study/domain/StudyTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/study/domain/StudyTest.java @@ -48,4 +48,24 @@ void createdAtCanSameWithStartAndEndAndEnrollmentDate() { new Period(LocalDate.now(), LocalDate.now(), LocalDate.now()), AttachedTags.empty())) .doesNotThrowAnyException(); } + + @DisplayName("스터디 참여가 가능한 조건(날짜, 가입 가능 수, 가입여부)이면 스터디에 참여할 수 있다.") + @Test + public void participate() { + final Details details = new Details("title", "excerpt", "thumbnail", "OPEN", "description"); + final Member member = new Member(1L, 1L, "username", "image", "profile"); + final Participants participants = Participants.createByMaxSizeAndOwnerId(10, member.getId()); + + final LocalDate enrollmentEndDate = LocalDate.now().plusDays(1); + final LocalDate startDate = LocalDate.now().plusDays(1); + final LocalDate endDate = LocalDate.now().plusDays(1); + + final Period period = new Period(enrollmentEndDate, startDate, endDate); + + final Study study = new Study(details, participants, period, AttachedTags.empty()); + + final Member participant = new Member(2L, 2L, "username", "image", "profile"); + + assertThatCode(() -> study.participate(participant)).doesNotThrowAnyException(); + } } From 3df6cbad2ef8e803c3ac92e5ce5ae23f33400466 Mon Sep 17 00:00:00 2001 From: Donggyu Date: Tue, 26 Jul 2022 16:43:24 +0900 Subject: [PATCH 07/28] =?UTF-8?q?feat:=20StudyService=20=ED=9A=8C=EC=9B=90?= =?UTF-8?q?=20=EC=B0=B8=EC=97=AC=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= =?UTF-8?q?=20=EB=B0=8F=20=EC=83=9D=EC=84=B1=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../moamoa/study/domain/Participants.java | 2 +- .../moamoa/study/service/StudyService.java | 7 +- .../study/controller/StudyControllerTest.java | 6 +- .../study/service/StudyServiceTest.java | 92 +++++++++++++++++++ 4 files changed, 99 insertions(+), 8 deletions(-) create mode 100644 backend/src/test/java/com/woowacourse/moamoa/study/service/StudyServiceTest.java diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Participants.java b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Participants.java index efb66e4e1..62381b5a0 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Participants.java +++ b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Participants.java @@ -45,7 +45,7 @@ public List getParticipants() { } public static Participants createByMaxSizeAndOwnerId(final Integer maxSize, Long ownerId) { - return new Participants(1, maxSize, new ArrayList<>(), ownerId); + return new Participants(1, maxSize, new ArrayList<>(List.of(new Participant(ownerId))), ownerId); } protected void participate(final Participant participant) { diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/service/StudyService.java b/backend/src/main/java/com/woowacourse/moamoa/study/service/StudyService.java index 888a61f74..64139e4ae 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/study/service/StudyService.java +++ b/backend/src/main/java/com/woowacourse/moamoa/study/service/StudyService.java @@ -16,12 +16,12 @@ import org.springframework.transaction.annotation.Transactional; @Service -@Transactional(readOnly = true) +@Transactional @RequiredArgsConstructor public class StudyService { - private final MemberRepository memberRepository; private final StudyRepository studyRepository; + private final MemberRepository memberRepository; public Study createStudy(final Long githubId, final CreatingStudyRequest request) { final Member owner = findMemberBy(githubId); @@ -34,12 +34,11 @@ public Study createStudy(final Long githubId, final CreatingStudyRequest request return studyRepository.save(new Study(details, participants, period, attachedTags)); } - @Transactional public void participantStudy(final Long githubId, final Long studyId) { final Member member = findMemberBy(githubId); final Study study = findStudyBy(studyId); - study.checkStudyParticipating(member.getId()); + study.participate(member); } private Study findStudyBy(final Long studyId) { diff --git a/backend/src/test/java/com/woowacourse/moamoa/study/controller/StudyControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/study/controller/StudyControllerTest.java index 2add49e7c..3d3a93127 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/study/controller/StudyControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/study/controller/StudyControllerTest.java @@ -43,7 +43,7 @@ void initDataBase() { @Test void openStudy() { // given - StudyController sut = new StudyController(new StudyService(memberRepository, studyRepository)); + StudyController sut = new StudyController(new StudyService(studyRepository, memberRepository)); final CreatingStudyRequest creatingStudyRequest = CreatingStudyRequest.builder() .title("Java") .excerpt("java excerpt") @@ -79,7 +79,7 @@ void openStudy() { @DisplayName("유효하지 않은 스터디 기간으로 생성 시 예외 발생") @Test void createStudyByInvalidPeriod() { - StudyController sut = new StudyController(new StudyService(memberRepository, studyRepository)); + StudyController sut = new StudyController(new StudyService(studyRepository, memberRepository)); final CreatingStudyRequest creatingStudyRequest = CreatingStudyRequest.builder() .title("Java") .excerpt("java excerpt") @@ -100,7 +100,7 @@ void createStudyByInvalidPeriod() { @DisplayName("존재하지 않은 사용자로 생성 시 예외 발생") @Test void createStudyByNotFoundUser() { - StudyController sut = new StudyController(new StudyService(memberRepository, studyRepository)); + StudyController sut = new StudyController(new StudyService(studyRepository, memberRepository)); final CreatingStudyRequest creatingStudyRequest = CreatingStudyRequest.builder() .title("Java") .excerpt("java excerpt") diff --git a/backend/src/test/java/com/woowacourse/moamoa/study/service/StudyServiceTest.java b/backend/src/test/java/com/woowacourse/moamoa/study/service/StudyServiceTest.java new file mode 100644 index 000000000..ec9884697 --- /dev/null +++ b/backend/src/test/java/com/woowacourse/moamoa/study/service/StudyServiceTest.java @@ -0,0 +1,92 @@ +package com.woowacourse.moamoa.study.service; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; + +import com.woowacourse.moamoa.common.RepositoryTest; +import com.woowacourse.moamoa.member.domain.Member; +import com.woowacourse.moamoa.member.domain.repository.MemberRepository; +import com.woowacourse.moamoa.study.domain.Participant; +import com.woowacourse.moamoa.study.domain.Study; +import com.woowacourse.moamoa.study.domain.repository.StudyRepository; +import com.woowacourse.moamoa.study.service.request.CreatingStudyRequest; +import java.time.LocalDate; +import java.util.List; +import javax.persistence.EntityManager; +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.jdbc.core.JdbcTemplate; + +@RepositoryTest +class StudyServiceTest { + + private StudyService studyService; + + @Autowired + private StudyRepository studyRepository; + + @Autowired + private MemberRepository memberRepository; + + @Autowired + private JdbcTemplate jdbcTemplate; + + @Autowired + private EntityManager entityManager; + + @BeforeEach + void initDataBase() { + jdbcTemplate.update( + "INSERT INTO member(id, github_id, username, image_url, profile_url) VALUES (1, 1, 'jjanggu', 'https://image', 'github.com')"); + jdbcTemplate.update( + "INSERT INTO member(id, github_id, username, image_url, profile_url) VALUES (2, 2, 'greenlawn', 'https://image', 'github.com')"); + } + + @BeforeEach + void setUp() { + this.studyService = new StudyService(studyRepository, memberRepository); + } + + @DisplayName("회원은 스터디를 생성할 수 있다.") + @Test + public void createStudy() { + final Member member = memberRepository.findByGithubId(1L).get(); + + final CreatingStudyRequest creatingStudyRequest = new CreatingStudyRequest("title", "excerpt", "thumbnail", + "description", 10, LocalDate.now().plusDays(1), LocalDate.now().plusDays(1), + LocalDate.now().plusDays(1), List.of()); + + assertDoesNotThrow(() -> studyService.createStudy(member.getGithubId(), creatingStudyRequest)); + final Study study = studyRepository.findById(1L).get(); + assertThat(study.getParticipants().getParticipants().size()).isEqualTo(1); + } + + @DisplayName("아직 참여하지 않았고 모집기간이 마감되지 않은 열려있는 스터디에 대해서 회원은 스터디에 참여할 수 있다.") + @Test + public void participantStudy() { + // given + final Member member = memberRepository.findByGithubId(1L).get(); + + final CreatingStudyRequest creatingStudyRequest = new CreatingStudyRequest("title", "excerpt", "thumbnail", + "description", 10, LocalDate.now().plusDays(1), LocalDate.now().plusDays(1), + LocalDate.now().plusDays(1), List.of()); + + final Study createdStudy = studyService.createStudy(member.getGithubId(), creatingStudyRequest); + + // when + final Study foundStudy = studyRepository.findById(createdStudy.getId()).get(); + final Member participant = memberRepository.findByGithubId(2L).get(); + + studyService.participantStudy(participant.getGithubId(), foundStudy.getId()); + entityManager.flush(); + + // then + final Study result = studyRepository.findById(foundStudy.getId()).get(); + assertThat(result.getParticipants().getParticipants().size()).isEqualTo(2); + assertThat(result.getParticipants().getParticipants().contains(new Participant(2L))).isTrue(); + } +} + + From 5b6a5c5b241897c1bc8e890aadc35c71ada79da5 Mon Sep 17 00:00:00 2001 From: Donggyu Date: Tue, 26 Jul 2022 16:58:56 +0900 Subject: [PATCH 08/28] =?UTF-8?q?feat:=20StudyController=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20=EB=B0=8F=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 --- .../common/advice/CommonControllerAdvice.java | 11 +++-- .../study/controller/StudyController.java | 3 +- .../study/controller/StudyControllerTest.java | 44 +++++++++++++++++-- 3 files changed, 49 insertions(+), 9 deletions(-) diff --git a/backend/src/main/java/com/woowacourse/moamoa/common/advice/CommonControllerAdvice.java b/backend/src/main/java/com/woowacourse/moamoa/common/advice/CommonControllerAdvice.java index 37ffdefd4..938c1c15d 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/common/advice/CommonControllerAdvice.java +++ b/backend/src/main/java/com/woowacourse/moamoa/common/advice/CommonControllerAdvice.java @@ -1,10 +1,12 @@ package com.woowacourse.moamoa.common.advice; -import com.woowacourse.moamoa.common.exception.UnauthorizedException; +import static org.springframework.http.HttpStatus.UNAUTHORIZED; + import com.woowacourse.moamoa.common.advice.response.ErrorResponse; import com.woowacourse.moamoa.common.exception.InvalidFormatException; +import com.woowacourse.moamoa.common.exception.UnauthorizedException; import com.woowacourse.moamoa.study.domain.exception.InvalidPeriodException; -import org.springframework.http.HttpStatus; +import com.woowacourse.moamoa.study.service.exception.InvalidParticipationStudyException; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; @@ -14,7 +16,8 @@ public class CommonControllerAdvice { @ExceptionHandler({ InvalidFormatException.class, - InvalidPeriodException.class + InvalidPeriodException.class, + InvalidParticipationStudyException.class }) public ResponseEntity handleBadRequest(final Exception e) { return ResponseEntity.badRequest().body(new ErrorResponse(e.getMessage())); @@ -22,6 +25,6 @@ public ResponseEntity handleBadRequest(final Exception e) { @ExceptionHandler public ResponseEntity handleUnauthorized(final UnauthorizedException e) { - return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build(); + return ResponseEntity.status(UNAUTHORIZED).build(); } } diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/controller/StudyController.java b/backend/src/main/java/com/woowacourse/moamoa/study/controller/StudyController.java index 92506ae52..bb34fa317 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/study/controller/StudyController.java +++ b/backend/src/main/java/com/woowacourse/moamoa/study/controller/StudyController.java @@ -34,8 +34,7 @@ public ResponseEntity createStudy( public ResponseEntity participateStudy(@AuthenticationPrincipal final Long githubId, @PathVariable("study-id") final Long studyId ) { - - + studyService.participantStudy(githubId, studyId); return ResponseEntity.ok().build(); } } diff --git a/backend/src/test/java/com/woowacourse/moamoa/study/controller/StudyControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/study/controller/StudyControllerTest.java index 3d3a93127..f36c85c16 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/study/controller/StudyControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/study/controller/StudyControllerTest.java @@ -2,12 +2,13 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.springframework.http.HttpStatus.CREATED; +import static org.springframework.http.HttpStatus.OK; import com.woowacourse.moamoa.common.RepositoryTest; import com.woowacourse.moamoa.common.exception.UnauthorizedException; import com.woowacourse.moamoa.member.domain.Member; import com.woowacourse.moamoa.member.domain.repository.MemberRepository; -import com.woowacourse.moamoa.study.service.request.CreatingStudyRequest; import com.woowacourse.moamoa.study.domain.Details; import com.woowacourse.moamoa.study.domain.Participants; import com.woowacourse.moamoa.study.domain.Period; @@ -15,6 +16,7 @@ import com.woowacourse.moamoa.study.domain.exception.InvalidPeriodException; import com.woowacourse.moamoa.study.domain.repository.StudyRepository; import com.woowacourse.moamoa.study.service.StudyService; +import com.woowacourse.moamoa.study.service.request.CreatingStudyRequest; import java.time.LocalDate; import java.util.List; import java.util.Optional; @@ -22,7 +24,6 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @RepositoryTest @@ -37,6 +38,7 @@ public class StudyControllerTest { @BeforeEach void initDataBase() { memberRepository.save(new Member(1L, "jjanggu", "https://image", "github.com")); + memberRepository.save(new Member(2L, "dwoo", "https://image", "github.com")); } @DisplayName("스터디를 생성하여 저장한다.") @@ -63,7 +65,7 @@ void openStudy() { final String id = response.getHeaders().getLocation().getPath().replace("/api/studies/", ""); Long studyId = Long.valueOf(id); Optional study = studyRepository.findById(studyId); - assertThat(response.getStatusCode()).isEqualTo(HttpStatus.CREATED); + assertThat(response.getStatusCode()).isEqualTo(CREATED); assertThat(study).isNotEmpty(); assertThat(study.get().getDetails()).isEqualTo(new Details("Java", "java excerpt", "java image", "OPEN", "자바 스터디 상세설명 입니다.")); assertThat(study.get().getParticipants()).isEqualTo(Participants.createByMaxSizeAndOwnerId(10, @@ -117,4 +119,40 @@ void createStudyByNotFoundUser() { assertThatThrownBy(() -> sut.createStudy(100L, creatingStudyRequest)) // 존재하지 않는 사용자로 추가 시 예외 발생 .isInstanceOf(UnauthorizedException.class); } + + @DisplayName("회원은 스터디에 참여할 수 있다.") + @Test + public void participateStudy() { + // given + StudyController studyController = new StudyController(new StudyService(studyRepository, memberRepository)); + final CreatingStudyRequest creatingStudyRequest = CreatingStudyRequest.builder() + .title("Java") + .excerpt("java excerpt") + .thumbnail("java image") + .description("자바 스터디 상세설명 입니다.") + .startDate(LocalDate.now().plusDays(1)) + .endDate(LocalDate.now().plusDays(4)) + .enrollmentEndDate(LocalDate.now().plusDays(2)) + .maxMemberCount(10) + .tagIds(List.of(1L, 2L)) + .build(); + + final ResponseEntity createdResponse = studyController.createStudy(1L, creatingStudyRequest); + + // when + final String location = createdResponse.getHeaders().getLocation().getPath(); + final long studyId = getStudyIdBy(location); + + final Member participant = memberRepository.findByGithubId(2L).get(); + final ResponseEntity response = studyController.participateStudy(participant.getGithubId(), + studyId); + + // then + assertThat(response.getStatusCode()).isEqualTo(OK); + } + + private long getStudyIdBy(final String location) { + final String[] splitLocation = location.split("/"); + return Long.parseLong(splitLocation[3]); + } } From 40a7434aa3b565bd57e4c0ce949775c501aab22a Mon Sep 17 00:00:00 2001 From: Donggyu Date: Tue, 26 Jul 2022 17:24:50 +0900 Subject: [PATCH 09/28] =?UTF-8?q?fix:=20=EC=8A=A4=ED=84=B0=EB=94=94=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=98=A4?= =?UTF-8?q?=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/woowacourse/moamoa/study/service/StudyServiceTest.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/backend/src/test/java/com/woowacourse/moamoa/study/service/StudyServiceTest.java b/backend/src/test/java/com/woowacourse/moamoa/study/service/StudyServiceTest.java index ec9884697..1aca75cd7 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/study/service/StudyServiceTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/study/service/StudyServiceTest.java @@ -59,8 +59,6 @@ public void createStudy() { LocalDate.now().plusDays(1), List.of()); assertDoesNotThrow(() -> studyService.createStudy(member.getGithubId(), creatingStudyRequest)); - final Study study = studyRepository.findById(1L).get(); - assertThat(study.getParticipants().getParticipants().size()).isEqualTo(1); } @DisplayName("아직 참여하지 않았고 모집기간이 마감되지 않은 열려있는 스터디에 대해서 회원은 스터디에 참여할 수 있다.") From 47b49dd6bc0b5e1bddac0431f54cf9388a5c9a68 Mon Sep 17 00:00:00 2001 From: Donggyu Date: Wed, 27 Jul 2022 10:22:43 +0900 Subject: [PATCH 10/28] =?UTF-8?q?fix:=20EnrollmentEndDate=20=EB=8A=94=20nu?= =?UTF-8?q?ll=20=EC=9D=BC=EC=88=98=20=EC=9E=88=EC=9C=BC=EB=AF=80=EB=A1=9C?= =?UTF-8?q?=20=EC=9D=B4=EB=A5=BC=20=EA=B3=A0=EB=A0=A4=ED=95=98=EC=97=AC=20?= =?UTF-8?q?=EA=B2=80=EC=A6=9D=20=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/woowacourse/moamoa/study/domain/Period.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Period.java b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Period.java index ba405ca99..68a55f6ed 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Period.java +++ b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Period.java @@ -36,7 +36,7 @@ public boolean isBefore(final LocalDateTime createAt) { } protected void checkParticipatingPeriod() { - if (!enrollmentEndDate.isAfter(LocalDate.now())) { + if (enrollmentEndDate != null && !enrollmentEndDate.isAfter(LocalDate.now())) { throw new InvalidParticipationStudyException(); } } From 63a43785ff51b151d0da4fb1e14d92db049bf565 Mon Sep 17 00:00:00 2001 From: Donggyu Date: Wed, 27 Jul 2022 13:52:49 +0900 Subject: [PATCH 11/28] =?UTF-8?q?feat:=20=EC=9D=B8=EC=88=98=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../moamoa/study/domain/Participant.java | 20 +-- .../moamoa/study/domain/Participants.java | 11 +- .../study/CreatingStudyAcceptanceTest.java | 23 +-- .../ParticipationStudyAcceptanceTest.java | 136 ++++++++++++++++++ .../moamoa/study/domain/ParticipantsTest.java | 5 +- 5 files changed, 161 insertions(+), 34 deletions(-) create mode 100644 backend/src/test/java/com/woowacourse/acceptance/study/ParticipationStudyAcceptanceTest.java diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Participant.java b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Participant.java index d28c02d4f..50b602d1e 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Participant.java +++ b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Participant.java @@ -2,10 +2,10 @@ import static lombok.AccessLevel.PROTECTED; -import java.util.Objects; import javax.persistence.Column; import javax.persistence.Embeddable; import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.ToString; @@ -15,25 +15,9 @@ @NoArgsConstructor(access = PROTECTED) @AllArgsConstructor @ToString +@EqualsAndHashCode public class Participant { @Column(name = "member_id", nullable = false) private Long memberId; - - @Override - public boolean equals(final Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - final Participant that = (Participant) o; - return Objects.equals(memberId, that.memberId); - } - - @Override - public int hashCode() { - return Objects.hash(memberId); - } } diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Participants.java b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Participants.java index 62381b5a0..532648a4d 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Participants.java +++ b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Participants.java @@ -4,8 +4,10 @@ import com.woowacourse.moamoa.study.service.exception.InvalidParticipationStudyException; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; import java.util.Objects; +import java.util.Set; import javax.persistence.CollectionTable; import javax.persistence.Column; import javax.persistence.ElementCollection; @@ -30,10 +32,10 @@ public class Participants { @ElementCollection @CollectionTable(name = "study_member", joinColumns = @JoinColumn(name = "study_id")) - private List participants = new ArrayList<>(); + private Set participants = new HashSet<>(); public Participants(final Integer size, final Integer max, - final List participants, Long ownerId) { + final Set participants, Long ownerId) { this.size = size; this.max = max; this.participants = participants; @@ -45,7 +47,7 @@ public List getParticipants() { } public static Participants createByMaxSizeAndOwnerId(final Integer maxSize, Long ownerId) { - return new Participants(1, maxSize, new ArrayList<>(List.of(new Participant(ownerId))), ownerId); + return new Participants(1, maxSize, new HashSet<>(List.of(new Participant(ownerId))), ownerId); } protected void participate(final Participant participant) { @@ -64,7 +66,8 @@ private boolean isInvalidMemberSize() { } private boolean isAlreadyParticipation(final Long memberId) { - return Objects.equals(memberId, ownerId) || participants.contains(memberId); + final Participant participant = new Participant(memberId); + return Objects.equals(memberId, ownerId) || participants.contains(participant); } @Override diff --git a/backend/src/test/java/com/woowacourse/acceptance/study/CreatingStudyAcceptanceTest.java b/backend/src/test/java/com/woowacourse/acceptance/study/CreatingStudyAcceptanceTest.java index e06d9215a..b2ebe336f 100644 --- a/backend/src/test/java/com/woowacourse/acceptance/study/CreatingStudyAcceptanceTest.java +++ b/backend/src/test/java/com/woowacourse/acceptance/study/CreatingStudyAcceptanceTest.java @@ -1,5 +1,10 @@ package com.woowacourse.acceptance.study; +import static org.springframework.http.HttpHeaders.AUTHORIZATION; +import static org.springframework.http.HttpHeaders.CONTENT_TYPE; +import static org.springframework.http.HttpHeaders.LOCATION; +import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; + import com.woowacourse.acceptance.AcceptanceTest; import com.woowacourse.moamoa.auth.service.oauthclient.response.GithubProfileResponse; import io.restassured.RestAssured; @@ -16,9 +21,7 @@ import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; import org.junit.jupiter.params.provider.ValueSource; -import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; public class CreatingStudyAcceptanceTest extends AcceptanceTest { @@ -36,7 +39,7 @@ void initDataBase() { void get401WhenUsingInvalidToken(String invalidToken) { RestAssured .given().log().all() - .header(HttpHeaders.AUTHORIZATION, invalidToken) + .header(AUTHORIZATION, invalidToken) .when().log().all() .post("/api/studies") .then().log().all() @@ -63,8 +66,8 @@ void get400WhenSetBlankToRequiredField(Map param) { RestAssured .given().log().all() - .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) - .header(HttpHeaders.AUTHORIZATION, jwtToken) + .header(CONTENT_TYPE, APPLICATION_JSON_VALUE) + .header(AUTHORIZATION, jwtToken) .body(param) .when().log().all() .post("/api/studies") @@ -112,8 +115,8 @@ void get400WhenSetInvalidFormatToOptionalFields(Map optionalBody RestAssured .given().log().all() - .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) - .header(HttpHeaders.AUTHORIZATION, jwtToken) + .header(CONTENT_TYPE, APPLICATION_JSON_VALUE) + .header(AUTHORIZATION, jwtToken) .body(body) .when().log().all() .post("/api/studies") @@ -138,8 +141,8 @@ void createStudy() { new GithubProfileResponse(1L, "jjanggu", "https://image", "github.com")); final String location = RestAssured.given().log().all() - .header(HttpHeaders.AUTHORIZATION, jwtToken) - .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .header(AUTHORIZATION, jwtToken) + .header(CONTENT_TYPE, APPLICATION_JSON_VALUE) .body(Map.of("title", "제목", "excerpt", "자바를 공부하는 스터디", "thumbnail", "image", "description", "스터디 상세 설명입니다.", "startDate", LocalDate.now().plusDays(5).format( DateTimeFormatter.ofPattern("yyyy-MM-dd")), "endDate", "")) @@ -147,7 +150,7 @@ void createStudy() { .post("/api/studies") .then().log().all() .statusCode(HttpStatus.CREATED.value()) - .extract().header(HttpHeaders.LOCATION); + .extract().header(LOCATION); RestAssured.given().log().all() .when().log().all() diff --git a/backend/src/test/java/com/woowacourse/acceptance/study/ParticipationStudyAcceptanceTest.java b/backend/src/test/java/com/woowacourse/acceptance/study/ParticipationStudyAcceptanceTest.java new file mode 100644 index 000000000..dcc1f1689 --- /dev/null +++ b/backend/src/test/java/com/woowacourse/acceptance/study/ParticipationStudyAcceptanceTest.java @@ -0,0 +1,136 @@ +package com.woowacourse.acceptance.study; + +import static org.springframework.http.HttpHeaders.AUTHORIZATION; +import static org.springframework.http.HttpHeaders.CONTENT_TYPE; +import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; + +import com.woowacourse.acceptance.AcceptanceTest; +import com.woowacourse.moamoa.auth.service.oauthclient.response.GithubProfileResponse; +import io.restassured.RestAssured; +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.http.HttpStatus; +import org.springframework.jdbc.core.JdbcTemplate; + +public class ParticipationStudyAcceptanceTest extends AcceptanceTest { + + @Autowired + private JdbcTemplate jdbcTemplate; + + @BeforeEach + void initDataBase() { + getBearerTokenBySignInOrUp(new GithubProfileResponse(1L, "jjanggu", "https://image", "github.com")); + getBearerTokenBySignInOrUp(new GithubProfileResponse(2L, "greenlawn", "https://image", "github.com")); + getBearerTokenBySignInOrUp(new GithubProfileResponse(3L, "dwoo", "https://image", "github.com")); + getBearerTokenBySignInOrUp(new GithubProfileResponse(4L, "verus", "https://image", "github.com")); + + jdbcTemplate.update( + "INSERT INTO study(id, title, excerpt, thumbnail, status, description, current_member_count, max_member_count, created_at, start_date, owner_id) " + + "VALUES (1, 'Java 스터디', '자바 설명', 'java thumbnail', 'OPEN', '그린론의 우당탕탕 자바 스터디입니다.', 3, 10, '2021-11-08T11:58:20.551705', '2021-12-08T11:58:20.657123', 2)"); + + jdbcTemplate.update( + "INSERT INTO study(id, title, excerpt, thumbnail, status, description, current_member_count, max_member_count, created_at, enrollment_end_date, start_date, end_date, owner_id) " + + "VALUES (2, 'React 스터디', '리액트 설명', 'react thumbnail', 'OPEN', '디우의 뤼액트 스터디입니다.', 4, 5, '2021-11-08T11:58:20.551705', '1999-01-01T00:00:00', '2021-11-10T11:58:20.551705', '2021-12-08T11:58:20.551705', 3)"); + + jdbcTemplate.update( + "INSERT INTO study(id, title, excerpt, thumbnail, status, description, current_member_count, max_member_count, created_at, start_date, owner_id) " + + "VALUES (3, 'Java 스터디', '자바 설명', 'java thumbnail', 'CLOSE', '그린론의 우당탕탕 자바 스터디입니다.', 3, 10, '2021-11-08T11:58:20.551705', '2021-12-08T11:58:20.657123', 2)"); + + jdbcTemplate.update( + "INSERT INTO study(id, title, excerpt, thumbnail, status, description, current_member_count, max_member_count, created_at, start_date, owner_id) " + + "VALUES (4, 'Java 스터디', '자바 설명', 'java thumbnail', 'CLOSE', '그린론의 우당탕탕 자바 스터디입니다.', 3, 3, '2021-11-08T11:58:20.551705', '2021-12-08T11:58:20.657123', 2)"); + + jdbcTemplate.update("INSERT INTO study_member(study_id, member_id) VALUES (1, 1)"); + jdbcTemplate.update("INSERT INTO study_member(study_id, member_id) VALUES (1, 2)"); + jdbcTemplate.update("INSERT INTO study_member(study_id, member_id) VALUES (1, 4)"); + + jdbcTemplate.update("INSERT INTO study_member(study_id, member_id) VALUES (2, 1)"); + jdbcTemplate.update("INSERT INTO study_member(study_id, member_id) VALUES (2, 2)"); + jdbcTemplate.update("INSERT INTO study_member(study_id, member_id) VALUES (2, 3)"); + + jdbcTemplate.update("INSERT INTO study_member(study_id, member_id) VALUES (3, 1)"); + jdbcTemplate.update("INSERT INTO study_member(study_id, member_id) VALUES (3, 2)"); + jdbcTemplate.update("INSERT INTO study_member(study_id, member_id) VALUES (3, 4)"); + + jdbcTemplate.update("INSERT INTO study_member(study_id, member_id) VALUES (1, 1)"); + jdbcTemplate.update("INSERT INTO study_member(study_id, member_id) VALUES (1, 2)"); + jdbcTemplate.update("INSERT INTO study_member(study_id, member_id) VALUES (1, 4)"); + } + + @DisplayName("아직 스터디에 가입되지 않은 회원은 스터디에 참여가 가능하다.") + @Test + public void participateStudy() { + final String jwtToken = getBearerTokenBySignInOrUp( + new GithubProfileResponse(3L, "dwoo", "https://image", "github.com")); + + RestAssured.given().log().all() + .header(CONTENT_TYPE, APPLICATION_JSON_VALUE) + .header(AUTHORIZATION, jwtToken) + .when().log().all() + .post("/api/studies/1") + .then().log().all() + .statusCode(HttpStatus.OK.value()); + } + + @DisplayName("한 명의 회원은 동일한 스터디에 대해서 한 번만 가입이 가능하다.") + @Test + public void participateOnlyOnce() { + final String jwtToken = getBearerTokenBySignInOrUp( + new GithubProfileResponse(1L, "jjanggu", "https://image", "github.com")); + + RestAssured.given().log().all() + .header(CONTENT_TYPE, APPLICATION_JSON_VALUE) + .header(AUTHORIZATION, jwtToken) + .when().log().all() + .post("/api/studies/1") + .then().log().all() + .statusCode(HttpStatus.BAD_REQUEST.value()); + } + + @DisplayName("모집기간이 이미 만료된 스터디에 신청시에는 에러가 발생한다.") + @Test + public void get400WithEndRecruit() { + final String jwtToken = getBearerTokenBySignInOrUp( + new GithubProfileResponse(4L, "verus", "https://image", "github.com")); + + RestAssured.given().log().all() + .header(CONTENT_TYPE, APPLICATION_JSON_VALUE) + .header(AUTHORIZATION, jwtToken) + .when().log().all() + .post("/api/studies/2") + .then().log().all() + .statusCode(HttpStatus.BAD_REQUEST.value()); + } + + @DisplayName("CLOSE 상태의 스터디에 참여 요청시 400 에러가 발생한다.") + @Test + public void participateCloseStudy() { + final String jwtToken = getBearerTokenBySignInOrUp( + new GithubProfileResponse(3L, "dwoo", "https://image", "github.com")); + + RestAssured.given().log().all() + .header(CONTENT_TYPE, APPLICATION_JSON_VALUE) + .header(AUTHORIZATION, jwtToken) + .when().log().all() + .post("/api/studies/3") + .then().log().all() + .statusCode(HttpStatus.BAD_REQUEST.value()); + } + + @DisplayName("인원이 가득찬 스터디에 참여하면 400 에러가 발생한다.") + @Test + public void participateFullStudy() { + final String jwtToken = getBearerTokenBySignInOrUp( + new GithubProfileResponse(3L, "dwoo", "https://image", "github.com")); + + RestAssured.given().log().all() + .header(CONTENT_TYPE, APPLICATION_JSON_VALUE) + .header(AUTHORIZATION, jwtToken) + .when().log().all() + .post("/api/studies/4") + .then().log().all() + .statusCode(HttpStatus.BAD_REQUEST.value()); + } +} diff --git a/backend/src/test/java/com/woowacourse/moamoa/study/domain/ParticipantsTest.java b/backend/src/test/java/com/woowacourse/moamoa/study/domain/ParticipantsTest.java index c0d0d05fc..30cb0bcc8 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/study/domain/ParticipantsTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/study/domain/ParticipantsTest.java @@ -4,14 +4,15 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; -import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; class ParticipantsTest { - private static final List PARTICIPANTS = new ArrayList<>( + private static final Set PARTICIPANTS = new HashSet<>( List.of(new Participant(2L), new Participant(3L), new Participant(4L)) ); From 9291dd055e880089520e225eae00df22d8fbe091 Mon Sep 17 00:00:00 2001 From: Donggyu Date: Wed, 27 Jul 2022 16:40:03 +0900 Subject: [PATCH 12/28] =?UTF-8?q?fix:=20ParticipantsTest=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../woowacourse/moamoa/study/domain/ParticipantsTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/src/test/java/com/woowacourse/moamoa/study/domain/ParticipantsTest.java b/backend/src/test/java/com/woowacourse/moamoa/study/domain/ParticipantsTest.java index 30cb0bcc8..845084b85 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/study/domain/ParticipantsTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/study/domain/ParticipantsTest.java @@ -13,7 +13,7 @@ class ParticipantsTest { private static final Set PARTICIPANTS = new HashSet<>( - List.of(new Participant(2L), new Participant(3L), new Participant(4L)) + List.of(new Participant(1L), new Participant(2L), new Participant(3L)) ); @DisplayName("스터디장은 이미 스터디에 참여한 것이므로 검사 시에 예외가 발생한다.") @@ -29,7 +29,7 @@ public void checkParticipatingAboutOwner() { public void checkAlreadyParticipating() { final Participants participants = new Participants(3, 10, PARTICIPANTS, 1L); - assertThatThrownBy(() -> participants.checkParticipating(1L)); + assertThatThrownBy(() -> participants.checkParticipating(2L)); } @DisplayName("스터디 회원 수가 꽉 차지 않은 경우 정상적으로 가입이 된다.") @@ -56,6 +56,6 @@ public void IncreaseCurrentMemberCount() { participants.participate(new Participant(4L)); assertThat(participants.getParticipants().size()).isEqualTo(4); - assertThatThrownBy(() -> participants.checkParticipating(5L)); + assertThatThrownBy(() -> participants.checkParticipating(4L)); } } From 06340737b05b1c458585a5c6ae21ca63ea64430d Mon Sep 17 00:00:00 2001 From: Donggyu Date: Wed, 27 Jul 2022 17:40:15 +0900 Subject: [PATCH 13/28] =?UTF-8?q?fix:=20owner=EB=8A=94=20participants=20?= =?UTF-8?q?=EA=B0=80=20=EC=95=84=EB=8B=88=EB=AF=80=EB=A1=9C=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/woowacourse/moamoa/study/domain/Participants.java | 4 ++++ .../acceptance/study/ParticipationStudyAcceptanceTest.java | 4 ---- .../com/woowacourse/moamoa/study/domain/ParticipantsTest.java | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Participants.java b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Participants.java index 532648a4d..4048a7a6a 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Participants.java +++ b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Participants.java @@ -55,6 +55,10 @@ protected void participate(final Participant participant) { this.size = this.size + 1; } + public int getCurrentMemberSize() { + return size; + } + protected void checkParticipating(Long memberId) { if (isInvalidMemberSize() || isAlreadyParticipation(memberId)) { throw new InvalidParticipationStudyException(); diff --git a/backend/src/test/java/com/woowacourse/acceptance/study/ParticipationStudyAcceptanceTest.java b/backend/src/test/java/com/woowacourse/acceptance/study/ParticipationStudyAcceptanceTest.java index dcc1f1689..fd45eeee6 100644 --- a/backend/src/test/java/com/woowacourse/acceptance/study/ParticipationStudyAcceptanceTest.java +++ b/backend/src/test/java/com/woowacourse/acceptance/study/ParticipationStudyAcceptanceTest.java @@ -43,19 +43,15 @@ void initDataBase() { + "VALUES (4, 'Java 스터디', '자바 설명', 'java thumbnail', 'CLOSE', '그린론의 우당탕탕 자바 스터디입니다.', 3, 3, '2021-11-08T11:58:20.551705', '2021-12-08T11:58:20.657123', 2)"); jdbcTemplate.update("INSERT INTO study_member(study_id, member_id) VALUES (1, 1)"); - jdbcTemplate.update("INSERT INTO study_member(study_id, member_id) VALUES (1, 2)"); jdbcTemplate.update("INSERT INTO study_member(study_id, member_id) VALUES (1, 4)"); jdbcTemplate.update("INSERT INTO study_member(study_id, member_id) VALUES (2, 1)"); jdbcTemplate.update("INSERT INTO study_member(study_id, member_id) VALUES (2, 2)"); - jdbcTemplate.update("INSERT INTO study_member(study_id, member_id) VALUES (2, 3)"); jdbcTemplate.update("INSERT INTO study_member(study_id, member_id) VALUES (3, 1)"); - jdbcTemplate.update("INSERT INTO study_member(study_id, member_id) VALUES (3, 2)"); jdbcTemplate.update("INSERT INTO study_member(study_id, member_id) VALUES (3, 4)"); jdbcTemplate.update("INSERT INTO study_member(study_id, member_id) VALUES (1, 1)"); - jdbcTemplate.update("INSERT INTO study_member(study_id, member_id) VALUES (1, 2)"); jdbcTemplate.update("INSERT INTO study_member(study_id, member_id) VALUES (1, 4)"); } diff --git a/backend/src/test/java/com/woowacourse/moamoa/study/domain/ParticipantsTest.java b/backend/src/test/java/com/woowacourse/moamoa/study/domain/ParticipantsTest.java index 845084b85..6c9dc6cfb 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/study/domain/ParticipantsTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/study/domain/ParticipantsTest.java @@ -13,7 +13,7 @@ class ParticipantsTest { private static final Set PARTICIPANTS = new HashSet<>( - List.of(new Participant(1L), new Participant(2L), new Participant(3L)) + List.of(new Participant(2L), new Participant(3L)) ); @DisplayName("스터디장은 이미 스터디에 참여한 것이므로 검사 시에 예외가 발생한다.") @@ -55,7 +55,7 @@ public void IncreaseCurrentMemberCount() { participants.participate(new Participant(4L)); - assertThat(participants.getParticipants().size()).isEqualTo(4); + assertThat(participants.getCurrentMemberSize()).isEqualTo(4); assertThatThrownBy(() -> participants.checkParticipating(4L)); } } From 72274e165508024b83652b6f0ac210de5cc3a624 Mon Sep 17 00:00:00 2001 From: Donggyu Date: Thu, 28 Jul 2022 10:15:32 +0900 Subject: [PATCH 14/28] =?UTF-8?q?fix:=20isInvalidMemberSize=20`=EC=8A=A4?= =?UTF-8?q?=ED=84=B0=EB=94=94=20=EC=B5=9C=EB=8C=80=20=EC=9D=B8=EC=9B=90?= =?UTF-8?q?=EC=88=98`=20=EA=B0=80=20=EC=97=86=EB=8A=94=20=EA=B2=BD?= =?UTF-8?q?=EC=9A=B0=EB=8F=84=20=EB=B0=98=EC=98=81=ED=95=98=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/woowacourse/moamoa/study/domain/Participants.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Participants.java b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Participants.java index 4048a7a6a..665192e34 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Participants.java +++ b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Participants.java @@ -66,7 +66,7 @@ protected void checkParticipating(Long memberId) { } private boolean isInvalidMemberSize() { - return max == null || max <= size; + return max != null && max <= size; } private boolean isAlreadyParticipation(final Long memberId) { From b1ec72ff4eebddac5225970f79f814666aeff220 Mon Sep 17 00:00:00 2001 From: Donggyu Date: Thu, 28 Jul 2022 10:17:04 +0900 Subject: [PATCH 15/28] =?UTF-8?q?refactor:=20=EB=A7=88=EA=B0=90=EC=9D=BC?= =?UTF-8?q?=EC=9E=90=20=EA=B2=80=EC=A6=9D=20=EB=A1=9C=EC=A7=81=20=EA=B0=80?= =?UTF-8?q?=EB=8F=85=EC=84=B1=20=EC=9E=88=EA=B2=8C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/woowacourse/moamoa/study/domain/Period.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Period.java b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Period.java index 68a55f6ed..c565cb6b7 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Period.java +++ b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Period.java @@ -36,7 +36,7 @@ public boolean isBefore(final LocalDateTime createAt) { } protected void checkParticipatingPeriod() { - if (enrollmentEndDate != null && !enrollmentEndDate.isAfter(LocalDate.now())) { + if (enrollmentEndDate != null && enrollmentEndDate.isBefore(LocalDate.now())) { throw new InvalidParticipationStudyException(); } } From 90e9ec5f4e6fcbfe0d8a264b43588ff9b676f6ba Mon Sep 17 00:00:00 2001 From: Donggyu Date: Thu, 28 Jul 2022 11:34:08 +0900 Subject: [PATCH 16/28] =?UTF-8?q?refactor:=20assertThatThrownBy().isInstna?= =?UTF-8?q?ceOf()=20=EB=A1=9C=20=EC=98=88=EC=99=B8=20=ED=83=80=EC=9E=85=20?= =?UTF-8?q?=EC=B2=B4=ED=81=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../moamoa/study/domain/DetailsTest.java | 4 +++- .../moamoa/study/domain/ParticipantsTest.java | 13 +++++++++---- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/backend/src/test/java/com/woowacourse/moamoa/study/domain/DetailsTest.java b/backend/src/test/java/com/woowacourse/moamoa/study/domain/DetailsTest.java index 7579412bd..ce4c395ac 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/study/domain/DetailsTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/study/domain/DetailsTest.java @@ -2,6 +2,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; +import com.woowacourse.moamoa.study.service.exception.InvalidParticipationStudyException; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -14,6 +15,7 @@ class DetailsTest { public void checkStudyStatus() { final Details details = new Details("title", "excerpt", "thumbnail", CLOSE, "description"); - assertThatThrownBy(() -> details.checkStudyStatus()); + assertThatThrownBy(details::checkStudyStatus) + .isInstanceOf(InvalidParticipationStudyException.class); } } diff --git a/backend/src/test/java/com/woowacourse/moamoa/study/domain/ParticipantsTest.java b/backend/src/test/java/com/woowacourse/moamoa/study/domain/ParticipantsTest.java index 6c9dc6cfb..441fae3d3 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/study/domain/ParticipantsTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/study/domain/ParticipantsTest.java @@ -4,6 +4,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import com.woowacourse.moamoa.study.service.exception.InvalidParticipationStudyException; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -21,7 +22,8 @@ class ParticipantsTest { public void checkParticipatingAboutOwner() { final Participants participants = new Participants(3, 10, PARTICIPANTS, 1L); - assertThatThrownBy(() -> participants.checkParticipating(1L)); + assertThatThrownBy(() -> participants.checkParticipating(1L)) + .isInstanceOf(InvalidParticipationStudyException.class); } @DisplayName("이미 참여한 회원은 참여 여부 검사 시에 예외가 발생한다.") @@ -29,7 +31,8 @@ public void checkParticipatingAboutOwner() { public void checkAlreadyParticipating() { final Participants participants = new Participants(3, 10, PARTICIPANTS, 1L); - assertThatThrownBy(() -> participants.checkParticipating(2L)); + assertThatThrownBy(() -> participants.checkParticipating(2L)) + .isInstanceOf(InvalidParticipationStudyException.class); } @DisplayName("스터디 회원 수가 꽉 차지 않은 경우 정상적으로 가입이 된다.") @@ -45,7 +48,8 @@ public void checkStudyMemberCountLessThanMaxCount() { public void checkStudyMemberCount() { final Participants participants = new Participants(3, 3, PARTICIPANTS, 1L); - assertThatThrownBy(() -> participants.checkParticipating(4L)); + assertThatThrownBy(() -> participants.checkParticipating(4L)) + .isInstanceOf(InvalidParticipationStudyException.class); } @DisplayName("스터디 참여 이후에는 현재 스터디원 수가 증가한다.") @@ -56,6 +60,7 @@ public void IncreaseCurrentMemberCount() { participants.participate(new Participant(4L)); assertThat(participants.getCurrentMemberSize()).isEqualTo(4); - assertThatThrownBy(() -> participants.checkParticipating(4L)); + assertThatThrownBy(() -> participants.checkParticipating(4L)) + .isInstanceOf(InvalidParticipationStudyException.class); } } From e482a95f51d062c2b06ccb8f9a63f3e3fb308242 Mon Sep 17 00:00:00 2001 From: Donggyu Date: Thu, 28 Jul 2022 11:36:24 +0900 Subject: [PATCH 17/28] =?UTF-8?q?refactor:=20`isAlreadyParticipation`=20?= =?UTF-8?q?=EB=A9=94=EC=86=8C=EB=93=9C=20=EB=82=B4=EB=B6=80=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EB=A9=94=EC=86=8C=EB=93=9C=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../woowacourse/moamoa/study/domain/Participants.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Participants.java b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Participants.java index 665192e34..a682cc756 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Participants.java +++ b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Participants.java @@ -71,7 +71,15 @@ private boolean isInvalidMemberSize() { private boolean isAlreadyParticipation(final Long memberId) { final Participant participant = new Participant(memberId); - return Objects.equals(memberId, ownerId) || participants.contains(participant); + return isOwner(memberId) || isParticipant(participant); + } + + private boolean isOwner(final Long memberId) { + return Objects.equals(memberId, ownerId); + } + + private boolean isParticipant(final Participant participant) { + return participants.contains(participant); } @Override From f7f8bd361240e9cc8e98fc6e6eee21f3246868a7 Mon Sep 17 00:00:00 2001 From: Donggyu Date: Thu, 28 Jul 2022 11:38:48 +0900 Subject: [PATCH 18/28] =?UTF-8?q?refactor:=20=EC=9D=98=EB=AF=B8=EA=B0=80?= =?UTF-8?q?=20=EB=B6=84=EB=AA=85=ED=95=9C=20=EB=84=A4=EC=9D=B4=EB=B0=8D?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/woowacourse/moamoa/study/domain/Details.java | 2 +- .../main/java/com/woowacourse/moamoa/study/domain/Study.java | 2 +- .../java/com/woowacourse/moamoa/study/domain/DetailsTest.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Details.java b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Details.java index dfbac8a03..4f3f620f7 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Details.java +++ b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Details.java @@ -38,7 +38,7 @@ public Details(final String title, final String excerpt, final String thumbnail, this.description = description; } - protected void checkStudyStatus() { + protected void checkClosingRecruitment() { if (status.equals(CLOSE)) { throw new InvalidParticipationStudyException(); } diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Study.java b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Study.java index 3660519b3..e1448c3a8 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Study.java +++ b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Study.java @@ -65,7 +65,7 @@ public void participate(final Member member) { } private void checkStudyParticipating(Long memberId) { - details.checkStudyStatus(); + details.checkClosingRecruitment(); period.checkParticipatingPeriod(); participants.checkParticipating(memberId); } diff --git a/backend/src/test/java/com/woowacourse/moamoa/study/domain/DetailsTest.java b/backend/src/test/java/com/woowacourse/moamoa/study/domain/DetailsTest.java index ce4c395ac..6e9400237 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/study/domain/DetailsTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/study/domain/DetailsTest.java @@ -15,7 +15,7 @@ class DetailsTest { public void checkStudyStatus() { final Details details = new Details("title", "excerpt", "thumbnail", CLOSE, "description"); - assertThatThrownBy(details::checkStudyStatus) + assertThatThrownBy(details::checkClosingRecruitment) .isInstanceOf(InvalidParticipationStudyException.class); } } From 58224710268497c16f23cbff7e7947f02255b2e6 Mon Sep 17 00:00:00 2001 From: Donggyu Date: Thu, 28 Jul 2022 11:39:28 +0900 Subject: [PATCH 19/28] =?UTF-8?q?fix:=20=EC=B0=B8=EC=97=AC=EC=9E=90?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EB=B0=A9=EC=9E=A5=EC=9D=80=20=EC=A0=9C?= =?UTF-8?q?=EC=99=B8=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/woowacourse/moamoa/study/domain/Participants.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Participants.java b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Participants.java index a682cc756..2c5863770 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Participants.java +++ b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Participants.java @@ -47,7 +47,7 @@ public List getParticipants() { } public static Participants createByMaxSizeAndOwnerId(final Integer maxSize, Long ownerId) { - return new Participants(1, maxSize, new HashSet<>(List.of(new Participant(ownerId))), ownerId); + return new Participants(1, maxSize, new HashSet<>(), ownerId); } protected void participate(final Participant participant) { From 78aafb4d34a9fb20632a5b16815062e478757756 Mon Sep 17 00:00:00 2001 From: Donggyu Date: Thu, 28 Jul 2022 11:44:35 +0900 Subject: [PATCH 20/28] =?UTF-8?q?fix:=20=EC=B0=B8=EC=97=AC=EC=9E=90?= =?UTF-8?q?=EC=88=98=EB=A5=BC=20=ED=99=95=EC=9D=B8=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../woowacourse/moamoa/study/service/StudyServiceTest.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/backend/src/test/java/com/woowacourse/moamoa/study/service/StudyServiceTest.java b/backend/src/test/java/com/woowacourse/moamoa/study/service/StudyServiceTest.java index 1aca75cd7..6c490453c 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/study/service/StudyServiceTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/study/service/StudyServiceTest.java @@ -82,9 +82,7 @@ public void participantStudy() { // then final Study result = studyRepository.findById(foundStudy.getId()).get(); - assertThat(result.getParticipants().getParticipants().size()).isEqualTo(2); + assertThat(result.getParticipants().getCurrentMemberSize()).isEqualTo(2); assertThat(result.getParticipants().getParticipants().contains(new Participant(2L))).isTrue(); } } - - From 574b6ad37d3233598b58a7ca1e0f5dc48c1ff08f Mon Sep 17 00:00:00 2001 From: Donggyu Date: Thu, 28 Jul 2022 11:56:36 +0900 Subject: [PATCH 21/28] =?UTF-8?q?refactor:=20checkParticipating=20?= =?UTF-8?q?=EC=BA=A1=EC=8A=90=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../moamoa/study/domain/Participants.java | 11 ++++++----- .../woowacourse/moamoa/study/domain/Study.java | 5 ++--- .../moamoa/study/domain/ParticipantsTest.java | 17 +++++++++++------ 3 files changed, 19 insertions(+), 14 deletions(-) diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Participants.java b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Participants.java index 2c5863770..b36c9bbba 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Participants.java +++ b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Participants.java @@ -50,16 +50,17 @@ public static Participants createByMaxSizeAndOwnerId(final Integer maxSize, Long return new Participants(1, maxSize, new HashSet<>(), ownerId); } + public int getCurrentMemberSize() { + return size; + } + protected void participate(final Participant participant) { + checkParticipating(participant.getMemberId()); participants.add(participant); this.size = this.size + 1; } - public int getCurrentMemberSize() { - return size; - } - - protected void checkParticipating(Long memberId) { + private void checkParticipating(Long memberId) { if (isInvalidMemberSize() || isAlreadyParticipation(memberId)) { throw new InvalidParticipationStudyException(); } diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Study.java b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Study.java index e1448c3a8..2d0fccb05 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Study.java +++ b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Study.java @@ -58,16 +58,15 @@ public Study(final Long id, final Details details, final Participants participan } public void participate(final Member member) { - checkStudyParticipating(member.getId()); + checkStudyParticipating(); final Participant participant = new Participant(member.getId()); participants.participate(participant); } - private void checkStudyParticipating(Long memberId) { + private void checkStudyParticipating() { details.checkClosingRecruitment(); period.checkParticipatingPeriod(); - participants.checkParticipating(memberId); } private void validatePeriod(final Period period) { diff --git a/backend/src/test/java/com/woowacourse/moamoa/study/domain/ParticipantsTest.java b/backend/src/test/java/com/woowacourse/moamoa/study/domain/ParticipantsTest.java index 441fae3d3..99715e509 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/study/domain/ParticipantsTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/study/domain/ParticipantsTest.java @@ -22,7 +22,8 @@ class ParticipantsTest { public void checkParticipatingAboutOwner() { final Participants participants = new Participants(3, 10, PARTICIPANTS, 1L); - assertThatThrownBy(() -> participants.checkParticipating(1L)) + final Participant participant = new Participant(1L); + assertThatThrownBy(() -> participants.participate(participant)) .isInstanceOf(InvalidParticipationStudyException.class); } @@ -31,7 +32,8 @@ public void checkParticipatingAboutOwner() { public void checkAlreadyParticipating() { final Participants participants = new Participants(3, 10, PARTICIPANTS, 1L); - assertThatThrownBy(() -> participants.checkParticipating(2L)) + final Participant participant = new Participant(2L); + assertThatThrownBy(() -> participants.participate(participant)) .isInstanceOf(InvalidParticipationStudyException.class); } @@ -40,7 +42,8 @@ public void checkAlreadyParticipating() { public void checkStudyMemberCountLessThanMaxCount() { final Participants participants = new Participants(3, 4, PARTICIPANTS, 1L); - assertDoesNotThrow(() -> participants.checkParticipating(4L)); + final Participant participant = new Participant(4L); + assertDoesNotThrow(() -> participants.participate(participant)); } @DisplayName("스터디 회원 수가 꽉 찬 경우 예외가 발생한다.") @@ -48,7 +51,8 @@ public void checkStudyMemberCountLessThanMaxCount() { public void checkStudyMemberCount() { final Participants participants = new Participants(3, 3, PARTICIPANTS, 1L); - assertThatThrownBy(() -> participants.checkParticipating(4L)) + final Participant participant = new Participant(4L); + assertThatThrownBy(() -> participants.participate(participant)) .isInstanceOf(InvalidParticipationStudyException.class); } @@ -56,11 +60,12 @@ public void checkStudyMemberCount() { @Test public void IncreaseCurrentMemberCount() { final Participants participants = new Participants(3, 4, PARTICIPANTS, 1L); + final Participant participant = new Participant(4L); - participants.participate(new Participant(4L)); + participants.participate(participant); assertThat(participants.getCurrentMemberSize()).isEqualTo(4); - assertThatThrownBy(() -> participants.checkParticipating(4L)) + assertThatThrownBy(() -> participants.participate(participant)) .isInstanceOf(InvalidParticipationStudyException.class); } } From 6d34aeeb92823391dbff63ede0bc0fed8ea93507 Mon Sep 17 00:00:00 2001 From: Donggyu Date: Thu, 28 Jul 2022 12:02:36 +0900 Subject: [PATCH 22/28] =?UTF-8?q?refactor:=20=EC=8A=A4=ED=84=B0=EB=94=94?= =?UTF-8?q?=20=EC=B0=B8=EC=97=AC=20=EA=B2=80=EC=A6=9D=20=EB=A1=9C=EC=A7=81?= =?UTF-8?q?=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../moamoa/study/domain/Details.java | 7 ++---- .../moamoa/study/domain/Participants.java | 11 ++++++++-- .../moamoa/study/domain/Period.java | 7 ++---- .../moamoa/study/domain/Study.java | 9 ++++---- .../moamoa/study/domain/DetailsTest.java | 6 ++--- .../moamoa/study/domain/ParticipantsTest.java | 22 ++++++++++++------- .../moamoa/study/domain/PeriodTest.java | 4 ++-- 7 files changed, 36 insertions(+), 30 deletions(-) diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Details.java b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Details.java index 4f3f620f7..9b24c4583 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Details.java +++ b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Details.java @@ -2,7 +2,6 @@ import static lombok.AccessLevel.PROTECTED; -import com.woowacourse.moamoa.study.service.exception.InvalidParticipationStudyException; import java.util.Objects; import javax.persistence.Column; import javax.persistence.Embeddable; @@ -38,10 +37,8 @@ public Details(final String title, final String excerpt, final String thumbnail, this.description = description; } - protected void checkClosingRecruitment() { - if (status.equals(CLOSE)) { - throw new InvalidParticipationStudyException(); - } + public boolean isCloseStatus() { + return status.equals(CLOSE); } @Override diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Participants.java b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Participants.java index b36c9bbba..15450e0c8 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Participants.java +++ b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Participants.java @@ -56,8 +56,13 @@ public int getCurrentMemberSize() { protected void participate(final Participant participant) { checkParticipating(participant.getMemberId()); + participants.add(participant); - this.size = this.size + 1; + increaseCurrentMemberSize(); + } + + private void increaseCurrentMemberSize() { + size = size + 1; } private void checkParticipating(Long memberId) { @@ -72,7 +77,9 @@ private boolean isInvalidMemberSize() { private boolean isAlreadyParticipation(final Long memberId) { final Participant participant = new Participant(memberId); - return isOwner(memberId) || isParticipant(participant); + final boolean b = isOwner(memberId) || isParticipant(participant); + System.out.println("b = " + b); + return b; } private boolean isOwner(final Long memberId) { diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Period.java b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Period.java index c565cb6b7..72b4e2069 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Period.java +++ b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Period.java @@ -1,7 +1,6 @@ package com.woowacourse.moamoa.study.domain; import com.woowacourse.moamoa.study.domain.exception.InvalidPeriodException; -import com.woowacourse.moamoa.study.service.exception.InvalidParticipationStudyException; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.Objects; @@ -35,10 +34,8 @@ public boolean isBefore(final LocalDateTime createAt) { createAt.toLocalDate())); } - protected void checkParticipatingPeriod() { - if (enrollmentEndDate != null && enrollmentEndDate.isBefore(LocalDate.now())) { - throw new InvalidParticipationStudyException(); - } + public boolean isCloseEnrollment() { + return enrollmentEndDate != null && enrollmentEndDate.isBefore(LocalDate.now()); } @Override diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Study.java b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Study.java index 2d0fccb05..e7ba4d340 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Study.java +++ b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Study.java @@ -5,6 +5,7 @@ import com.woowacourse.moamoa.member.domain.Member; import com.woowacourse.moamoa.study.domain.exception.InvalidPeriodException; +import com.woowacourse.moamoa.study.service.exception.InvalidParticipationStudyException; import java.time.LocalDateTime; import javax.persistence.Column; import javax.persistence.Embedded; @@ -60,13 +61,13 @@ public Study(final Long id, final Details details, final Participants participan public void participate(final Member member) { checkStudyParticipating(); - final Participant participant = new Participant(member.getId()); - participants.participate(participant); + participants.participate(new Participant(member.getId())); } private void checkStudyParticipating() { - details.checkClosingRecruitment(); - period.checkParticipatingPeriod(); + if (details.isCloseStatus() || period.isCloseEnrollment()) { + throw new InvalidParticipationStudyException(); + } } private void validatePeriod(final Period period) { diff --git a/backend/src/test/java/com/woowacourse/moamoa/study/domain/DetailsTest.java b/backend/src/test/java/com/woowacourse/moamoa/study/domain/DetailsTest.java index 6e9400237..696cfde5f 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/study/domain/DetailsTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/study/domain/DetailsTest.java @@ -1,8 +1,7 @@ package com.woowacourse.moamoa.study.domain; -import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.assertj.core.api.Assertions.assertThat; -import com.woowacourse.moamoa.study.service.exception.InvalidParticipationStudyException; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -15,7 +14,6 @@ class DetailsTest { public void checkStudyStatus() { final Details details = new Details("title", "excerpt", "thumbnail", CLOSE, "description"); - assertThatThrownBy(details::checkClosingRecruitment) - .isInstanceOf(InvalidParticipationStudyException.class); + assertThat(details.isCloseStatus()).isTrue(); } } diff --git a/backend/src/test/java/com/woowacourse/moamoa/study/domain/ParticipantsTest.java b/backend/src/test/java/com/woowacourse/moamoa/study/domain/ParticipantsTest.java index 99715e509..9325c02d3 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/study/domain/ParticipantsTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/study/domain/ParticipantsTest.java @@ -8,19 +8,25 @@ import java.util.HashSet; import java.util.List; import java.util.Set; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; class ParticipantsTest { - private static final Set PARTICIPANTS = new HashSet<>( - List.of(new Participant(2L), new Participant(3L)) - ); + private static Set sampleParticipants = new HashSet<>(); + + @BeforeEach + void setUp() { + sampleParticipants = new HashSet<>( + List.of(new Participant(2L), new Participant(3L)) + ); + } @DisplayName("스터디장은 이미 스터디에 참여한 것이므로 검사 시에 예외가 발생한다.") @Test public void checkParticipatingAboutOwner() { - final Participants participants = new Participants(3, 10, PARTICIPANTS, 1L); + final Participants participants = new Participants(3, 10, sampleParticipants, 1L); final Participant participant = new Participant(1L); assertThatThrownBy(() -> participants.participate(participant)) @@ -30,7 +36,7 @@ public void checkParticipatingAboutOwner() { @DisplayName("이미 참여한 회원은 참여 여부 검사 시에 예외가 발생한다.") @Test public void checkAlreadyParticipating() { - final Participants participants = new Participants(3, 10, PARTICIPANTS, 1L); + final Participants participants = new Participants(3, 10, sampleParticipants, 1L); final Participant participant = new Participant(2L); assertThatThrownBy(() -> participants.participate(participant)) @@ -40,7 +46,7 @@ public void checkAlreadyParticipating() { @DisplayName("스터디 회원 수가 꽉 차지 않은 경우 정상적으로 가입이 된다.") @Test public void checkStudyMemberCountLessThanMaxCount() { - final Participants participants = new Participants(3, 4, PARTICIPANTS, 1L); + final Participants participants = new Participants(3, 4, sampleParticipants, 1L); final Participant participant = new Participant(4L); assertDoesNotThrow(() -> participants.participate(participant)); @@ -49,7 +55,7 @@ public void checkStudyMemberCountLessThanMaxCount() { @DisplayName("스터디 회원 수가 꽉 찬 경우 예외가 발생한다.") @Test public void checkStudyMemberCount() { - final Participants participants = new Participants(3, 3, PARTICIPANTS, 1L); + final Participants participants = new Participants(3, 3, sampleParticipants, 1L); final Participant participant = new Participant(4L); assertThatThrownBy(() -> participants.participate(participant)) @@ -59,7 +65,7 @@ public void checkStudyMemberCount() { @DisplayName("스터디 참여 이후에는 현재 스터디원 수가 증가한다.") @Test public void IncreaseCurrentMemberCount() { - final Participants participants = new Participants(3, 4, PARTICIPANTS, 1L); + final Participants participants = new Participants(3, 4, sampleParticipants, 1L); final Participant participant = new Participant(4L); participants.participate(participant); diff --git a/backend/src/test/java/com/woowacourse/moamoa/study/domain/PeriodTest.java b/backend/src/test/java/com/woowacourse/moamoa/study/domain/PeriodTest.java index 4cdaa483e..b07b20670 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/study/domain/PeriodTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/study/domain/PeriodTest.java @@ -1,12 +1,12 @@ package com.woowacourse.moamoa.study.domain; +import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatNoException; import static org.assertj.core.api.Assertions.assertThatThrownBy; import com.woowacourse.moamoa.study.domain.exception.InvalidPeriodException; import java.time.LocalDate; import java.util.stream.Stream; -import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -58,6 +58,6 @@ public void checkParticipatingPeriod() { final Period period = new Period(enrollmentEndDate, startDate, endDate); - Assertions.assertDoesNotThrow(period::checkParticipatingPeriod); + assertThat(period.isCloseEnrollment()).isFalse(); } } From 8786486243f32435d682c0dbb80bb00b39960451 Mon Sep 17 00:00:00 2001 From: Donggyu Date: Thu, 28 Jul 2022 12:18:08 +0900 Subject: [PATCH 23/28] =?UTF-8?q?test:=20=EC=8A=A4=ED=84=B0=EB=94=94?= =?UTF-8?q?=EC=9E=A5=EC=9D=80=20=EC=8A=A4=ED=84=B0=EB=94=94=EC=97=90=20?= =?UTF-8?q?=EC=B0=B8=EC=97=AC=ED=95=A0=20=EC=88=98=20=EC=97=86=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../study/ParticipationStudyAcceptanceTest.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/backend/src/test/java/com/woowacourse/acceptance/study/ParticipationStudyAcceptanceTest.java b/backend/src/test/java/com/woowacourse/acceptance/study/ParticipationStudyAcceptanceTest.java index fd45eeee6..a0cf35542 100644 --- a/backend/src/test/java/com/woowacourse/acceptance/study/ParticipationStudyAcceptanceTest.java +++ b/backend/src/test/java/com/woowacourse/acceptance/study/ParticipationStudyAcceptanceTest.java @@ -129,4 +129,19 @@ public void participateFullStudy() { .then().log().all() .statusCode(HttpStatus.BAD_REQUEST.value()); } + + @DisplayName("스터디장(owner)은 스터디에 참여할 수 없다.") + @Test + public void participateOwner() { + final String jwtToken = getBearerTokenBySignInOrUp( + new GithubProfileResponse(2L, "greenlawn", "https://image", "github.com")); + + RestAssured.given().log().all() + .header(CONTENT_TYPE, APPLICATION_JSON_VALUE) + .header(AUTHORIZATION, jwtToken) + .when().log().all() + .post("/api/studies/1") + .then().log().all() + .statusCode(HttpStatus.BAD_REQUEST.value()); + } } From d9c0b25f917d3bd6338159341c7f1c303c4940c8 Mon Sep 17 00:00:00 2001 From: Donggyu Date: Fri, 29 Jul 2022 09:37:48 +0900 Subject: [PATCH 24/28] =?UTF-8?q?refactor:=20Study=20=EC=B6=94=EC=83=81?= =?UTF-8?q?=ED=99=94=20=EB=B0=8F=20=EC=98=88=EC=99=B8=20=EB=84=A4=EC=9D=B4?= =?UTF-8?q?=EB=B0=8D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/advice/CommonControllerAdvice.java | 4 +- .../moamoa/study/domain/Participants.java | 19 ++------- .../moamoa/study/domain/Period.java | 39 ++++++++++--------- .../moamoa/study/domain/Study.java | 23 +++++------ .../FailureParticipationException.java | 8 ++++ .../InvalidParticipationStudyException.java | 8 ---- .../moamoa/study/domain/ParticipantsTest.java | 21 +++------- 7 files changed, 49 insertions(+), 73 deletions(-) create mode 100644 backend/src/main/java/com/woowacourse/moamoa/study/service/exception/FailureParticipationException.java delete mode 100644 backend/src/main/java/com/woowacourse/moamoa/study/service/exception/InvalidParticipationStudyException.java diff --git a/backend/src/main/java/com/woowacourse/moamoa/common/advice/CommonControllerAdvice.java b/backend/src/main/java/com/woowacourse/moamoa/common/advice/CommonControllerAdvice.java index 938c1c15d..af3828776 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/common/advice/CommonControllerAdvice.java +++ b/backend/src/main/java/com/woowacourse/moamoa/common/advice/CommonControllerAdvice.java @@ -6,7 +6,7 @@ import com.woowacourse.moamoa.common.exception.InvalidFormatException; import com.woowacourse.moamoa.common.exception.UnauthorizedException; import com.woowacourse.moamoa.study.domain.exception.InvalidPeriodException; -import com.woowacourse.moamoa.study.service.exception.InvalidParticipationStudyException; +import com.woowacourse.moamoa.study.service.exception.FailureParticipationException; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; @@ -17,7 +17,7 @@ public class CommonControllerAdvice { @ExceptionHandler({ InvalidFormatException.class, InvalidPeriodException.class, - InvalidParticipationStudyException.class + FailureParticipationException.class }) public ResponseEntity handleBadRequest(final Exception e) { return ResponseEntity.badRequest().body(new ErrorResponse(e.getMessage())); diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Participants.java b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Participants.java index 15450e0c8..63a3ec824 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Participants.java +++ b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Participants.java @@ -2,7 +2,6 @@ import static lombok.AccessLevel.PROTECTED; -import com.woowacourse.moamoa.study.service.exception.InvalidParticipationStudyException; import java.util.ArrayList; import java.util.HashSet; import java.util.List; @@ -54,21 +53,13 @@ public int getCurrentMemberSize() { return size; } - protected void participate(final Participant participant) { - checkParticipating(participant.getMemberId()); - + void participate(final Participant participant) { participants.add(participant); - increaseCurrentMemberSize(); - } - - private void increaseCurrentMemberSize() { size = size + 1; } - private void checkParticipating(Long memberId) { - if (isInvalidMemberSize() || isAlreadyParticipation(memberId)) { - throw new InvalidParticipationStudyException(); - } + boolean isImpossibleParticipation(Long memberId) { + return isInvalidMemberSize() || isAlreadyParticipation(memberId); } private boolean isInvalidMemberSize() { @@ -77,9 +68,7 @@ private boolean isInvalidMemberSize() { private boolean isAlreadyParticipation(final Long memberId) { final Participant participant = new Participant(memberId); - final boolean b = isOwner(memberId) || isParticipant(participant); - System.out.println("b = " + b); - return b; + return isOwner(memberId) || isParticipant(participant); } private boolean isOwner(final Long memberId) { diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Period.java b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Period.java index 72b4e2069..4801392b1 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Period.java +++ b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Period.java @@ -1,5 +1,7 @@ package com.woowacourse.moamoa.study.domain; +import static lombok.AccessLevel.PROTECTED; + import com.woowacourse.moamoa.study.domain.exception.InvalidPeriodException; import java.time.LocalDate; import java.time.LocalDateTime; @@ -7,9 +9,11 @@ import javax.persistence.Column; import javax.persistence.Embeddable; import lombok.Getter; +import lombok.NoArgsConstructor; @Embeddable @Getter +@NoArgsConstructor(access = PROTECTED) public class Period { private LocalDate enrollmentEndDate; @@ -19,9 +23,6 @@ public class Period { private LocalDate endDate; - public Period() { - } - public Period(final LocalDate enrollmentEndDate, final LocalDate startDate, final LocalDate endDate) { validatePeriod(enrollmentEndDate, startDate, endDate); this.enrollmentEndDate = enrollmentEndDate; @@ -29,12 +30,26 @@ public Period(final LocalDate enrollmentEndDate, final LocalDate startDate, fina this.endDate = endDate; } - public boolean isBefore(final LocalDateTime createAt) { + private void validatePeriod(final LocalDate enrollmentEndDate, final LocalDate startDate, final LocalDate endDate) { + if (isImproperStudyDate(startDate, endDate) || isImproperEnrollmentEndDate(enrollmentEndDate, endDate)) { + throw new InvalidPeriodException(); + } + } + + private boolean isImproperStudyDate(final LocalDate startDate, final LocalDate endDate) { + return endDate != null && startDate.isAfter(endDate); + } + + private boolean isImproperEnrollmentEndDate(final LocalDate enrollmentEndDate, final LocalDate endDate) { + return enrollmentEndDate != null && endDate != null && enrollmentEndDate.isAfter(endDate); + } + + boolean isBefore(final LocalDateTime createAt) { return startDate.isBefore(createAt.toLocalDate()) || (enrollmentEndDate != null && enrollmentEndDate.isBefore( createAt.toLocalDate())); } - public boolean isCloseEnrollment() { + boolean isCloseEnrollment() { return enrollmentEndDate != null && enrollmentEndDate.isBefore(LocalDate.now()); } @@ -55,18 +70,4 @@ public boolean equals(final Object o) { public int hashCode() { return Objects.hash(enrollmentEndDate, startDate, endDate); } - - private void validatePeriod(final LocalDate enrollmentEndDate, final LocalDate startDate, final LocalDate endDate) { - if (isImproperStudyDate(startDate, endDate) || isImproperEnrollmentEndDate(enrollmentEndDate, endDate)) { - throw new InvalidPeriodException(); - } - } - - private boolean isImproperStudyDate(final LocalDate startDate, final LocalDate endDate) { - return endDate != null && startDate.isAfter(endDate); - } - - private boolean isImproperEnrollmentEndDate(final LocalDate enrollmentEndDate, final LocalDate endDate) { - return enrollmentEndDate != null && endDate != null && enrollmentEndDate.isAfter(endDate); - } } diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Study.java b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Study.java index e7ba4d340..70022070e 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Study.java +++ b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Study.java @@ -5,7 +5,7 @@ import com.woowacourse.moamoa.member.domain.Member; import com.woowacourse.moamoa.study.domain.exception.InvalidPeriodException; -import com.woowacourse.moamoa.study.service.exception.InvalidParticipationStudyException; +import com.woowacourse.moamoa.study.service.exception.FailureParticipationException; import java.time.LocalDateTime; import javax.persistence.Column; import javax.persistence.Embedded; @@ -58,21 +58,18 @@ public Study(final Long id, final Details details, final Participants participan validatePeriod(period); } - public void participate(final Member member) { - checkStudyParticipating(); - - participants.participate(new Participant(member.getId())); - } - - private void checkStudyParticipating() { - if (details.isCloseStatus() || period.isCloseEnrollment()) { - throw new InvalidParticipationStudyException(); - } - } - private void validatePeriod(final Period period) { if (period.isBefore(createdAt)) { throw new InvalidPeriodException(); } } + + public void participate(final Member member) { + final Long memberId = member.getId(); + if (details.isCloseStatus() || period.isCloseEnrollment() || participants.isImpossibleParticipation(memberId)) { + throw new FailureParticipationException(); + } + + participants.participate(new Participant(memberId)); + } } diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/service/exception/FailureParticipationException.java b/backend/src/main/java/com/woowacourse/moamoa/study/service/exception/FailureParticipationException.java new file mode 100644 index 000000000..69638f7e7 --- /dev/null +++ b/backend/src/main/java/com/woowacourse/moamoa/study/service/exception/FailureParticipationException.java @@ -0,0 +1,8 @@ +package com.woowacourse.moamoa.study.service.exception; + +public class FailureParticipationException extends RuntimeException { + + public FailureParticipationException() { + super("스터디 가입이 불가능합니다."); + } +} diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/service/exception/InvalidParticipationStudyException.java b/backend/src/main/java/com/woowacourse/moamoa/study/service/exception/InvalidParticipationStudyException.java deleted file mode 100644 index 0bb32bf2a..000000000 --- a/backend/src/main/java/com/woowacourse/moamoa/study/service/exception/InvalidParticipationStudyException.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.woowacourse.moamoa.study.service.exception; - -public class InvalidParticipationStudyException extends RuntimeException { - - public InvalidParticipationStudyException() { - super("스터디 가입이 불가능합니다."); - } -} diff --git a/backend/src/test/java/com/woowacourse/moamoa/study/domain/ParticipantsTest.java b/backend/src/test/java/com/woowacourse/moamoa/study/domain/ParticipantsTest.java index 9325c02d3..e142e50c8 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/study/domain/ParticipantsTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/study/domain/ParticipantsTest.java @@ -1,10 +1,7 @@ package com.woowacourse.moamoa.study.domain; import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; -import com.woowacourse.moamoa.study.service.exception.InvalidParticipationStudyException; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -28,9 +25,7 @@ void setUp() { public void checkParticipatingAboutOwner() { final Participants participants = new Participants(3, 10, sampleParticipants, 1L); - final Participant participant = new Participant(1L); - assertThatThrownBy(() -> participants.participate(participant)) - .isInstanceOf(InvalidParticipationStudyException.class); + assertThat(participants.isImpossibleParticipation(1L)).isTrue(); } @DisplayName("이미 참여한 회원은 참여 여부 검사 시에 예외가 발생한다.") @@ -38,9 +33,7 @@ public void checkParticipatingAboutOwner() { public void checkAlreadyParticipating() { final Participants participants = new Participants(3, 10, sampleParticipants, 1L); - final Participant participant = new Participant(2L); - assertThatThrownBy(() -> participants.participate(participant)) - .isInstanceOf(InvalidParticipationStudyException.class); + assertThat(participants.isImpossibleParticipation(2L)).isTrue(); } @DisplayName("스터디 회원 수가 꽉 차지 않은 경우 정상적으로 가입이 된다.") @@ -48,8 +41,7 @@ public void checkAlreadyParticipating() { public void checkStudyMemberCountLessThanMaxCount() { final Participants participants = new Participants(3, 4, sampleParticipants, 1L); - final Participant participant = new Participant(4L); - assertDoesNotThrow(() -> participants.participate(participant)); + assertThat(participants.isImpossibleParticipation(4L)).isFalse(); } @DisplayName("스터디 회원 수가 꽉 찬 경우 예외가 발생한다.") @@ -57,9 +49,7 @@ public void checkStudyMemberCountLessThanMaxCount() { public void checkStudyMemberCount() { final Participants participants = new Participants(3, 3, sampleParticipants, 1L); - final Participant participant = new Participant(4L); - assertThatThrownBy(() -> participants.participate(participant)) - .isInstanceOf(InvalidParticipationStudyException.class); + assertThat(participants.isImpossibleParticipation(4L)).isTrue(); } @DisplayName("스터디 참여 이후에는 현재 스터디원 수가 증가한다.") @@ -71,7 +61,6 @@ public void IncreaseCurrentMemberCount() { participants.participate(participant); assertThat(participants.getCurrentMemberSize()).isEqualTo(4); - assertThatThrownBy(() -> participants.participate(participant)) - .isInstanceOf(InvalidParticipationStudyException.class); + assertThat(participants.isImpossibleParticipation(4L)).isTrue(); } } From eed9d4ed93154b21eb15e362bc2f3a410e222010 Mon Sep 17 00:00:00 2001 From: Donggyu Date: Fri, 29 Jul 2022 09:54:37 +0900 Subject: [PATCH 25/28] =?UTF-8?q?refactor:=20Boolean=20=EB=84=A4=EC=9D=B4?= =?UTF-8?q?=EB=B0=8D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/woowacourse/moamoa/study/domain/Participants.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Participants.java b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Participants.java index 63a3ec824..a81af8598 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Participants.java +++ b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Participants.java @@ -68,14 +68,14 @@ private boolean isInvalidMemberSize() { private boolean isAlreadyParticipation(final Long memberId) { final Participant participant = new Participant(memberId); - return isOwner(memberId) || isParticipant(participant); + return isOwner(memberId) || isParticipated(participant); } private boolean isOwner(final Long memberId) { return Objects.equals(memberId, ownerId); } - private boolean isParticipant(final Participant participant) { + private boolean isParticipated(final Participant participant) { return participants.contains(participant); } From 48758182c07714b5ff2f51f39d6b27eb4a3ddf86 Mon Sep 17 00:00:00 2001 From: Donggyu Date: Fri, 29 Jul 2022 13:17:37 +0900 Subject: [PATCH 26/28] =?UTF-8?q?refactor:=20=EB=A9=94=EC=86=8C=EB=93=9C?= =?UTF-8?q?=EB=AA=85=20=EB=8F=99=EC=82=AC=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../woowacourse/moamoa/study/controller/StudyController.java | 2 +- .../java/com/woowacourse/moamoa/study/service/StudyService.java | 2 +- .../com/woowacourse/moamoa/study/service/StudyServiceTest.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/controller/StudyController.java b/backend/src/main/java/com/woowacourse/moamoa/study/controller/StudyController.java index bb34fa317..af85f87a3 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/study/controller/StudyController.java +++ b/backend/src/main/java/com/woowacourse/moamoa/study/controller/StudyController.java @@ -34,7 +34,7 @@ public ResponseEntity createStudy( public ResponseEntity participateStudy(@AuthenticationPrincipal final Long githubId, @PathVariable("study-id") final Long studyId ) { - studyService.participantStudy(githubId, studyId); + studyService.participateStudy(githubId, studyId); return ResponseEntity.ok().build(); } } diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/service/StudyService.java b/backend/src/main/java/com/woowacourse/moamoa/study/service/StudyService.java index 64139e4ae..4ddd98b1e 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/study/service/StudyService.java +++ b/backend/src/main/java/com/woowacourse/moamoa/study/service/StudyService.java @@ -34,7 +34,7 @@ public Study createStudy(final Long githubId, final CreatingStudyRequest request return studyRepository.save(new Study(details, participants, period, attachedTags)); } - public void participantStudy(final Long githubId, final Long studyId) { + public void participateStudy(final Long githubId, final Long studyId) { final Member member = findMemberBy(githubId); final Study study = findStudyBy(studyId); diff --git a/backend/src/test/java/com/woowacourse/moamoa/study/service/StudyServiceTest.java b/backend/src/test/java/com/woowacourse/moamoa/study/service/StudyServiceTest.java index 6c490453c..63e6ca985 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/study/service/StudyServiceTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/study/service/StudyServiceTest.java @@ -77,7 +77,7 @@ public void participantStudy() { final Study foundStudy = studyRepository.findById(createdStudy.getId()).get(); final Member participant = memberRepository.findByGithubId(2L).get(); - studyService.participantStudy(participant.getGithubId(), foundStudy.getId()); + studyService.participateStudy(participant.getGithubId(), foundStudy.getId()); entityManager.flush(); // then From 7b780366cbeb660780cb4b281dc76ab959feee83 Mon Sep 17 00:00:00 2001 From: Donggyu Date: Fri, 29 Jul 2022 13:23:13 +0900 Subject: [PATCH 27/28] =?UTF-8?q?refactor:=20participate=20=EB=A9=94?= =?UTF-8?q?=EC=86=8C=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/woowacourse/moamoa/member/domain/Member.java | 4 ---- .../main/java/com/woowacourse/moamoa/study/domain/Study.java | 4 +--- .../com/woowacourse/moamoa/study/service/StudyService.java | 2 +- 3 files changed, 2 insertions(+), 8 deletions(-) diff --git a/backend/src/main/java/com/woowacourse/moamoa/member/domain/Member.java b/backend/src/main/java/com/woowacourse/moamoa/member/domain/Member.java index b53b4f445..f526f5fd7 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/member/domain/Member.java +++ b/backend/src/main/java/com/woowacourse/moamoa/member/domain/Member.java @@ -6,10 +6,6 @@ import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; -import com.woowacourse.moamoa.study.domain.Study; -import java.util.ArrayList; -import java.util.List; -import javax.persistence.OneToMany; import lombok.Getter; import lombok.NoArgsConstructor; diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Study.java b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Study.java index 70022070e..9f166bae7 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Study.java +++ b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Study.java @@ -3,7 +3,6 @@ import static javax.persistence.GenerationType.IDENTITY; import static lombok.AccessLevel.PROTECTED; -import com.woowacourse.moamoa.member.domain.Member; import com.woowacourse.moamoa.study.domain.exception.InvalidPeriodException; import com.woowacourse.moamoa.study.service.exception.FailureParticipationException; import java.time.LocalDateTime; @@ -64,8 +63,7 @@ private void validatePeriod(final Period period) { } } - public void participate(final Member member) { - final Long memberId = member.getId(); + public void participate(final Long memberId) { if (details.isCloseStatus() || period.isCloseEnrollment() || participants.isImpossibleParticipation(memberId)) { throw new FailureParticipationException(); } diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/service/StudyService.java b/backend/src/main/java/com/woowacourse/moamoa/study/service/StudyService.java index 4ddd98b1e..e5fbbdd04 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/study/service/StudyService.java +++ b/backend/src/main/java/com/woowacourse/moamoa/study/service/StudyService.java @@ -38,7 +38,7 @@ public void participateStudy(final Long githubId, final Long studyId) { final Member member = findMemberBy(githubId); final Study study = findStudyBy(studyId); - study.participate(member); + study.participate(member.getId()); } private Study findStudyBy(final Long studyId) { From 4dce039de4787e01d4abea3a99dcc754c8d70cf7 Mon Sep 17 00:00:00 2001 From: Donggyu Date: Fri, 29 Jul 2022 13:26:40 +0900 Subject: [PATCH 28/28] =?UTF-8?q?fix:=20=EA=B9=A8=EC=A7=80=EB=8A=94=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/woowacourse/moamoa/study/domain/StudyTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/test/java/com/woowacourse/moamoa/study/domain/StudyTest.java b/backend/src/test/java/com/woowacourse/moamoa/study/domain/StudyTest.java index 583dcb7fd..0d0f7822a 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/study/domain/StudyTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/study/domain/StudyTest.java @@ -66,6 +66,6 @@ public void participate() { final Member participant = new Member(2L, 2L, "username", "image", "profile"); - assertThatCode(() -> study.participate(participant)).doesNotThrowAnyException(); + assertThatCode(() -> study.participate(participant.getId())).doesNotThrowAnyException(); } }