From 9f91e6ccb535d7361addf36064693d42f185bebf Mon Sep 17 00:00:00 2001 From: coli Date: Wed, 23 Jul 2025 19:36:53 +0900 Subject: [PATCH 01/29] =?UTF-8?q?refactor:=20poll=20=EC=97=94=ED=8B=B0?= =?UTF-8?q?=ED=8B=B0=EC=97=90=20=EA=B0=9C=EC=B5=9C=EC=9E=90=20id=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 --- src/main/java/com/debatetimer/entity/poll/PollEntity.java | 7 +++++++ .../resources/db/migration/V11__add_userid_into_poll.sql | 2 ++ 2 files changed, 9 insertions(+) create mode 100644 src/main/resources/db/migration/V11__add_userid_into_poll.sql diff --git a/src/main/java/com/debatetimer/entity/poll/PollEntity.java b/src/main/java/com/debatetimer/entity/poll/PollEntity.java index d4700a3d..339f1cb8 100644 --- a/src/main/java/com/debatetimer/entity/poll/PollEntity.java +++ b/src/main/java/com/debatetimer/entity/poll/PollEntity.java @@ -1,5 +1,6 @@ package com.debatetimer.entity.poll; +import com.debatetimer.domain.poll.Poll; import com.debatetimer.domain.poll.PollStatus; import com.debatetimer.entity.customize.BaseTimeEntity; import jakarta.persistence.Entity; @@ -25,6 +26,8 @@ public class PollEntity extends BaseTimeEntity { private long tableId; + private long userId; + @NotNull @Enumerated(EnumType.STRING) private PollStatus status; @@ -36,4 +39,8 @@ public class PollEntity extends BaseTimeEntity { private String consTeamName; private String agenda; + + public Poll toDomain() { + return new Poll(id, tableId, userId, status, prosTeamName, consTeamName, agenda); + } } diff --git a/src/main/resources/db/migration/V11__add_userid_into_poll.sql b/src/main/resources/db/migration/V11__add_userid_into_poll.sql new file mode 100644 index 00000000..63064ae1 --- /dev/null +++ b/src/main/resources/db/migration/V11__add_userid_into_poll.sql @@ -0,0 +1,2 @@ +ALTER TABLE poll + ADD COLUMN user_id BIGINT NOT NULL From d311049c581180e1fd62e2a222fe55e6e11d8a92 Mon Sep 17 00:00:00 2001 From: coli Date: Wed, 23 Jul 2025 19:37:05 +0900 Subject: [PATCH 02/29] =?UTF-8?q?feat:=20poll=20domain=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/debatetimer/domain/poll/Poll.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 src/main/java/com/debatetimer/domain/poll/Poll.java diff --git a/src/main/java/com/debatetimer/domain/poll/Poll.java b/src/main/java/com/debatetimer/domain/poll/Poll.java new file mode 100644 index 00000000..63399172 --- /dev/null +++ b/src/main/java/com/debatetimer/domain/poll/Poll.java @@ -0,0 +1,22 @@ +package com.debatetimer.domain.poll; + +import com.debatetimer.domain.customize.Agenda; +import com.debatetimer.domain.customize.TeamName; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +public class Poll { + + private final Long id; + private final long tableId; + private final long userId; + private final PollStatus status; + private final TeamName prosTeamName; + private final TeamName consTeamName; + private final Agenda agenda; + + public Poll(Long id, long tableId, long userId, PollStatus status, String prosTeamName, String consTeamName, + String agenda) { + this(id, tableId, userId, status, new TeamName(prosTeamName), new TeamName(consTeamName), new Agenda(agenda)); + } +} From b480dd472aeda3874d7bc16b6e777deabcbf16fb Mon Sep 17 00:00:00 2001 From: coli Date: Wed, 23 Jul 2025 19:48:32 +0900 Subject: [PATCH 03/29] =?UTF-8?q?feat:=20vote=20domain=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/poll/ParticipantName.java | 22 +++++++++++++++++++ .../domain/poll/ParticipateCode.java | 22 +++++++++++++++++++ .../com/debatetimer/domain/poll/Vote.java | 19 ++++++++++++++++ .../debatetimer/entity/poll/PollEntity.java | 2 ++ .../debatetimer/entity/poll/VoteEntity.java | 5 +++++ .../exception/errorcode/ClientErrorCode.java | 4 ++++ 6 files changed, 74 insertions(+) create mode 100644 src/main/java/com/debatetimer/domain/poll/ParticipantName.java create mode 100644 src/main/java/com/debatetimer/domain/poll/ParticipateCode.java create mode 100644 src/main/java/com/debatetimer/domain/poll/Vote.java diff --git a/src/main/java/com/debatetimer/domain/poll/ParticipantName.java b/src/main/java/com/debatetimer/domain/poll/ParticipantName.java new file mode 100644 index 00000000..86c012a2 --- /dev/null +++ b/src/main/java/com/debatetimer/domain/poll/ParticipantName.java @@ -0,0 +1,22 @@ +package com.debatetimer.domain.poll; + +import com.debatetimer.exception.custom.DTClientErrorException; +import com.debatetimer.exception.errorcode.ClientErrorCode; +import lombok.Getter; + +@Getter +public class ParticipantName { + + private final String value; + + public ParticipantName(String value) { + validateName(value); + this.value = value; + } + + private void validateName(String value) { + if (value == null || value.isBlank()) { + throw new DTClientErrorException(ClientErrorCode.INVALID_POLL_PARTICIPANT_NAME); + } + } +} diff --git a/src/main/java/com/debatetimer/domain/poll/ParticipateCode.java b/src/main/java/com/debatetimer/domain/poll/ParticipateCode.java new file mode 100644 index 00000000..29c323a2 --- /dev/null +++ b/src/main/java/com/debatetimer/domain/poll/ParticipateCode.java @@ -0,0 +1,22 @@ +package com.debatetimer.domain.poll; + +import com.debatetimer.exception.custom.DTClientErrorException; +import com.debatetimer.exception.errorcode.ClientErrorCode; +import lombok.Getter; + +@Getter +public class ParticipateCode { + + private final String value; + + public ParticipateCode(String value) { + validateName(value); + this.value = value; + } + + private void validateName(String value) { + if (value == null || value.isBlank()) { + throw new DTClientErrorException(ClientErrorCode.INVALID_POLL_PARTICIPANT_CODE); + } + } +} diff --git a/src/main/java/com/debatetimer/domain/poll/Vote.java b/src/main/java/com/debatetimer/domain/poll/Vote.java new file mode 100644 index 00000000..a69f946a --- /dev/null +++ b/src/main/java/com/debatetimer/domain/poll/Vote.java @@ -0,0 +1,19 @@ +package com.debatetimer.domain.poll; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public class Vote { + + private final Long id; + private final long pollId; + private final VoteTeam team; + private final ParticipantName name; + private final ParticipateCode code; + + public Vote(Long id, long pollId, VoteTeam team, String name, String code) { + this(id, pollId, team, new ParticipantName(name), new ParticipateCode(code)); + } +} diff --git a/src/main/java/com/debatetimer/entity/poll/PollEntity.java b/src/main/java/com/debatetimer/entity/poll/PollEntity.java index 339f1cb8..7abb94fc 100644 --- a/src/main/java/com/debatetimer/entity/poll/PollEntity.java +++ b/src/main/java/com/debatetimer/entity/poll/PollEntity.java @@ -13,9 +13,11 @@ import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import lombok.AccessLevel; +import lombok.Getter; import lombok.NoArgsConstructor; @Entity +@Getter @Table(name = "poll") @NoArgsConstructor(access = AccessLevel.PROTECTED) public class PollEntity extends BaseTimeEntity { diff --git a/src/main/java/com/debatetimer/entity/poll/VoteEntity.java b/src/main/java/com/debatetimer/entity/poll/VoteEntity.java index 9b01e7f4..0d406177 100644 --- a/src/main/java/com/debatetimer/entity/poll/VoteEntity.java +++ b/src/main/java/com/debatetimer/entity/poll/VoteEntity.java @@ -1,5 +1,6 @@ package com.debatetimer.entity.poll; +import com.debatetimer.domain.poll.Vote; import com.debatetimer.domain.poll.VoteTeam; import jakarta.persistence.Entity; import jakarta.persistence.EnumType; @@ -39,4 +40,8 @@ public class VoteEntity { @NotBlank private String participantCode; + + public Vote toDomain() { + return new Vote(id, poll.getId(), team, name, participantCode); + } } diff --git a/src/main/java/com/debatetimer/exception/errorcode/ClientErrorCode.java b/src/main/java/com/debatetimer/exception/errorcode/ClientErrorCode.java index 59eb8cb9..ce52628d 100644 --- a/src/main/java/com/debatetimer/exception/errorcode/ClientErrorCode.java +++ b/src/main/java/com/debatetimer/exception/errorcode/ClientErrorCode.java @@ -48,6 +48,10 @@ public enum ClientErrorCode implements ResponseErrorCode { "토론 주제는 1자 이상 %d자 이하여야 합니다.".formatted(Agenda.AGENDA_MAX_LENGTH) ), + INVALID_POLL_PARTICIPANT_NAME(HttpStatus.BAD_REQUEST, "잘못된 투표자 이름입니다"), + INVALID_POLL_PARTICIPANT_CODE(HttpStatus.BAD_REQUEST, "잘못된 투표참여 코드입니다"), + + TABLE_NOT_FOUND(HttpStatus.NOT_FOUND, "토론 테이블을 찾을 수 없습니다."), NOT_TABLE_OWNER(HttpStatus.UNAUTHORIZED, "테이블을 소유한 회원이 아닙니다."), UNAUTHORIZED_MEMBER(HttpStatus.UNAUTHORIZED, "접근 권한이 없습니다"), From 980798c90435d080c568c316518a29d43f92aa85 Mon Sep 17 00:00:00 2001 From: coli Date: Wed, 23 Jul 2025 19:59:10 +0900 Subject: [PATCH 04/29] =?UTF-8?q?feat:=20controller=20=EA=B3=84=EC=B8=B5?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/poll/PollController.java | 46 +++++++++++++++++++ .../dto/poll/response/PollCreateResponse.java | 5 ++ .../dto/poll/response/PollInfoResponse.java | 15 ++++++ 3 files changed, 66 insertions(+) create mode 100644 src/main/java/com/debatetimer/controller/poll/PollController.java create mode 100644 src/main/java/com/debatetimer/dto/poll/response/PollCreateResponse.java create mode 100644 src/main/java/com/debatetimer/dto/poll/response/PollInfoResponse.java diff --git a/src/main/java/com/debatetimer/controller/poll/PollController.java b/src/main/java/com/debatetimer/controller/poll/PollController.java new file mode 100644 index 00000000..904ac4ba --- /dev/null +++ b/src/main/java/com/debatetimer/controller/poll/PollController.java @@ -0,0 +1,46 @@ +package com.debatetimer.controller.poll; + +import com.debatetimer.controller.auth.AuthMember; +import com.debatetimer.domain.member.Member; +import com.debatetimer.dto.poll.response.PollCreateResponse; +import com.debatetimer.dto.poll.response.PollInfoResponse; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +public class PollController { + + @PostMapping("/api/polls/{tableId}") + @ResponseStatus(HttpStatus.CREATED) + public PollCreateResponse createPoll( + @AuthMember Member member, + @PathVariable(name = "tableId") long tableId + ) { + return null; + } + + @GetMapping("/api/polls/{pollId}") + @ResponseStatus(HttpStatus.OK) + public PollInfoResponse readPollInfo( + @AuthMember Member member, + @PathVariable(name = "pollId") long pollId + ) { + return null; + } + + @PatchMapping("/api/polls/{pollId}") + @ResponseStatus(HttpStatus.OK) + public PollInfoResponse endPoll( + @AuthMember Member member, + @PathVariable(name = "pollId") long pollId + ) { + return null; + } +} diff --git a/src/main/java/com/debatetimer/dto/poll/response/PollCreateResponse.java b/src/main/java/com/debatetimer/dto/poll/response/PollCreateResponse.java new file mode 100644 index 00000000..e6f065c4 --- /dev/null +++ b/src/main/java/com/debatetimer/dto/poll/response/PollCreateResponse.java @@ -0,0 +1,5 @@ +package com.debatetimer.dto.poll.response; + +public record PollCreateResponse(long id) { + +} diff --git a/src/main/java/com/debatetimer/dto/poll/response/PollInfoResponse.java b/src/main/java/com/debatetimer/dto/poll/response/PollInfoResponse.java new file mode 100644 index 00000000..ae947ba2 --- /dev/null +++ b/src/main/java/com/debatetimer/dto/poll/response/PollInfoResponse.java @@ -0,0 +1,15 @@ +package com.debatetimer.dto.poll.response; + +import com.debatetimer.domain.poll.PollStatus; + +public record PollInfoResponse( + long id, + PollStatus status, + String prosTeamName, + String consTeamName, + long totalCount, + long prosCount, + long consCount +) { + +} From 9c0bf916f912fbde7bc20d8e4836b4234af18260 Mon Sep 17 00:00:00 2001 From: coli Date: Thu, 24 Jul 2025 01:47:08 +0900 Subject: [PATCH 05/29] =?UTF-8?q?feat:=20VoteInfo=20=EA=B3=84=EC=B8=B5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/debatetimer/domain/poll/Poll.java | 4 ++-- .../com/debatetimer/domain/poll/VoteInfo.java | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/debatetimer/domain/poll/VoteInfo.java diff --git a/src/main/java/com/debatetimer/domain/poll/Poll.java b/src/main/java/com/debatetimer/domain/poll/Poll.java index 63399172..4fda60ef 100644 --- a/src/main/java/com/debatetimer/domain/poll/Poll.java +++ b/src/main/java/com/debatetimer/domain/poll/Poll.java @@ -15,8 +15,8 @@ public class Poll { private final TeamName consTeamName; private final Agenda agenda; - public Poll(Long id, long tableId, long userId, PollStatus status, String prosTeamName, String consTeamName, - String agenda) { + public Poll(Long id, long tableId, long userId, PollStatus status, + String prosTeamName, String consTeamName, String agenda) { this(id, tableId, userId, status, new TeamName(prosTeamName), new TeamName(consTeamName), new Agenda(agenda)); } } diff --git a/src/main/java/com/debatetimer/domain/poll/VoteInfo.java b/src/main/java/com/debatetimer/domain/poll/VoteInfo.java new file mode 100644 index 00000000..baae9ab6 --- /dev/null +++ b/src/main/java/com/debatetimer/domain/poll/VoteInfo.java @@ -0,0 +1,16 @@ +package com.debatetimer.domain.poll; + +public class VoteInfo { + + private final long pollId; + private final long totalCount; + private final long prosCount; + private final long consCount; + + public VoteInfo(long pollId, long prosCount, long consCount) { + this.pollId = pollId; + this.totalCount = prosCount + consCount; + this.prosCount = prosCount; + this.consCount = consCount; + } +} From a1b559e371d0cb1c2e2e987562b99b3157296a99 Mon Sep 17 00:00:00 2001 From: coli Date: Thu, 24 Jul 2025 01:55:49 +0900 Subject: [PATCH 06/29] =?UTF-8?q?feat:=20repository=20=EA=B3=84=EC=B8=B5?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domainrepository/poll/PollDomainRepository.java | 12 ++++++++++++ .../domainrepository/poll/VoteDomainRepository.java | 12 ++++++++++++ .../repository/poll/PollJpaRepository.java | 8 ++++++++ .../repository/poll/VoteJpaRepository.java | 8 ++++++++ .../com/debatetimer/service/poll/PollService.java | 11 +++++++++++ 5 files changed, 51 insertions(+) create mode 100644 src/main/java/com/debatetimer/domainrepository/poll/PollDomainRepository.java create mode 100644 src/main/java/com/debatetimer/domainrepository/poll/VoteDomainRepository.java create mode 100644 src/main/java/com/debatetimer/repository/poll/PollJpaRepository.java create mode 100644 src/main/java/com/debatetimer/repository/poll/VoteJpaRepository.java create mode 100644 src/main/java/com/debatetimer/service/poll/PollService.java diff --git a/src/main/java/com/debatetimer/domainrepository/poll/PollDomainRepository.java b/src/main/java/com/debatetimer/domainrepository/poll/PollDomainRepository.java new file mode 100644 index 00000000..62e4d9ab --- /dev/null +++ b/src/main/java/com/debatetimer/domainrepository/poll/PollDomainRepository.java @@ -0,0 +1,12 @@ +package com.debatetimer.domainrepository.poll; + +import com.debatetimer.repository.poll.PollJpaRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; + +@Repository +@RequiredArgsConstructor +public class PollDomainRepository { + + private final PollJpaRepository pollJpaRepository; +} diff --git a/src/main/java/com/debatetimer/domainrepository/poll/VoteDomainRepository.java b/src/main/java/com/debatetimer/domainrepository/poll/VoteDomainRepository.java new file mode 100644 index 00000000..fd8d779b --- /dev/null +++ b/src/main/java/com/debatetimer/domainrepository/poll/VoteDomainRepository.java @@ -0,0 +1,12 @@ +package com.debatetimer.domainrepository.poll; + +import com.debatetimer.repository.poll.VoteJpaRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; + +@Repository +@RequiredArgsConstructor +public class VoteDomainRepository { + + private final VoteJpaRepository voteJpaRepository; +} diff --git a/src/main/java/com/debatetimer/repository/poll/PollJpaRepository.java b/src/main/java/com/debatetimer/repository/poll/PollJpaRepository.java new file mode 100644 index 00000000..ce8009a7 --- /dev/null +++ b/src/main/java/com/debatetimer/repository/poll/PollJpaRepository.java @@ -0,0 +1,8 @@ +package com.debatetimer.repository.poll; + +import com.debatetimer.entity.poll.PollEntity; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface PollJpaRepository extends JpaRepository { + +} diff --git a/src/main/java/com/debatetimer/repository/poll/VoteJpaRepository.java b/src/main/java/com/debatetimer/repository/poll/VoteJpaRepository.java new file mode 100644 index 00000000..78d25ffb --- /dev/null +++ b/src/main/java/com/debatetimer/repository/poll/VoteJpaRepository.java @@ -0,0 +1,8 @@ +package com.debatetimer.repository.poll; + +import com.debatetimer.entity.poll.VoteEntity; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface VoteJpaRepository extends JpaRepository { + +} diff --git a/src/main/java/com/debatetimer/service/poll/PollService.java b/src/main/java/com/debatetimer/service/poll/PollService.java new file mode 100644 index 00000000..77eda2c8 --- /dev/null +++ b/src/main/java/com/debatetimer/service/poll/PollService.java @@ -0,0 +1,11 @@ +package com.debatetimer.service.poll; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class PollService { + + +} From 61fc36db4b74916bca52421daf2209d161483df7 Mon Sep 17 00:00:00 2001 From: coli Date: Thu, 24 Jul 2025 02:24:39 +0900 Subject: [PATCH 07/29] =?UTF-8?q?feat:=20poll=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=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 --- .../com/debatetimer/domain/poll/Poll.java | 2 ++ .../poll/CustomizeTableDomainRepository.java | 22 +++++++++++++++++ .../poll/PollDomainRepository.java | 16 +++++++++++++ .../dto/poll/response/PollCreateResponse.java | 5 ++++ .../debatetimer/entity/poll/PollEntity.java | 10 ++++++++ .../exception/errorcode/ClientErrorCode.java | 1 + .../debatetimer/service/poll/PollService.java | 24 +++++++++++++++++++ 7 files changed, 80 insertions(+) create mode 100644 src/main/java/com/debatetimer/domainrepository/poll/CustomizeTableDomainRepository.java diff --git a/src/main/java/com/debatetimer/domain/poll/Poll.java b/src/main/java/com/debatetimer/domain/poll/Poll.java index 4fda60ef..0e76b115 100644 --- a/src/main/java/com/debatetimer/domain/poll/Poll.java +++ b/src/main/java/com/debatetimer/domain/poll/Poll.java @@ -2,8 +2,10 @@ import com.debatetimer.domain.customize.Agenda; import com.debatetimer.domain.customize.TeamName; +import lombok.Getter; import lombok.RequiredArgsConstructor; +@Getter @RequiredArgsConstructor public class Poll { diff --git a/src/main/java/com/debatetimer/domainrepository/poll/CustomizeTableDomainRepository.java b/src/main/java/com/debatetimer/domainrepository/poll/CustomizeTableDomainRepository.java new file mode 100644 index 00000000..4872adef --- /dev/null +++ b/src/main/java/com/debatetimer/domainrepository/poll/CustomizeTableDomainRepository.java @@ -0,0 +1,22 @@ +package com.debatetimer.domainrepository.poll; + +import com.debatetimer.domain.customize.CustomizeTable; +import com.debatetimer.domain.member.Member; +import com.debatetimer.exception.custom.DTClientErrorException; +import com.debatetimer.exception.errorcode.ClientErrorCode; +import com.debatetimer.repository.customize.CustomizeTableRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; + +@Repository +@RequiredArgsConstructor +public class CustomizeTableDomainRepository { + + private final CustomizeTableRepository customizeTableRepository; + + public CustomizeTable getByIdAndMember(long tableId, Member member) { + return customizeTableRepository.findByIdAndMember(tableId, member) + .orElseThrow(() -> new DTClientErrorException(ClientErrorCode.TABLE_NOT_FOUND)) + .toDomain(); + } +} diff --git a/src/main/java/com/debatetimer/domainrepository/poll/PollDomainRepository.java b/src/main/java/com/debatetimer/domainrepository/poll/PollDomainRepository.java index 62e4d9ab..7d650b0c 100644 --- a/src/main/java/com/debatetimer/domainrepository/poll/PollDomainRepository.java +++ b/src/main/java/com/debatetimer/domainrepository/poll/PollDomainRepository.java @@ -1,5 +1,9 @@ package com.debatetimer.domainrepository.poll; +import com.debatetimer.domain.poll.Poll; +import com.debatetimer.entity.poll.PollEntity; +import com.debatetimer.exception.custom.DTClientErrorException; +import com.debatetimer.exception.errorcode.ClientErrorCode; import com.debatetimer.repository.poll.PollJpaRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; @@ -9,4 +13,16 @@ public class PollDomainRepository { private final PollJpaRepository pollJpaRepository; + + public Poll create(Poll poll) { + PollEntity pollEntity = new PollEntity(poll); + return pollJpaRepository.save(pollEntity) + .toDomain(); + } + + public Poll findById(long id) { + return pollJpaRepository.findById(id) + .orElseThrow(() -> new DTClientErrorException(ClientErrorCode.POLL_NOT_FOUND)) + .toDomain(); + } } diff --git a/src/main/java/com/debatetimer/dto/poll/response/PollCreateResponse.java b/src/main/java/com/debatetimer/dto/poll/response/PollCreateResponse.java index e6f065c4..7f2741ee 100644 --- a/src/main/java/com/debatetimer/dto/poll/response/PollCreateResponse.java +++ b/src/main/java/com/debatetimer/dto/poll/response/PollCreateResponse.java @@ -1,5 +1,10 @@ package com.debatetimer.dto.poll.response; +import com.debatetimer.domain.poll.Poll; + public record PollCreateResponse(long id) { + public PollCreateResponse(Poll poll) { + this(poll.getId()); + } } diff --git a/src/main/java/com/debatetimer/entity/poll/PollEntity.java b/src/main/java/com/debatetimer/entity/poll/PollEntity.java index 7abb94fc..863b4b58 100644 --- a/src/main/java/com/debatetimer/entity/poll/PollEntity.java +++ b/src/main/java/com/debatetimer/entity/poll/PollEntity.java @@ -42,6 +42,16 @@ public class PollEntity extends BaseTimeEntity { private String agenda; + public PollEntity(Poll poll) { + this.id = poll.getId(); + this.tableId = poll.getTableId(); + this.userId = poll.getUserId(); + this.status = poll.getStatus(); + this.prosTeamName = poll.getProsTeamName().getValue(); + this.consTeamName = poll.getConsTeamName().getValue(); + this.agenda = poll.getAgenda().getValue(); + } + public Poll toDomain() { return new Poll(id, tableId, userId, status, prosTeamName, consTeamName, agenda); } diff --git a/src/main/java/com/debatetimer/exception/errorcode/ClientErrorCode.java b/src/main/java/com/debatetimer/exception/errorcode/ClientErrorCode.java index ce52628d..042ee82a 100644 --- a/src/main/java/com/debatetimer/exception/errorcode/ClientErrorCode.java +++ b/src/main/java/com/debatetimer/exception/errorcode/ClientErrorCode.java @@ -54,6 +54,7 @@ public enum ClientErrorCode implements ResponseErrorCode { TABLE_NOT_FOUND(HttpStatus.NOT_FOUND, "토론 테이블을 찾을 수 없습니다."), NOT_TABLE_OWNER(HttpStatus.UNAUTHORIZED, "테이블을 소유한 회원이 아닙니다."), + POLL_NOT_FOUND(HttpStatus.NOT_FOUND, "투표를 찾을 수 없습니다."), UNAUTHORIZED_MEMBER(HttpStatus.UNAUTHORIZED, "접근 권한이 없습니다"), EXPIRED_TOKEN(HttpStatus.UNAUTHORIZED, "토큰 기한이 만료되었습니다"), diff --git a/src/main/java/com/debatetimer/service/poll/PollService.java b/src/main/java/com/debatetimer/service/poll/PollService.java index 77eda2c8..14533ca6 100644 --- a/src/main/java/com/debatetimer/service/poll/PollService.java +++ b/src/main/java/com/debatetimer/service/poll/PollService.java @@ -1,5 +1,13 @@ package com.debatetimer.service.poll; +import com.debatetimer.domain.customize.CustomizeTable; +import com.debatetimer.domain.member.Member; +import com.debatetimer.domain.poll.Poll; +import com.debatetimer.domain.poll.PollStatus; +import com.debatetimer.domainrepository.poll.CustomizeTableDomainRepository; +import com.debatetimer.domainrepository.poll.PollDomainRepository; +import com.debatetimer.domainrepository.poll.VoteDomainRepository; +import com.debatetimer.dto.poll.response.PollCreateResponse; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -7,5 +15,21 @@ @RequiredArgsConstructor public class PollService { + private final CustomizeTableDomainRepository customizeTableDomainRepository; + private final PollDomainRepository pollDomainRepository; + private final VoteDomainRepository voteDomainRepository; + public PollCreateResponse create(long tableId, Member member) { + CustomizeTable table = customizeTableDomainRepository.getByIdAndMember(tableId, member); + Poll poll = new Poll(null, table.getId(), member.getId(), PollStatus.PROGRESS, + table.getProsTeamName(), table.getConsTeamName(), table.getAgenda()); + Poll savedPoll = pollDomainRepository.create(poll); + return new PollCreateResponse(savedPoll); + } + +// public PollInfoResponse readPollInfo(long pollId) { +// Poll poll = pollDomainRepository.findById(pollId); +// +// +// } } From 4e36d7acb0702786f53ef69e7b809293e31937a4 Mon Sep 17 00:00:00 2001 From: coli Date: Thu, 24 Jul 2025 03:53:54 +0900 Subject: [PATCH 08/29] =?UTF-8?q?feat:=20poll=20=EC=84=9C=EB=B9=84?= =?UTF-8?q?=EC=8A=A4=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 --- .../com/debatetimer/domain/poll/Poll.java | 6 ++--- .../com/debatetimer/domain/poll/VoteInfo.java | 3 +++ .../poll/CustomizeTableDomainRepository.java | 2 ++ .../poll/PollDomainRepository.java | 20 ++++++++++++++--- .../poll/VoteDomainRepository.java | 22 +++++++++++++++++++ .../dto/poll/response/PollInfoResponse.java | 13 +++++++++++ .../debatetimer/entity/poll/PollEntity.java | 13 ++++++++--- .../debatetimer/entity/poll/VoteEntity.java | 2 ++ .../repository/poll/PollJpaRepository.java | 3 +++ .../repository/poll/VoteJpaRepository.java | 2 ++ .../debatetimer/service/poll/PollService.java | 22 ++++++++++++++----- .../migration/V11__add_memberId_into_poll.sql | 2 ++ .../migration/V11__add_userid_into_poll.sql | 2 -- 13 files changed, 96 insertions(+), 16 deletions(-) create mode 100644 src/main/resources/db/migration/V11__add_memberId_into_poll.sql delete mode 100644 src/main/resources/db/migration/V11__add_userid_into_poll.sql diff --git a/src/main/java/com/debatetimer/domain/poll/Poll.java b/src/main/java/com/debatetimer/domain/poll/Poll.java index 0e76b115..35c19a17 100644 --- a/src/main/java/com/debatetimer/domain/poll/Poll.java +++ b/src/main/java/com/debatetimer/domain/poll/Poll.java @@ -11,14 +11,14 @@ public class Poll { private final Long id; private final long tableId; - private final long userId; + private final long memberId; private final PollStatus status; private final TeamName prosTeamName; private final TeamName consTeamName; private final Agenda agenda; - public Poll(Long id, long tableId, long userId, PollStatus status, + public Poll(Long id, long tableId, long memberId, PollStatus status, String prosTeamName, String consTeamName, String agenda) { - this(id, tableId, userId, status, new TeamName(prosTeamName), new TeamName(consTeamName), new Agenda(agenda)); + this(id, tableId, memberId, status, new TeamName(prosTeamName), new TeamName(consTeamName), new Agenda(agenda)); } } diff --git a/src/main/java/com/debatetimer/domain/poll/VoteInfo.java b/src/main/java/com/debatetimer/domain/poll/VoteInfo.java index baae9ab6..36734ebb 100644 --- a/src/main/java/com/debatetimer/domain/poll/VoteInfo.java +++ b/src/main/java/com/debatetimer/domain/poll/VoteInfo.java @@ -1,5 +1,8 @@ package com.debatetimer.domain.poll; +import lombok.Getter; + +@Getter public class VoteInfo { private final long pollId; diff --git a/src/main/java/com/debatetimer/domainrepository/poll/CustomizeTableDomainRepository.java b/src/main/java/com/debatetimer/domainrepository/poll/CustomizeTableDomainRepository.java index 4872adef..850c53bd 100644 --- a/src/main/java/com/debatetimer/domainrepository/poll/CustomizeTableDomainRepository.java +++ b/src/main/java/com/debatetimer/domainrepository/poll/CustomizeTableDomainRepository.java @@ -7,6 +7,7 @@ import com.debatetimer.repository.customize.CustomizeTableRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; @Repository @RequiredArgsConstructor @@ -14,6 +15,7 @@ public class CustomizeTableDomainRepository { private final CustomizeTableRepository customizeTableRepository; + @Transactional(readOnly = true) public CustomizeTable getByIdAndMember(long tableId, Member member) { return customizeTableRepository.findByIdAndMember(tableId, member) .orElseThrow(() -> new DTClientErrorException(ClientErrorCode.TABLE_NOT_FOUND)) diff --git a/src/main/java/com/debatetimer/domainrepository/poll/PollDomainRepository.java b/src/main/java/com/debatetimer/domainrepository/poll/PollDomainRepository.java index 7d650b0c..376a2b94 100644 --- a/src/main/java/com/debatetimer/domainrepository/poll/PollDomainRepository.java +++ b/src/main/java/com/debatetimer/domainrepository/poll/PollDomainRepository.java @@ -7,6 +7,7 @@ import com.debatetimer.repository.poll.PollJpaRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; @Repository @RequiredArgsConstructor @@ -14,15 +15,28 @@ public class PollDomainRepository { private final PollJpaRepository pollJpaRepository; + @Transactional public Poll create(Poll poll) { PollEntity pollEntity = new PollEntity(poll); return pollJpaRepository.save(pollEntity) .toDomain(); } - public Poll findById(long id) { - return pollJpaRepository.findById(id) - .orElseThrow(() -> new DTClientErrorException(ClientErrorCode.POLL_NOT_FOUND)) + @Transactional(readOnly = true) + public Poll getByIdAndMemberId(long id, long memberId) { + return findPoll(id, memberId) .toDomain(); } + + @Transactional + public Poll updateToDone(long pollId, long memberId) { + PollEntity pollEntity = findPoll(pollId, memberId); + pollEntity.updateToDone(); + return pollEntity.toDomain(); + } + + private PollEntity findPoll(long pollId, long memberId) { + return pollJpaRepository.findByIdAndMemberId(pollId, memberId) + .orElseThrow(() -> new DTClientErrorException(ClientErrorCode.POLL_NOT_FOUND)); + } } diff --git a/src/main/java/com/debatetimer/domainrepository/poll/VoteDomainRepository.java b/src/main/java/com/debatetimer/domainrepository/poll/VoteDomainRepository.java index fd8d779b..a5113b80 100644 --- a/src/main/java/com/debatetimer/domainrepository/poll/VoteDomainRepository.java +++ b/src/main/java/com/debatetimer/domainrepository/poll/VoteDomainRepository.java @@ -1,6 +1,12 @@ package com.debatetimer.domainrepository.poll; +import com.debatetimer.domain.poll.VoteInfo; +import com.debatetimer.domain.poll.VoteTeam; +import com.debatetimer.entity.poll.VoteEntity; import com.debatetimer.repository.poll.VoteJpaRepository; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; @@ -9,4 +15,20 @@ public class VoteDomainRepository { private final VoteJpaRepository voteJpaRepository; + + public VoteInfo findVoteInfoByPollId(long pollId) { + List pollVotes = voteJpaRepository.findAllByPollId(pollId); + return resolveVoteInfo(pollId, pollVotes); + } + + private VoteInfo resolveVoteInfo(long pollId, List voteEntities) { + Map teamCount = voteEntities.stream() + .collect(Collectors.groupingBy( + VoteEntity::getTeam, + Collectors.counting() + )); + long prosCount = teamCount.get(VoteTeam.PROS); + long consCount = teamCount.get(VoteTeam.CONS); + return new VoteInfo(pollId, prosCount, consCount); + } } diff --git a/src/main/java/com/debatetimer/dto/poll/response/PollInfoResponse.java b/src/main/java/com/debatetimer/dto/poll/response/PollInfoResponse.java index ae947ba2..69f3f6ae 100644 --- a/src/main/java/com/debatetimer/dto/poll/response/PollInfoResponse.java +++ b/src/main/java/com/debatetimer/dto/poll/response/PollInfoResponse.java @@ -1,6 +1,8 @@ package com.debatetimer.dto.poll.response; +import com.debatetimer.domain.poll.Poll; import com.debatetimer.domain.poll.PollStatus; +import com.debatetimer.domain.poll.VoteInfo; public record PollInfoResponse( long id, @@ -12,4 +14,15 @@ public record PollInfoResponse( long consCount ) { + public PollInfoResponse(Poll poll, VoteInfo voteInfo) { + this( + poll.getId(), + poll.getStatus(), + poll.getProsTeamName().getValue(), + poll.getConsTeamName().getValue(), + voteInfo.getTotalCount(), + voteInfo.getProsCount(), + voteInfo.getConsCount() + ); + } } diff --git a/src/main/java/com/debatetimer/entity/poll/PollEntity.java b/src/main/java/com/debatetimer/entity/poll/PollEntity.java index 863b4b58..bb4e5433 100644 --- a/src/main/java/com/debatetimer/entity/poll/PollEntity.java +++ b/src/main/java/com/debatetimer/entity/poll/PollEntity.java @@ -3,6 +3,7 @@ import com.debatetimer.domain.poll.Poll; import com.debatetimer.domain.poll.PollStatus; import com.debatetimer.entity.customize.BaseTimeEntity; +import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.EnumType; import jakarta.persistence.Enumerated; @@ -26,9 +27,11 @@ public class PollEntity extends BaseTimeEntity { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; + @Column(name = "table_id") private long tableId; - private long userId; + @Column(name = "member_id") + private long memberId; @NotNull @Enumerated(EnumType.STRING) @@ -45,14 +48,18 @@ public class PollEntity extends BaseTimeEntity { public PollEntity(Poll poll) { this.id = poll.getId(); this.tableId = poll.getTableId(); - this.userId = poll.getUserId(); + this.memberId = poll.getMemberId(); this.status = poll.getStatus(); this.prosTeamName = poll.getProsTeamName().getValue(); this.consTeamName = poll.getConsTeamName().getValue(); this.agenda = poll.getAgenda().getValue(); } + public void updateToDone() { + this.status = PollStatus.DONE; + } + public Poll toDomain() { - return new Poll(id, tableId, userId, status, prosTeamName, consTeamName, agenda); + return new Poll(id, tableId, memberId, status, prosTeamName, consTeamName, agenda); } } diff --git a/src/main/java/com/debatetimer/entity/poll/VoteEntity.java b/src/main/java/com/debatetimer/entity/poll/VoteEntity.java index 0d406177..2633a60a 100644 --- a/src/main/java/com/debatetimer/entity/poll/VoteEntity.java +++ b/src/main/java/com/debatetimer/entity/poll/VoteEntity.java @@ -15,9 +15,11 @@ import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import lombok.AccessLevel; +import lombok.Getter; import lombok.NoArgsConstructor; @Entity +@Getter @Table(name = "vote") @NoArgsConstructor(access = AccessLevel.PROTECTED) public class VoteEntity { diff --git a/src/main/java/com/debatetimer/repository/poll/PollJpaRepository.java b/src/main/java/com/debatetimer/repository/poll/PollJpaRepository.java index ce8009a7..cef244d9 100644 --- a/src/main/java/com/debatetimer/repository/poll/PollJpaRepository.java +++ b/src/main/java/com/debatetimer/repository/poll/PollJpaRepository.java @@ -1,8 +1,11 @@ package com.debatetimer.repository.poll; import com.debatetimer.entity.poll.PollEntity; +import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; public interface PollJpaRepository extends JpaRepository { + Optional findByIdAndMemberId(long id, long memberId); + } diff --git a/src/main/java/com/debatetimer/repository/poll/VoteJpaRepository.java b/src/main/java/com/debatetimer/repository/poll/VoteJpaRepository.java index 78d25ffb..95e2f858 100644 --- a/src/main/java/com/debatetimer/repository/poll/VoteJpaRepository.java +++ b/src/main/java/com/debatetimer/repository/poll/VoteJpaRepository.java @@ -1,8 +1,10 @@ package com.debatetimer.repository.poll; import com.debatetimer.entity.poll.VoteEntity; +import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; public interface VoteJpaRepository extends JpaRepository { + List findAllByPollId(long pollId); } diff --git a/src/main/java/com/debatetimer/service/poll/PollService.java b/src/main/java/com/debatetimer/service/poll/PollService.java index 14533ca6..8e3dc691 100644 --- a/src/main/java/com/debatetimer/service/poll/PollService.java +++ b/src/main/java/com/debatetimer/service/poll/PollService.java @@ -4,12 +4,15 @@ import com.debatetimer.domain.member.Member; import com.debatetimer.domain.poll.Poll; import com.debatetimer.domain.poll.PollStatus; +import com.debatetimer.domain.poll.VoteInfo; import com.debatetimer.domainrepository.poll.CustomizeTableDomainRepository; import com.debatetimer.domainrepository.poll.PollDomainRepository; import com.debatetimer.domainrepository.poll.VoteDomainRepository; import com.debatetimer.dto.poll.response.PollCreateResponse; +import com.debatetimer.dto.poll.response.PollInfoResponse; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; @Service @RequiredArgsConstructor @@ -19,6 +22,7 @@ public class PollService { private final PollDomainRepository pollDomainRepository; private final VoteDomainRepository voteDomainRepository; + @Transactional public PollCreateResponse create(long tableId, Member member) { CustomizeTable table = customizeTableDomainRepository.getByIdAndMember(tableId, member); Poll poll = new Poll(null, table.getId(), member.getId(), PollStatus.PROGRESS, @@ -27,9 +31,17 @@ public PollCreateResponse create(long tableId, Member member) { return new PollCreateResponse(savedPoll); } -// public PollInfoResponse readPollInfo(long pollId) { -// Poll poll = pollDomainRepository.findById(pollId); -// -// -// } + @Transactional(readOnly = true) + public PollInfoResponse readPollInfo(long pollId, Member member) { + Poll poll = pollDomainRepository.getByIdAndMemberId(pollId, member.getId()); + VoteInfo voteInfo = voteDomainRepository.findVoteInfoByPollId(pollId); + return new PollInfoResponse(poll, voteInfo); + } + + @Transactional + public PollInfoResponse updateToDone(long pollId, Member member) { + Poll poll = pollDomainRepository.updateToDone(pollId, member.getId()); + VoteInfo voteInfo = voteDomainRepository.findVoteInfoByPollId(pollId); + return new PollInfoResponse(poll, voteInfo); + } } diff --git a/src/main/resources/db/migration/V11__add_memberId_into_poll.sql b/src/main/resources/db/migration/V11__add_memberId_into_poll.sql new file mode 100644 index 00000000..08772417 --- /dev/null +++ b/src/main/resources/db/migration/V11__add_memberId_into_poll.sql @@ -0,0 +1,2 @@ +ALTER TABLE poll + ADD COLUMN member_id BIGINT NOT NULL diff --git a/src/main/resources/db/migration/V11__add_userid_into_poll.sql b/src/main/resources/db/migration/V11__add_userid_into_poll.sql deleted file mode 100644 index 63064ae1..00000000 --- a/src/main/resources/db/migration/V11__add_userid_into_poll.sql +++ /dev/null @@ -1,2 +0,0 @@ -ALTER TABLE poll - ADD COLUMN user_id BIGINT NOT NULL From 51a846f9f356e768e50edbaf18679708715558cc Mon Sep 17 00:00:00 2001 From: coli Date: Thu, 24 Jul 2025 03:55:05 +0900 Subject: [PATCH 09/29] =?UTF-8?q?feat:=20poll=20=EC=BB=A8=ED=8A=B8?= =?UTF-8?q?=EB=A1=A4=EB=9F=AC=20=EB=A1=9C=EC=A7=81=20=EA=B0=9C=EB=B0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../debatetimer/controller/poll/PollController.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/debatetimer/controller/poll/PollController.java b/src/main/java/com/debatetimer/controller/poll/PollController.java index 904ac4ba..5a5333b1 100644 --- a/src/main/java/com/debatetimer/controller/poll/PollController.java +++ b/src/main/java/com/debatetimer/controller/poll/PollController.java @@ -4,6 +4,7 @@ import com.debatetimer.domain.member.Member; import com.debatetimer.dto.poll.response.PollCreateResponse; import com.debatetimer.dto.poll.response.PollInfoResponse; +import com.debatetimer.service.poll.PollService; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.GetMapping; @@ -17,13 +18,15 @@ @RequiredArgsConstructor public class PollController { + private final PollService pollService; + @PostMapping("/api/polls/{tableId}") @ResponseStatus(HttpStatus.CREATED) public PollCreateResponse createPoll( @AuthMember Member member, @PathVariable(name = "tableId") long tableId ) { - return null; + return pollService.create(tableId, member); } @GetMapping("/api/polls/{pollId}") @@ -32,15 +35,15 @@ public PollInfoResponse readPollInfo( @AuthMember Member member, @PathVariable(name = "pollId") long pollId ) { - return null; + return pollService.readPollInfo(pollId, member); } @PatchMapping("/api/polls/{pollId}") @ResponseStatus(HttpStatus.OK) - public PollInfoResponse endPoll( + public PollInfoResponse updateToDone( @AuthMember Member member, @PathVariable(name = "pollId") long pollId ) { - return null; + return pollService.updateToDone(pollId, member); } } From 47798a6a6b3f99f44cd31d166edb8d3597694ea1 Mon Sep 17 00:00:00 2001 From: coli Date: Thu, 24 Jul 2025 03:59:32 +0900 Subject: [PATCH 10/29] =?UTF-8?q?feat:=20=EC=B0=B8=EC=97=AC=EC=9E=90=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84,=20=EC=BD=94=EB=93=9C=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=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 --- .../domain/poll/ParticipantNameTest.java | 26 +++++++++++++++++++ .../domain/poll/ParticipateCodeTest.java | 26 +++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 src/test/java/com/debatetimer/domain/poll/ParticipantNameTest.java create mode 100644 src/test/java/com/debatetimer/domain/poll/ParticipateCodeTest.java diff --git a/src/test/java/com/debatetimer/domain/poll/ParticipantNameTest.java b/src/test/java/com/debatetimer/domain/poll/ParticipantNameTest.java new file mode 100644 index 00000000..97b898fd --- /dev/null +++ b/src/test/java/com/debatetimer/domain/poll/ParticipantNameTest.java @@ -0,0 +1,26 @@ +package com.debatetimer.domain.poll; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import com.debatetimer.exception.custom.DTClientErrorException; +import com.debatetimer.exception.errorcode.ClientErrorCode; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.NullAndEmptySource; +import org.junit.jupiter.params.provider.ValueSource; + +class ParticipantNameTest { + + @Nested + class Validate { + + @ParameterizedTest + @NullAndEmptySource + @ValueSource(strings = {" ", " "}) + void 투표참여자_이름은_널이거나_빈_값_일_수_없다(String name) { + assertThatThrownBy(() -> new ParticipantName(name)) + .isInstanceOf(DTClientErrorException.class) + .hasMessage(ClientErrorCode.INVALID_POLL_PARTICIPANT_NAME.getMessage()); + } + } +} diff --git a/src/test/java/com/debatetimer/domain/poll/ParticipateCodeTest.java b/src/test/java/com/debatetimer/domain/poll/ParticipateCodeTest.java new file mode 100644 index 00000000..009024cb --- /dev/null +++ b/src/test/java/com/debatetimer/domain/poll/ParticipateCodeTest.java @@ -0,0 +1,26 @@ +package com.debatetimer.domain.poll; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import com.debatetimer.exception.custom.DTClientErrorException; +import com.debatetimer.exception.errorcode.ClientErrorCode; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.NullAndEmptySource; +import org.junit.jupiter.params.provider.ValueSource; + +class ParticipateCodeTest { + + @Nested + class Validate { + + @ParameterizedTest + @NullAndEmptySource + @ValueSource(strings = {" ", " "}) + void 투표_참여_코드는_널이거나_빈_값_일_수_없다(String participatecode) { + assertThatThrownBy(() -> new ParticipateCode(participatecode)) + .isInstanceOf(DTClientErrorException.class) + .hasMessage(ClientErrorCode.INVALID_POLL_PARTICIPANT_CODE.getMessage()); + } + } +} From ac57a538a3bcab7d0c03ddebb64b1988c5d700a6 Mon Sep 17 00:00:00 2001 From: coli Date: Thu, 24 Jul 2025 04:14:43 +0900 Subject: [PATCH 11/29] =?UTF-8?q?feat:=20=EC=B0=B8=EC=97=AC=EC=9E=90=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84,=20=EC=BD=94=EB=93=9C=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=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 --- .../debatetimer/entity/poll/VoteEntity.java | 2 + .../poll/BaseDomainRepositoryTest.java | 27 +++++++++++ .../poll/VoteDomainRepositoryTest.java | 46 +++++++++++++++++++ .../debatetimer/fixture/PollGenerator.java | 31 +++++++++++++ .../debatetimer/fixture/VoteGenerator.java | 23 ++++++++++ .../repository/BaseRepositoryTest.java | 2 +- 6 files changed, 130 insertions(+), 1 deletion(-) create mode 100644 src/test/java/com/debatetimer/domainrepository/poll/BaseDomainRepositoryTest.java create mode 100644 src/test/java/com/debatetimer/domainrepository/poll/VoteDomainRepositoryTest.java create mode 100644 src/test/java/com/debatetimer/fixture/PollGenerator.java create mode 100644 src/test/java/com/debatetimer/fixture/VoteGenerator.java diff --git a/src/main/java/com/debatetimer/entity/poll/VoteEntity.java b/src/main/java/com/debatetimer/entity/poll/VoteEntity.java index 2633a60a..47dd0a2c 100644 --- a/src/main/java/com/debatetimer/entity/poll/VoteEntity.java +++ b/src/main/java/com/debatetimer/entity/poll/VoteEntity.java @@ -15,6 +15,7 @@ import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import lombok.AccessLevel; +import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; @@ -22,6 +23,7 @@ @Getter @Table(name = "vote") @NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor public class VoteEntity { @Id diff --git a/src/test/java/com/debatetimer/domainrepository/poll/BaseDomainRepositoryTest.java b/src/test/java/com/debatetimer/domainrepository/poll/BaseDomainRepositoryTest.java new file mode 100644 index 00000000..42993893 --- /dev/null +++ b/src/test/java/com/debatetimer/domainrepository/poll/BaseDomainRepositoryTest.java @@ -0,0 +1,27 @@ +package com.debatetimer.domainrepository.poll; + +import com.debatetimer.DataBaseCleaner; +import com.debatetimer.fixture.CustomizeTableGenerator; +import com.debatetimer.fixture.MemberGenerator; +import com.debatetimer.fixture.PollGenerator; +import com.debatetimer.fixture.VoteGenerator; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +@ExtendWith(DataBaseCleaner.class) +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE) +public abstract class BaseDomainRepositoryTest { + + @Autowired + protected MemberGenerator memberGenerator; + + @Autowired + protected CustomizeTableGenerator customizeTableGenerator; + + @Autowired + protected PollGenerator pollGenerator; + + @Autowired + protected VoteGenerator voteGenerator; +} diff --git a/src/test/java/com/debatetimer/domainrepository/poll/VoteDomainRepositoryTest.java b/src/test/java/com/debatetimer/domainrepository/poll/VoteDomainRepositoryTest.java new file mode 100644 index 00000000..6a152c12 --- /dev/null +++ b/src/test/java/com/debatetimer/domainrepository/poll/VoteDomainRepositoryTest.java @@ -0,0 +1,46 @@ +package com.debatetimer.domainrepository.poll; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertAll; + +import com.debatetimer.domain.member.Member; +import com.debatetimer.domain.poll.PollStatus; +import com.debatetimer.domain.poll.VoteInfo; +import com.debatetimer.domain.poll.VoteTeam; +import com.debatetimer.entity.customize.CustomizeTableEntity; +import com.debatetimer.entity.poll.PollEntity; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Import; + +@Import(VoteDomainRepository.class) +class VoteDomainRepositoryTest extends BaseDomainRepositoryTest { + + @Autowired + private VoteDomainRepository voteDomainRepository; + + @Nested + class GetVoteInfo { + + @Test + void 팀별_투표_현황을_알_수_있다() { + Member member = memberGenerator.generate("email@email.com"); + CustomizeTableEntity table = customizeTableGenerator.generate(member); + PollEntity pollEntity = pollGenerator.generate(table, PollStatus.PROGRESS); + voteGenerator.generate(pollEntity, VoteTeam.PROS, "콜리"); + voteGenerator.generate(pollEntity, VoteTeam.PROS, "비토"); + voteGenerator.generate(pollEntity, VoteTeam.CONS, "커찬"); + + VoteInfo voteInfo = voteDomainRepository.findVoteInfoByPollId(pollEntity.getId()); + + assertAll( + () -> assertThat(voteInfo.getPollId()).isEqualTo(pollEntity.getId()), + () -> assertThat(voteInfo.getTotalCount()).isEqualTo(3L), + () -> assertThat(voteInfo.getProsCount()).isEqualTo(2L), + () -> assertThat(voteInfo.getConsCount()).isEqualTo(1L) + ); + } + } + +} diff --git a/src/test/java/com/debatetimer/fixture/PollGenerator.java b/src/test/java/com/debatetimer/fixture/PollGenerator.java new file mode 100644 index 00000000..f702f17d --- /dev/null +++ b/src/test/java/com/debatetimer/fixture/PollGenerator.java @@ -0,0 +1,31 @@ +package com.debatetimer.fixture; + +import com.debatetimer.domain.poll.Poll; +import com.debatetimer.domain.poll.PollStatus; +import com.debatetimer.entity.customize.CustomizeTableEntity; +import com.debatetimer.entity.poll.PollEntity; +import com.debatetimer.repository.poll.PollJpaRepository; +import org.springframework.stereotype.Component; + +@Component +public class PollGenerator { + + private final PollJpaRepository pollJpaRepository; + + public PollGenerator(final PollJpaRepository pollJpaRepository) { + this.pollJpaRepository = pollJpaRepository; + } + + public PollEntity generate(CustomizeTableEntity customizeTableEntity, PollStatus status) { + Poll poll = new Poll( + null, + customizeTableEntity.getId(), + customizeTableEntity.getMember().getId(), + status, + "찬성", + "반대", + "주제" + ); + return pollJpaRepository.save(new PollEntity(poll)); + } +} diff --git a/src/test/java/com/debatetimer/fixture/VoteGenerator.java b/src/test/java/com/debatetimer/fixture/VoteGenerator.java new file mode 100644 index 00000000..3fa2b5f6 --- /dev/null +++ b/src/test/java/com/debatetimer/fixture/VoteGenerator.java @@ -0,0 +1,23 @@ +package com.debatetimer.fixture; + +import com.debatetimer.domain.poll.VoteTeam; +import com.debatetimer.entity.poll.PollEntity; +import com.debatetimer.entity.poll.VoteEntity; +import com.debatetimer.repository.poll.VoteJpaRepository; +import java.util.UUID; +import org.springframework.stereotype.Component; + +@Component +public class VoteGenerator { + + private final VoteJpaRepository voteJpaRepository; + + public VoteGenerator(VoteJpaRepository voteJpaRepository) { + this.voteJpaRepository = voteJpaRepository; + } + + public VoteEntity generate(PollEntity pollEntity, VoteTeam team, String name) { + VoteEntity vote = new VoteEntity(null, pollEntity, team, name, UUID.randomUUID().toString()); + return voteJpaRepository.save(vote); + } +} diff --git a/src/test/java/com/debatetimer/repository/BaseRepositoryTest.java b/src/test/java/com/debatetimer/repository/BaseRepositoryTest.java index 2b7d1c04..87b5404b 100644 --- a/src/test/java/com/debatetimer/repository/BaseRepositoryTest.java +++ b/src/test/java/com/debatetimer/repository/BaseRepositoryTest.java @@ -14,7 +14,7 @@ MemberGenerator.class, CustomizeTableGenerator.class, CustomizeTimeBoxGenerator.class, - BellGenerator.class + BellGenerator.class, }) @DataJpaTest public abstract class BaseRepositoryTest { From 4ee38ed527bc05b205ebfaacd47f6a9c34fc1a83 Mon Sep 17 00:00:00 2001 From: coli Date: Thu, 24 Jul 2025 04:15:28 +0900 Subject: [PATCH 12/29] =?UTF-8?q?chore:=20basetest=20=EB=94=94=EB=A0=89?= =?UTF-8?q?=ED=86=A0=EB=A6=AC=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domainrepository/{poll => }/BaseDomainRepositoryTest.java | 2 +- .../domainrepository/poll/VoteDomainRepositoryTest.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) rename src/test/java/com/debatetimer/domainrepository/{poll => }/BaseDomainRepositoryTest.java (94%) diff --git a/src/test/java/com/debatetimer/domainrepository/poll/BaseDomainRepositoryTest.java b/src/test/java/com/debatetimer/domainrepository/BaseDomainRepositoryTest.java similarity index 94% rename from src/test/java/com/debatetimer/domainrepository/poll/BaseDomainRepositoryTest.java rename to src/test/java/com/debatetimer/domainrepository/BaseDomainRepositoryTest.java index 42993893..fbdb8e52 100644 --- a/src/test/java/com/debatetimer/domainrepository/poll/BaseDomainRepositoryTest.java +++ b/src/test/java/com/debatetimer/domainrepository/BaseDomainRepositoryTest.java @@ -1,4 +1,4 @@ -package com.debatetimer.domainrepository.poll; +package com.debatetimer.domainrepository; import com.debatetimer.DataBaseCleaner; import com.debatetimer.fixture.CustomizeTableGenerator; diff --git a/src/test/java/com/debatetimer/domainrepository/poll/VoteDomainRepositoryTest.java b/src/test/java/com/debatetimer/domainrepository/poll/VoteDomainRepositoryTest.java index 6a152c12..9ee8c02a 100644 --- a/src/test/java/com/debatetimer/domainrepository/poll/VoteDomainRepositoryTest.java +++ b/src/test/java/com/debatetimer/domainrepository/poll/VoteDomainRepositoryTest.java @@ -7,6 +7,7 @@ import com.debatetimer.domain.poll.PollStatus; import com.debatetimer.domain.poll.VoteInfo; import com.debatetimer.domain.poll.VoteTeam; +import com.debatetimer.domainrepository.BaseDomainRepositoryTest; import com.debatetimer.entity.customize.CustomizeTableEntity; import com.debatetimer.entity.poll.PollEntity; import org.junit.jupiter.api.Nested; From b2353b129c336011c7731bbc338dd64e3fe0c67e Mon Sep 17 00:00:00 2001 From: coli Date: Thu, 24 Jul 2025 04:24:22 +0900 Subject: [PATCH 13/29] =?UTF-8?q?test:=20poll=20domainRepository=20?= =?UTF-8?q?=ED=85=8C=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 --- .../BaseDomainRepositoryTest.java | 4 ++ .../poll/PollDomainRepositoryTest.java | 66 +++++++++++++++++++ .../poll/VoteDomainRepositoryTest.java | 2 - 3 files changed, 70 insertions(+), 2 deletions(-) create mode 100644 src/test/java/com/debatetimer/domainrepository/poll/PollDomainRepositoryTest.java diff --git a/src/test/java/com/debatetimer/domainrepository/BaseDomainRepositoryTest.java b/src/test/java/com/debatetimer/domainrepository/BaseDomainRepositoryTest.java index fbdb8e52..626c3747 100644 --- a/src/test/java/com/debatetimer/domainrepository/BaseDomainRepositoryTest.java +++ b/src/test/java/com/debatetimer/domainrepository/BaseDomainRepositoryTest.java @@ -5,6 +5,7 @@ import com.debatetimer.fixture.MemberGenerator; import com.debatetimer.fixture.PollGenerator; import com.debatetimer.fixture.VoteGenerator; +import com.debatetimer.repository.poll.PollJpaRepository; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; @@ -24,4 +25,7 @@ public abstract class BaseDomainRepositoryTest { @Autowired protected VoteGenerator voteGenerator; + + @Autowired + protected PollJpaRepository pollJpaRepository; } diff --git a/src/test/java/com/debatetimer/domainrepository/poll/PollDomainRepositoryTest.java b/src/test/java/com/debatetimer/domainrepository/poll/PollDomainRepositoryTest.java new file mode 100644 index 00000000..8619bc73 --- /dev/null +++ b/src/test/java/com/debatetimer/domainrepository/poll/PollDomainRepositoryTest.java @@ -0,0 +1,66 @@ +package com.debatetimer.domainrepository.poll; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertAll; + +import com.debatetimer.domain.member.Member; +import com.debatetimer.domain.poll.Poll; +import com.debatetimer.domain.poll.PollStatus; +import com.debatetimer.domainrepository.BaseDomainRepositoryTest; +import com.debatetimer.entity.customize.CustomizeTableEntity; +import com.debatetimer.entity.poll.PollEntity; +import java.util.Optional; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +class PollDomainRepositoryTest extends BaseDomainRepositoryTest { + + @Autowired + private PollDomainRepository pollDomainRepository; + + @Nested + class CRUDTest { + + @Test + void 선거를_생성한다() { + Member member = memberGenerator.generate("email@email.com"); + CustomizeTableEntity table = customizeTableGenerator.generate(member); + Poll poll = new Poll(null, table.getId(), member.getId(), PollStatus.PROGRESS, "찬성", "반대", "주제"); + + pollDomainRepository.create(poll); + + Optional foundPollEntity = pollJpaRepository.findById(poll.getId()); + assertThat(foundPollEntity).isPresent(); + } + + @Test + void 회원이_개최한_선거를_가져온다() { + Member member = memberGenerator.generate("email@email.com"); + CustomizeTableEntity table = customizeTableGenerator.generate(member); + PollEntity pollEntity = pollGenerator.generate(table, PollStatus.PROGRESS); + + Poll foundPoll = pollDomainRepository.getByIdAndMemberId(pollEntity.getId(), member.getId()); + + assertAll( + () -> assertThat(foundPoll.getId()).isEqualTo(pollEntity.getId()), + () -> assertThat(foundPoll.getAgenda().getValue()).isEqualTo(pollEntity.getAgenda()), + () -> assertThat(foundPoll.getStatus()).isEqualTo(pollEntity.getStatus()), + () -> assertThat(foundPoll.getMemberId()).isEqualTo(pollEntity.getMemberId()), + () -> assertThat(foundPoll.getProsTeamName().getValue()).isEqualTo(pollEntity.getProsTeamName()), + () -> assertThat(foundPoll.getConsTeamName().getValue()).isEqualTo(pollEntity.getConsTeamName()) + ); + } + + @Test + void 선거를_완료_상태로_변경한다() { + Member member = memberGenerator.generate("email@email.com"); + CustomizeTableEntity table = customizeTableGenerator.generate(member); + PollEntity pollEntity = pollGenerator.generate(table, PollStatus.PROGRESS); + + Poll updatedPoll = pollDomainRepository.updateToDone(pollEntity.getId(), member.getId()); + + assertThat(updatedPoll.getStatus()).isEqualTo(PollStatus.DONE); + } + } +} diff --git a/src/test/java/com/debatetimer/domainrepository/poll/VoteDomainRepositoryTest.java b/src/test/java/com/debatetimer/domainrepository/poll/VoteDomainRepositoryTest.java index 9ee8c02a..068e782e 100644 --- a/src/test/java/com/debatetimer/domainrepository/poll/VoteDomainRepositoryTest.java +++ b/src/test/java/com/debatetimer/domainrepository/poll/VoteDomainRepositoryTest.java @@ -13,9 +13,7 @@ import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Import; -@Import(VoteDomainRepository.class) class VoteDomainRepositoryTest extends BaseDomainRepositoryTest { @Autowired From 7f54c78ff82e220fcb4df9f93d6cdf7a27b2440c Mon Sep 17 00:00:00 2001 From: coli Date: Thu, 24 Jul 2025 04:34:02 +0900 Subject: [PATCH 14/29] =?UTF-8?q?test:=20PollServiceTest=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../poll/VoteDomainRepository.java | 9 +-- .../debatetimer/service/BaseServiceTest.java | 12 +++ .../service/poll/PollServiceTest.java | 79 +++++++++++++++++++ 3 files changed, 94 insertions(+), 6 deletions(-) create mode 100644 src/test/java/com/debatetimer/service/poll/PollServiceTest.java diff --git a/src/main/java/com/debatetimer/domainrepository/poll/VoteDomainRepository.java b/src/main/java/com/debatetimer/domainrepository/poll/VoteDomainRepository.java index a5113b80..4bfe4f40 100644 --- a/src/main/java/com/debatetimer/domainrepository/poll/VoteDomainRepository.java +++ b/src/main/java/com/debatetimer/domainrepository/poll/VoteDomainRepository.java @@ -23,12 +23,9 @@ public VoteInfo findVoteInfoByPollId(long pollId) { private VoteInfo resolveVoteInfo(long pollId, List voteEntities) { Map teamCount = voteEntities.stream() - .collect(Collectors.groupingBy( - VoteEntity::getTeam, - Collectors.counting() - )); - long prosCount = teamCount.get(VoteTeam.PROS); - long consCount = teamCount.get(VoteTeam.CONS); + .collect(Collectors.groupingBy(VoteEntity::getTeam, Collectors.counting())); + long prosCount = teamCount.getOrDefault(VoteTeam.PROS, 0L); + long consCount = teamCount.getOrDefault(VoteTeam.CONS, 0L); return new VoteInfo(pollId, prosCount, consCount); } } diff --git a/src/test/java/com/debatetimer/service/BaseServiceTest.java b/src/test/java/com/debatetimer/service/BaseServiceTest.java index 6220cc2a..bdf70db3 100644 --- a/src/test/java/com/debatetimer/service/BaseServiceTest.java +++ b/src/test/java/com/debatetimer/service/BaseServiceTest.java @@ -5,10 +5,13 @@ import com.debatetimer.fixture.CustomizeTableGenerator; import com.debatetimer.fixture.CustomizeTimeBoxGenerator; import com.debatetimer.fixture.MemberGenerator; +import com.debatetimer.fixture.PollGenerator; +import com.debatetimer.fixture.VoteGenerator; import com.debatetimer.repository.customize.BellRepository; import com.debatetimer.repository.customize.CustomizeTableRepository; import com.debatetimer.repository.customize.CustomizeTimeBoxRepository; import com.debatetimer.repository.member.MemberRepository; +import com.debatetimer.repository.poll.PollJpaRepository; import java.util.List; import java.util.stream.IntStream; import org.junit.jupiter.api.extension.ExtendWith; @@ -31,6 +34,9 @@ public abstract class BaseServiceTest { @Autowired protected BellRepository bellRepository; + @Autowired + protected PollJpaRepository pollJpaRepository; + @Autowired protected MemberGenerator memberGenerator; @@ -43,6 +49,12 @@ public abstract class BaseServiceTest { @Autowired protected BellGenerator bellGenerator; + @Autowired + protected PollGenerator pollGenerator; + + @Autowired + protected VoteGenerator voteGenerator; + protected void runAtSameTime(int count, Runnable task) throws InterruptedException { List threads = IntStream.range(0, count) .mapToObj(i -> new Thread(task)) diff --git a/src/test/java/com/debatetimer/service/poll/PollServiceTest.java b/src/test/java/com/debatetimer/service/poll/PollServiceTest.java new file mode 100644 index 00000000..3a114cff --- /dev/null +++ b/src/test/java/com/debatetimer/service/poll/PollServiceTest.java @@ -0,0 +1,79 @@ +package com.debatetimer.service.poll; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertAll; + +import com.debatetimer.domain.member.Member; +import com.debatetimer.domain.poll.PollStatus; +import com.debatetimer.domain.poll.VoteTeam; +import com.debatetimer.dto.poll.response.PollCreateResponse; +import com.debatetimer.dto.poll.response.PollInfoResponse; +import com.debatetimer.entity.customize.CustomizeTableEntity; +import com.debatetimer.entity.poll.PollEntity; +import com.debatetimer.service.BaseServiceTest; +import java.util.Optional; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +class PollServiceTest extends BaseServiceTest { + + @Autowired + private PollService pollService; + + @Nested + class CreatePoll { + + @Test + void 선거를_생성한다() { + Member member = memberGenerator.generate("email@email.com"); + CustomizeTableEntity table = customizeTableGenerator.generate(member); + + PollCreateResponse createdPoll = pollService.create(table.getId(), member); + + Optional foundPoll = pollJpaRepository.findById(createdPoll.id()); + assertThat(foundPoll).isPresent(); + } + } + + @Nested + class ReadPollInfo { + + @Test + void 선거_정보를_읽어온다() { + Member member = memberGenerator.generate("email@email.com"); + CustomizeTableEntity table = customizeTableGenerator.generate(member); + PollEntity pollEntity = pollGenerator.generate(table, PollStatus.PROGRESS); + voteGenerator.generate(pollEntity, VoteTeam.PROS, "콜리"); + voteGenerator.generate(pollEntity, VoteTeam.PROS, "비토"); + voteGenerator.generate(pollEntity, VoteTeam.CONS, "커찬"); + + PollInfoResponse pollInfo = pollService.readPollInfo(table.getId(), member); + + assertAll( + () -> assertThat(pollInfo.id()).isEqualTo(pollEntity.getId()), + () -> assertThat(pollInfo.prosTeamName()).isEqualTo(pollEntity.getProsTeamName()), + () -> assertThat(pollInfo.consTeamName()).isEqualTo(pollEntity.getConsTeamName()), + () -> assertThat(pollInfo.status()).isEqualTo(pollEntity.getStatus()), + () -> assertThat(pollInfo.totalCount()).isEqualTo(3L), + () -> assertThat(pollInfo.prosCount()).isEqualTo(2L), + () -> assertThat(pollInfo.consCount()).isEqualTo(1L) + ); + } + } + + @Nested + class UpdateToDone { + + @Test + void 선거를_완료상태로_변경한다() { + Member member = memberGenerator.generate("email@email.com"); + CustomizeTableEntity table = customizeTableGenerator.generate(member); + pollGenerator.generate(table, PollStatus.PROGRESS); + + PollInfoResponse pollInfo = pollService.updateToDone(table.getId(), member); + + assertThat(pollInfo.status()).isEqualTo(PollStatus.DONE); + } + } +} From b0fb06ca914160e054f999536d42ee9d1fbefbb6 Mon Sep 17 00:00:00 2001 From: coli Date: Thu, 24 Jul 2025 04:35:03 +0900 Subject: [PATCH 15/29] =?UTF-8?q?rename:=20Jpa=20=EB=B2=A4=EB=8D=94=20?= =?UTF-8?q?=ED=91=9C=EA=B8=B0=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domainrepository/poll/PollDomainRepository.java | 8 ++++---- .../domainrepository/poll/VoteDomainRepository.java | 6 +++--- .../{PollJpaRepository.java => PollRepository.java} | 2 +- .../{VoteJpaRepository.java => VoteRepository.java} | 2 +- .../domainrepository/BaseDomainRepositoryTest.java | 4 ++-- .../poll/PollDomainRepositoryTest.java | 2 +- .../java/com/debatetimer/fixture/PollGenerator.java | 10 +++++----- .../java/com/debatetimer/fixture/VoteGenerator.java | 10 +++++----- .../java/com/debatetimer/service/BaseServiceTest.java | 4 ++-- .../com/debatetimer/service/poll/PollServiceTest.java | 2 +- 10 files changed, 25 insertions(+), 25 deletions(-) rename src/main/java/com/debatetimer/repository/poll/{PollJpaRepository.java => PollRepository.java} (76%) rename src/main/java/com/debatetimer/repository/poll/{VoteJpaRepository.java => VoteRepository.java} (74%) diff --git a/src/main/java/com/debatetimer/domainrepository/poll/PollDomainRepository.java b/src/main/java/com/debatetimer/domainrepository/poll/PollDomainRepository.java index 376a2b94..41765b1f 100644 --- a/src/main/java/com/debatetimer/domainrepository/poll/PollDomainRepository.java +++ b/src/main/java/com/debatetimer/domainrepository/poll/PollDomainRepository.java @@ -4,7 +4,7 @@ import com.debatetimer.entity.poll.PollEntity; import com.debatetimer.exception.custom.DTClientErrorException; import com.debatetimer.exception.errorcode.ClientErrorCode; -import com.debatetimer.repository.poll.PollJpaRepository; +import com.debatetimer.repository.poll.PollRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; @@ -13,12 +13,12 @@ @RequiredArgsConstructor public class PollDomainRepository { - private final PollJpaRepository pollJpaRepository; + private final PollRepository pollRepository; @Transactional public Poll create(Poll poll) { PollEntity pollEntity = new PollEntity(poll); - return pollJpaRepository.save(pollEntity) + return pollRepository.save(pollEntity) .toDomain(); } @@ -36,7 +36,7 @@ public Poll updateToDone(long pollId, long memberId) { } private PollEntity findPoll(long pollId, long memberId) { - return pollJpaRepository.findByIdAndMemberId(pollId, memberId) + return pollRepository.findByIdAndMemberId(pollId, memberId) .orElseThrow(() -> new DTClientErrorException(ClientErrorCode.POLL_NOT_FOUND)); } } diff --git a/src/main/java/com/debatetimer/domainrepository/poll/VoteDomainRepository.java b/src/main/java/com/debatetimer/domainrepository/poll/VoteDomainRepository.java index 4bfe4f40..3871f17a 100644 --- a/src/main/java/com/debatetimer/domainrepository/poll/VoteDomainRepository.java +++ b/src/main/java/com/debatetimer/domainrepository/poll/VoteDomainRepository.java @@ -3,7 +3,7 @@ import com.debatetimer.domain.poll.VoteInfo; import com.debatetimer.domain.poll.VoteTeam; import com.debatetimer.entity.poll.VoteEntity; -import com.debatetimer.repository.poll.VoteJpaRepository; +import com.debatetimer.repository.poll.VoteRepository; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -14,10 +14,10 @@ @RequiredArgsConstructor public class VoteDomainRepository { - private final VoteJpaRepository voteJpaRepository; + private final VoteRepository voteRepository; public VoteInfo findVoteInfoByPollId(long pollId) { - List pollVotes = voteJpaRepository.findAllByPollId(pollId); + List pollVotes = voteRepository.findAllByPollId(pollId); return resolveVoteInfo(pollId, pollVotes); } diff --git a/src/main/java/com/debatetimer/repository/poll/PollJpaRepository.java b/src/main/java/com/debatetimer/repository/poll/PollRepository.java similarity index 76% rename from src/main/java/com/debatetimer/repository/poll/PollJpaRepository.java rename to src/main/java/com/debatetimer/repository/poll/PollRepository.java index cef244d9..ae4f9026 100644 --- a/src/main/java/com/debatetimer/repository/poll/PollJpaRepository.java +++ b/src/main/java/com/debatetimer/repository/poll/PollRepository.java @@ -4,7 +4,7 @@ import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; -public interface PollJpaRepository extends JpaRepository { +public interface PollRepository extends JpaRepository { Optional findByIdAndMemberId(long id, long memberId); diff --git a/src/main/java/com/debatetimer/repository/poll/VoteJpaRepository.java b/src/main/java/com/debatetimer/repository/poll/VoteRepository.java similarity index 74% rename from src/main/java/com/debatetimer/repository/poll/VoteJpaRepository.java rename to src/main/java/com/debatetimer/repository/poll/VoteRepository.java index 95e2f858..a9709200 100644 --- a/src/main/java/com/debatetimer/repository/poll/VoteJpaRepository.java +++ b/src/main/java/com/debatetimer/repository/poll/VoteRepository.java @@ -4,7 +4,7 @@ import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; -public interface VoteJpaRepository extends JpaRepository { +public interface VoteRepository extends JpaRepository { List findAllByPollId(long pollId); } diff --git a/src/test/java/com/debatetimer/domainrepository/BaseDomainRepositoryTest.java b/src/test/java/com/debatetimer/domainrepository/BaseDomainRepositoryTest.java index 626c3747..37ac4fba 100644 --- a/src/test/java/com/debatetimer/domainrepository/BaseDomainRepositoryTest.java +++ b/src/test/java/com/debatetimer/domainrepository/BaseDomainRepositoryTest.java @@ -5,7 +5,7 @@ import com.debatetimer.fixture.MemberGenerator; import com.debatetimer.fixture.PollGenerator; import com.debatetimer.fixture.VoteGenerator; -import com.debatetimer.repository.poll.PollJpaRepository; +import com.debatetimer.repository.poll.PollRepository; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; @@ -27,5 +27,5 @@ public abstract class BaseDomainRepositoryTest { protected VoteGenerator voteGenerator; @Autowired - protected PollJpaRepository pollJpaRepository; + protected PollRepository pollRepository; } diff --git a/src/test/java/com/debatetimer/domainrepository/poll/PollDomainRepositoryTest.java b/src/test/java/com/debatetimer/domainrepository/poll/PollDomainRepositoryTest.java index 8619bc73..c40f529b 100644 --- a/src/test/java/com/debatetimer/domainrepository/poll/PollDomainRepositoryTest.java +++ b/src/test/java/com/debatetimer/domainrepository/poll/PollDomainRepositoryTest.java @@ -30,7 +30,7 @@ class CRUDTest { pollDomainRepository.create(poll); - Optional foundPollEntity = pollJpaRepository.findById(poll.getId()); + Optional foundPollEntity = pollRepository.findById(poll.getId()); assertThat(foundPollEntity).isPresent(); } diff --git a/src/test/java/com/debatetimer/fixture/PollGenerator.java b/src/test/java/com/debatetimer/fixture/PollGenerator.java index f702f17d..24059cba 100644 --- a/src/test/java/com/debatetimer/fixture/PollGenerator.java +++ b/src/test/java/com/debatetimer/fixture/PollGenerator.java @@ -4,16 +4,16 @@ import com.debatetimer.domain.poll.PollStatus; import com.debatetimer.entity.customize.CustomizeTableEntity; import com.debatetimer.entity.poll.PollEntity; -import com.debatetimer.repository.poll.PollJpaRepository; +import com.debatetimer.repository.poll.PollRepository; import org.springframework.stereotype.Component; @Component public class PollGenerator { - private final PollJpaRepository pollJpaRepository; + private final PollRepository pollRepository; - public PollGenerator(final PollJpaRepository pollJpaRepository) { - this.pollJpaRepository = pollJpaRepository; + public PollGenerator(final PollRepository pollRepository) { + this.pollRepository = pollRepository; } public PollEntity generate(CustomizeTableEntity customizeTableEntity, PollStatus status) { @@ -26,6 +26,6 @@ public PollEntity generate(CustomizeTableEntity customizeTableEntity, PollStatus "반대", "주제" ); - return pollJpaRepository.save(new PollEntity(poll)); + return pollRepository.save(new PollEntity(poll)); } } diff --git a/src/test/java/com/debatetimer/fixture/VoteGenerator.java b/src/test/java/com/debatetimer/fixture/VoteGenerator.java index 3fa2b5f6..9efdd80c 100644 --- a/src/test/java/com/debatetimer/fixture/VoteGenerator.java +++ b/src/test/java/com/debatetimer/fixture/VoteGenerator.java @@ -3,21 +3,21 @@ import com.debatetimer.domain.poll.VoteTeam; import com.debatetimer.entity.poll.PollEntity; import com.debatetimer.entity.poll.VoteEntity; -import com.debatetimer.repository.poll.VoteJpaRepository; +import com.debatetimer.repository.poll.VoteRepository; import java.util.UUID; import org.springframework.stereotype.Component; @Component public class VoteGenerator { - private final VoteJpaRepository voteJpaRepository; + private final VoteRepository voteRepository; - public VoteGenerator(VoteJpaRepository voteJpaRepository) { - this.voteJpaRepository = voteJpaRepository; + public VoteGenerator(VoteRepository voteRepository) { + this.voteRepository = voteRepository; } public VoteEntity generate(PollEntity pollEntity, VoteTeam team, String name) { VoteEntity vote = new VoteEntity(null, pollEntity, team, name, UUID.randomUUID().toString()); - return voteJpaRepository.save(vote); + return voteRepository.save(vote); } } diff --git a/src/test/java/com/debatetimer/service/BaseServiceTest.java b/src/test/java/com/debatetimer/service/BaseServiceTest.java index bdf70db3..a68e418d 100644 --- a/src/test/java/com/debatetimer/service/BaseServiceTest.java +++ b/src/test/java/com/debatetimer/service/BaseServiceTest.java @@ -11,7 +11,7 @@ import com.debatetimer.repository.customize.CustomizeTableRepository; import com.debatetimer.repository.customize.CustomizeTimeBoxRepository; import com.debatetimer.repository.member.MemberRepository; -import com.debatetimer.repository.poll.PollJpaRepository; +import com.debatetimer.repository.poll.PollRepository; import java.util.List; import java.util.stream.IntStream; import org.junit.jupiter.api.extension.ExtendWith; @@ -35,7 +35,7 @@ public abstract class BaseServiceTest { protected BellRepository bellRepository; @Autowired - protected PollJpaRepository pollJpaRepository; + protected PollRepository pollRepository; @Autowired protected MemberGenerator memberGenerator; diff --git a/src/test/java/com/debatetimer/service/poll/PollServiceTest.java b/src/test/java/com/debatetimer/service/poll/PollServiceTest.java index 3a114cff..4347ed7e 100644 --- a/src/test/java/com/debatetimer/service/poll/PollServiceTest.java +++ b/src/test/java/com/debatetimer/service/poll/PollServiceTest.java @@ -31,7 +31,7 @@ class CreatePoll { PollCreateResponse createdPoll = pollService.create(table.getId(), member); - Optional foundPoll = pollJpaRepository.findById(createdPoll.id()); + Optional foundPoll = pollRepository.findById(createdPoll.id()); assertThat(foundPoll).isPresent(); } } From aed0b799bfbe25f3bba614883144a98634c409ee Mon Sep 17 00:00:00 2001 From: coli Date: Thu, 24 Jul 2025 04:43:02 +0900 Subject: [PATCH 16/29] =?UTF-8?q?test:=20controllerTest=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/BaseControllerTest.java | 8 ++ .../controller/poll/PollControllerTest.java | 93 +++++++++++++++++++ 2 files changed, 101 insertions(+) create mode 100644 src/test/java/com/debatetimer/controller/poll/PollControllerTest.java diff --git a/src/test/java/com/debatetimer/controller/BaseControllerTest.java b/src/test/java/com/debatetimer/controller/BaseControllerTest.java index 2ca415ea..83d35dda 100644 --- a/src/test/java/com/debatetimer/controller/BaseControllerTest.java +++ b/src/test/java/com/debatetimer/controller/BaseControllerTest.java @@ -12,7 +12,9 @@ import com.debatetimer.fixture.CustomizeTimeBoxGenerator; import com.debatetimer.fixture.HeaderGenerator; import com.debatetimer.fixture.MemberGenerator; +import com.debatetimer.fixture.PollGenerator; import com.debatetimer.fixture.TokenGenerator; +import com.debatetimer.fixture.VoteGenerator; import com.debatetimer.repository.customize.CustomizeTableRepository; import com.navercorp.fixturemonkey.ArbitraryBuilder; import com.navercorp.fixturemonkey.FixtureMonkey; @@ -45,6 +47,12 @@ public abstract class BaseControllerTest { @Autowired protected CustomizeTimeBoxGenerator customizeTimeBoxGenerator; + @Autowired + protected PollGenerator pollGenerator; + + @Autowired + protected VoteGenerator voteGenerator; + @Autowired protected HeaderGenerator headerGenerator; diff --git a/src/test/java/com/debatetimer/controller/poll/PollControllerTest.java b/src/test/java/com/debatetimer/controller/poll/PollControllerTest.java new file mode 100644 index 00000000..4a0db146 --- /dev/null +++ b/src/test/java/com/debatetimer/controller/poll/PollControllerTest.java @@ -0,0 +1,93 @@ +package com.debatetimer.controller.poll; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertAll; + +import com.debatetimer.controller.BaseControllerTest; +import com.debatetimer.domain.member.Member; +import com.debatetimer.domain.poll.PollStatus; +import com.debatetimer.domain.poll.VoteTeam; +import com.debatetimer.dto.poll.response.PollInfoResponse; +import com.debatetimer.entity.customize.CustomizeTableEntity; +import com.debatetimer.entity.poll.PollEntity; +import io.restassured.http.ContentType; +import io.restassured.http.Headers; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.springframework.http.HttpStatus; + +class PollControllerTest extends BaseControllerTest { + + @Nested + class CreatePoll { + + @Test + void 선거를_생성할_수_있다() { + Member member = memberGenerator.generate("email@email.com"); + CustomizeTableEntity table = customizeTableGenerator.generate(member); + Headers headers = headerGenerator.generateAccessTokenHeader(member); + + given() + .contentType(ContentType.JSON) + .headers(headers) + .pathParam("tableId", table.getId()) + .when().post("/api/polls/{tableId}") + .then().statusCode(HttpStatus.CREATED.value()); + } + } + + @Nested + class ReadPollInfo { + + @Test + void 선거정보를_읽을_수_있다() { + Member member = memberGenerator.generate("email@email.com"); + CustomizeTableEntity table = customizeTableGenerator.generate(member); + PollEntity pollEntity = pollGenerator.generate(table, PollStatus.PROGRESS); + voteGenerator.generate(pollEntity, VoteTeam.PROS, "콜리"); + voteGenerator.generate(pollEntity, VoteTeam.PROS, "비토"); + voteGenerator.generate(pollEntity, VoteTeam.CONS, "커찬"); + Headers headers = headerGenerator.generateAccessTokenHeader(member); + + PollInfoResponse response = given() + .contentType(ContentType.JSON) + .headers(headers) + .pathParam("pollId", pollEntity.getId()) + .when().get("/api/polls/{pollId}") + .then().statusCode(HttpStatus.OK.value()) + .extract().as(PollInfoResponse.class); + + assertAll( + () -> assertThat(response.id()).isEqualTo(pollEntity.getId()), + () -> assertThat(response.prosTeamName()).isEqualTo(pollEntity.getProsTeamName()), + () -> assertThat(response.consTeamName()).isEqualTo(pollEntity.getConsTeamName()), + () -> assertThat(response.status()).isEqualTo(pollEntity.getStatus()), + () -> assertThat(response.totalCount()).isEqualTo(3L), + () -> assertThat(response.prosCount()).isEqualTo(2L), + () -> assertThat(response.consCount()).isEqualTo(1L) + ); + } + } + + @Nested + class UpdateToDone { + + @Test + void 선거정보를_완료상태로_변경한다() { + Member member = memberGenerator.generate("email@email.com"); + CustomizeTableEntity table = customizeTableGenerator.generate(member); + PollEntity pollEntity = pollGenerator.generate(table, PollStatus.PROGRESS); + Headers headers = headerGenerator.generateAccessTokenHeader(member); + + PollInfoResponse response = given() + .contentType(ContentType.JSON) + .headers(headers) + .pathParam("pollId", pollEntity.getId()) + .when().patch("/api/polls/{pollId}") + .then().statusCode(HttpStatus.OK.value()) + .extract().as(PollInfoResponse.class); + + assertThat(response.status()).isEqualTo(PollStatus.DONE); + } + } +} From f973177ebb09b7ed8d5d80506d740e95f0f969f6 Mon Sep 17 00:00:00 2001 From: coli Date: Thu, 24 Jul 2025 04:44:03 +0900 Subject: [PATCH 17/29] =?UTF-8?q?fix:=20=EC=8B=A4=ED=8C=A8=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=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 --- .../domainrepository/poll/PollDomainRepositoryTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/com/debatetimer/domainrepository/poll/PollDomainRepositoryTest.java b/src/test/java/com/debatetimer/domainrepository/poll/PollDomainRepositoryTest.java index c40f529b..8a54f1ea 100644 --- a/src/test/java/com/debatetimer/domainrepository/poll/PollDomainRepositoryTest.java +++ b/src/test/java/com/debatetimer/domainrepository/poll/PollDomainRepositoryTest.java @@ -28,9 +28,9 @@ class CRUDTest { CustomizeTableEntity table = customizeTableGenerator.generate(member); Poll poll = new Poll(null, table.getId(), member.getId(), PollStatus.PROGRESS, "찬성", "반대", "주제"); - pollDomainRepository.create(poll); + Poll createdPoll = pollDomainRepository.create(poll); - Optional foundPollEntity = pollRepository.findById(poll.getId()); + Optional foundPollEntity = pollRepository.findById(createdPoll.getId()); assertThat(foundPollEntity).isPresent(); } From 22c2302e057f703a9c58473e35cb60184834868e Mon Sep 17 00:00:00 2001 From: coli Date: Thu, 24 Jul 2025 04:58:59 +0900 Subject: [PATCH 18/29] =?UTF-8?q?test:=20=EB=AC=B8=EC=84=9C=ED=99=94=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/BaseDocumentTest.java | 4 + .../java/com/debatetimer/controller/Tag.java | 1 + .../controller/poll/PollDocumentTest.java | 165 ++++++++++++++++++ 3 files changed, 170 insertions(+) create mode 100644 src/test/java/com/debatetimer/controller/poll/PollDocumentTest.java diff --git a/src/test/java/com/debatetimer/controller/BaseDocumentTest.java b/src/test/java/com/debatetimer/controller/BaseDocumentTest.java index 206c8cda..40c80cc1 100644 --- a/src/test/java/com/debatetimer/controller/BaseDocumentTest.java +++ b/src/test/java/com/debatetimer/controller/BaseDocumentTest.java @@ -12,6 +12,7 @@ import com.debatetimer.service.auth.AuthService; import com.debatetimer.service.customize.CustomizeService; import com.debatetimer.service.member.MemberService; +import com.debatetimer.service.poll.PollService; import io.restassured.RestAssured; import io.restassured.builder.RequestSpecBuilder; import io.restassured.filter.log.RequestLoggingFilter; @@ -62,6 +63,9 @@ public abstract class BaseDocumentTest { @MockitoBean protected AuthService authService; + @MockitoBean + protected PollService pollService; + @MockitoBean protected AuthManager authManager; diff --git a/src/test/java/com/debatetimer/controller/Tag.java b/src/test/java/com/debatetimer/controller/Tag.java index c7dfa897..39a3c588 100644 --- a/src/test/java/com/debatetimer/controller/Tag.java +++ b/src/test/java/com/debatetimer/controller/Tag.java @@ -6,6 +6,7 @@ public enum Tag { PARLIAMENTARY_API("Parliamentary Table API"), TIME_BASED_API("Time Based Table API"), CUSTOMIZE_API("Customize Table API"), + POLL_API("Poll API"), ; private final String displayName; diff --git a/src/test/java/com/debatetimer/controller/poll/PollDocumentTest.java b/src/test/java/com/debatetimer/controller/poll/PollDocumentTest.java new file mode 100644 index 00000000..0f94241c --- /dev/null +++ b/src/test/java/com/debatetimer/controller/poll/PollDocumentTest.java @@ -0,0 +1,165 @@ +package com.debatetimer.controller.poll; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.Mockito.doReturn; +import static org.springframework.restdocs.headers.HeaderDocumentation.headerWithName; +import static org.springframework.restdocs.payload.JsonFieldType.NUMBER; +import static org.springframework.restdocs.payload.JsonFieldType.STRING; +import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; +import static org.springframework.restdocs.request.RequestDocumentation.parameterWithName; + +import com.debatetimer.controller.BaseDocumentTest; +import com.debatetimer.controller.RestDocumentationRequest; +import com.debatetimer.controller.RestDocumentationResponse; +import com.debatetimer.controller.Tag; +import com.debatetimer.domain.member.Member; +import com.debatetimer.domain.poll.PollStatus; +import com.debatetimer.dto.poll.response.PollCreateResponse; +import com.debatetimer.dto.poll.response.PollInfoResponse; +import io.restassured.http.ContentType; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.springframework.http.HttpHeaders; + +public class PollDocumentTest extends BaseDocumentTest { + + @Nested + class CreatePoll { + + private final RestDocumentationRequest requestDocument = request() + .tag(Tag.POLL_API) + .summary("선거 생성") + .requestHeader( + headerWithName(HttpHeaders.AUTHORIZATION).description("액세스 토큰") + ) + .pathParameter( + parameterWithName("tableId").description("테이블 ID") + ); + + private final RestDocumentationResponse responseDocument = response() + .responseBodyField( + fieldWithPath("id").type(NUMBER).description("선거 ID") + ); + + @Test + void 선거_생성_성공() { + PollCreateResponse response = new PollCreateResponse(1l); + doReturn(response).when(pollService).create(anyLong(), any(Member.class)); + + var document = document("poll/post", 201) + .request(requestDocument) + .response(responseDocument) + .build(); + + given(document) + .contentType(ContentType.JSON) + .headers(EXIST_MEMBER_HEADER) + .pathParam("tableId", 1l) + .when().post("/api/polls/{tableId}") + .then().statusCode(201); + } + } + + @Nested + class ReadPollInfo { + + private final RestDocumentationRequest requestDocument = request() + .tag(Tag.POLL_API) + .summary("선거 정보 조회") + .requestHeader( + headerWithName(HttpHeaders.AUTHORIZATION).description("액세스 토큰") + ) + .pathParameter( + parameterWithName("pollId").description("선거 ID") + ); + + private final RestDocumentationResponse responseDocument = response() + .responseBodyField( + fieldWithPath("id").type(NUMBER).description("선거 ID"), + fieldWithPath("status").type(STRING).description("선거 상태 - 진행중 : PROGRESS, 완료 : DONE"), + fieldWithPath("prosTeamName").type(STRING).description("찬성측 팀 이름"), + fieldWithPath("consTeamName").type(STRING).description("반대측 팀 이름"), + fieldWithPath("totalCount").type(NUMBER).description("전체 투표 수"), + fieldWithPath("prosCount").type(NUMBER).description("찬성 투표 수"), + fieldWithPath("consCount").type(NUMBER).description("반대 투표 수") + ); + + @Test + void 선거_정보_조회() { + PollInfoResponse response = new PollInfoResponse( + 1L, + PollStatus.PROGRESS, + "찬성", + "반대", + 3L, + 2L, + 1L + ); + doReturn(response).when(pollService).readPollInfo(anyLong(), any(Member.class)); + + var document = document("poll/get", 200) + .request(requestDocument) + .response(responseDocument) + .build(); + + given(document) + .contentType(ContentType.JSON) + .headers(EXIST_MEMBER_HEADER) + .pathParam("pollId", 1l) + .when().get("/api/polls/{pollId}") + .then().statusCode(200); + } + } + + @Nested + class UpdateToDone { + + private final RestDocumentationRequest requestDocument = request() + .tag(Tag.POLL_API) + .summary("선거 완료") + .requestHeader( + headerWithName(HttpHeaders.AUTHORIZATION).description("액세스 토큰") + ) + .pathParameter( + parameterWithName("pollId").description("선거 ID") + ); + + private final RestDocumentationResponse responseDocument = response() + .responseBodyField( + fieldWithPath("id").type(NUMBER).description("선거 ID"), + fieldWithPath("status").type(STRING).description("선거 상태 - 진행중 : PROGRESS, 완료 : DONE"), + fieldWithPath("prosTeamName").type(STRING).description("찬성측 팀 이름"), + fieldWithPath("consTeamName").type(STRING).description("반대측 팀 이름"), + fieldWithPath("totalCount").type(NUMBER).description("전체 투표 수"), + fieldWithPath("prosCount").type(NUMBER).description("찬성 투표 수"), + fieldWithPath("consCount").type(NUMBER).description("반대 투표 수") + ); + + @Test + void 선거_완료() { + PollInfoResponse response = new PollInfoResponse( + 1L, + PollStatus.PROGRESS, + "찬성", + "반대", + 3L, + 2L, + 1L + ); + doReturn(response).when(pollService).updateToDone(anyLong(), any(Member.class)); + + var document = document("poll/patch", 200) + .request(requestDocument) + .response(responseDocument) + .build(); + + given(document) + .contentType(ContentType.JSON) + .headers(EXIST_MEMBER_HEADER) + .pathParam("pollId", 1l) + .when().patch("/api/polls/{pollId}") + .then().statusCode(200); + } + } +} From f4f986676138cf5c30695b612b6162ab1a8385cd Mon Sep 17 00:00:00 2001 From: coli Date: Thu, 24 Jul 2025 17:50:31 +0900 Subject: [PATCH 19/29] =?UTF-8?q?refactor:=20=ED=88=AC=ED=91=9C=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=EC=8B=9C=20=EB=8B=A4=EB=A5=B8=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=EB=93=A4=EB=8F=84=20=EA=B0=99=EC=9D=B4=20=EB=84=98?= =?UTF-8?q?=EA=B8=B0=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 --- .../dto/poll/response/PollCreateResponse.java | 10 ++++++++-- .../debatetimer/controller/poll/PollDocumentTest.java | 7 +++++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/debatetimer/dto/poll/response/PollCreateResponse.java b/src/main/java/com/debatetimer/dto/poll/response/PollCreateResponse.java index 7f2741ee..462ec3d5 100644 --- a/src/main/java/com/debatetimer/dto/poll/response/PollCreateResponse.java +++ b/src/main/java/com/debatetimer/dto/poll/response/PollCreateResponse.java @@ -1,10 +1,16 @@ package com.debatetimer.dto.poll.response; import com.debatetimer.domain.poll.Poll; +import com.debatetimer.domain.poll.PollStatus; -public record PollCreateResponse(long id) { +public record PollCreateResponse( + long id, + PollStatus status, + String prosTeamName, + String consTeamName +) { public PollCreateResponse(Poll poll) { - this(poll.getId()); + this(poll.getId(), poll.getStatus(), poll.getProsTeamName().getValue(), poll.getConsTeamName().getValue()); } } diff --git a/src/test/java/com/debatetimer/controller/poll/PollDocumentTest.java b/src/test/java/com/debatetimer/controller/poll/PollDocumentTest.java index 0f94241c..a896df8d 100644 --- a/src/test/java/com/debatetimer/controller/poll/PollDocumentTest.java +++ b/src/test/java/com/debatetimer/controller/poll/PollDocumentTest.java @@ -39,12 +39,15 @@ class CreatePoll { private final RestDocumentationResponse responseDocument = response() .responseBodyField( - fieldWithPath("id").type(NUMBER).description("선거 ID") + fieldWithPath("id").type(NUMBER).description("선거 ID"), + fieldWithPath("status").type(STRING).description("선거 상태 - 진행중 : PROGRESS, 완료 : DONE"), + fieldWithPath("prosTeamName").type(STRING).description("찬성측 팀 이름"), + fieldWithPath("consTeamName").type(STRING).description("반대측 팀 이름") ); @Test void 선거_생성_성공() { - PollCreateResponse response = new PollCreateResponse(1l); + PollCreateResponse response = new PollCreateResponse(1l, PollStatus.PROGRESS, "찬성", "반대"); doReturn(response).when(pollService).create(anyLong(), any(Member.class)); var document = document("poll/post", 201) From 8991862fde59f86df55a5f9d733fedfaa322ffe8 Mon Sep 17 00:00:00 2001 From: coli Date: Thu, 24 Jul 2025 17:56:39 +0900 Subject: [PATCH 20/29] rename : updateToDone > finishPoll --- .../java/com/debatetimer/controller/poll/PollController.java | 4 ++-- .../domainrepository/poll/PollDomainRepository.java | 2 +- src/main/java/com/debatetimer/service/poll/PollService.java | 4 ++-- .../com/debatetimer/controller/poll/PollControllerTest.java | 2 +- .../com/debatetimer/controller/poll/PollDocumentTest.java | 4 ++-- .../domainrepository/poll/PollDomainRepositoryTest.java | 2 +- .../java/com/debatetimer/service/poll/PollServiceTest.java | 4 ++-- 7 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/debatetimer/controller/poll/PollController.java b/src/main/java/com/debatetimer/controller/poll/PollController.java index 5a5333b1..a0c8748b 100644 --- a/src/main/java/com/debatetimer/controller/poll/PollController.java +++ b/src/main/java/com/debatetimer/controller/poll/PollController.java @@ -40,10 +40,10 @@ public PollInfoResponse readPollInfo( @PatchMapping("/api/polls/{pollId}") @ResponseStatus(HttpStatus.OK) - public PollInfoResponse updateToDone( + public PollInfoResponse finishPoll( @AuthMember Member member, @PathVariable(name = "pollId") long pollId ) { - return pollService.updateToDone(pollId, member); + return pollService.finishPoll(pollId, member); } } diff --git a/src/main/java/com/debatetimer/domainrepository/poll/PollDomainRepository.java b/src/main/java/com/debatetimer/domainrepository/poll/PollDomainRepository.java index 41765b1f..fa46adfb 100644 --- a/src/main/java/com/debatetimer/domainrepository/poll/PollDomainRepository.java +++ b/src/main/java/com/debatetimer/domainrepository/poll/PollDomainRepository.java @@ -29,7 +29,7 @@ public Poll getByIdAndMemberId(long id, long memberId) { } @Transactional - public Poll updateToDone(long pollId, long memberId) { + public Poll finishPoll(long pollId, long memberId) { PollEntity pollEntity = findPoll(pollId, memberId); pollEntity.updateToDone(); return pollEntity.toDomain(); diff --git a/src/main/java/com/debatetimer/service/poll/PollService.java b/src/main/java/com/debatetimer/service/poll/PollService.java index 8e3dc691..3d4df5b6 100644 --- a/src/main/java/com/debatetimer/service/poll/PollService.java +++ b/src/main/java/com/debatetimer/service/poll/PollService.java @@ -39,8 +39,8 @@ public PollInfoResponse readPollInfo(long pollId, Member member) { } @Transactional - public PollInfoResponse updateToDone(long pollId, Member member) { - Poll poll = pollDomainRepository.updateToDone(pollId, member.getId()); + public PollInfoResponse finishPoll(long pollId, Member member) { + Poll poll = pollDomainRepository.finishPoll(pollId, member.getId()); VoteInfo voteInfo = voteDomainRepository.findVoteInfoByPollId(pollId); return new PollInfoResponse(poll, voteInfo); } diff --git a/src/test/java/com/debatetimer/controller/poll/PollControllerTest.java b/src/test/java/com/debatetimer/controller/poll/PollControllerTest.java index 4a0db146..6f488709 100644 --- a/src/test/java/com/debatetimer/controller/poll/PollControllerTest.java +++ b/src/test/java/com/debatetimer/controller/poll/PollControllerTest.java @@ -70,7 +70,7 @@ class ReadPollInfo { } @Nested - class UpdateToDone { + class FinishPoll { @Test void 선거정보를_완료상태로_변경한다() { diff --git a/src/test/java/com/debatetimer/controller/poll/PollDocumentTest.java b/src/test/java/com/debatetimer/controller/poll/PollDocumentTest.java index a896df8d..e704cccb 100644 --- a/src/test/java/com/debatetimer/controller/poll/PollDocumentTest.java +++ b/src/test/java/com/debatetimer/controller/poll/PollDocumentTest.java @@ -116,7 +116,7 @@ class ReadPollInfo { } @Nested - class UpdateToDone { + class FinishPoll { private final RestDocumentationRequest requestDocument = request() .tag(Tag.POLL_API) @@ -150,7 +150,7 @@ class UpdateToDone { 2L, 1L ); - doReturn(response).when(pollService).updateToDone(anyLong(), any(Member.class)); + doReturn(response).when(pollService).finishPoll(anyLong(), any(Member.class)); var document = document("poll/patch", 200) .request(requestDocument) diff --git a/src/test/java/com/debatetimer/domainrepository/poll/PollDomainRepositoryTest.java b/src/test/java/com/debatetimer/domainrepository/poll/PollDomainRepositoryTest.java index 8a54f1ea..b057dd4c 100644 --- a/src/test/java/com/debatetimer/domainrepository/poll/PollDomainRepositoryTest.java +++ b/src/test/java/com/debatetimer/domainrepository/poll/PollDomainRepositoryTest.java @@ -58,7 +58,7 @@ class CRUDTest { CustomizeTableEntity table = customizeTableGenerator.generate(member); PollEntity pollEntity = pollGenerator.generate(table, PollStatus.PROGRESS); - Poll updatedPoll = pollDomainRepository.updateToDone(pollEntity.getId(), member.getId()); + Poll updatedPoll = pollDomainRepository.finishPoll(pollEntity.getId(), member.getId()); assertThat(updatedPoll.getStatus()).isEqualTo(PollStatus.DONE); } diff --git a/src/test/java/com/debatetimer/service/poll/PollServiceTest.java b/src/test/java/com/debatetimer/service/poll/PollServiceTest.java index 4347ed7e..990d0b14 100644 --- a/src/test/java/com/debatetimer/service/poll/PollServiceTest.java +++ b/src/test/java/com/debatetimer/service/poll/PollServiceTest.java @@ -63,7 +63,7 @@ class ReadPollInfo { } @Nested - class UpdateToDone { + class FinishPoll { @Test void 선거를_완료상태로_변경한다() { @@ -71,7 +71,7 @@ class UpdateToDone { CustomizeTableEntity table = customizeTableGenerator.generate(member); pollGenerator.generate(table, PollStatus.PROGRESS); - PollInfoResponse pollInfo = pollService.updateToDone(table.getId(), member); + PollInfoResponse pollInfo = pollService.finishPoll(table.getId(), member); assertThat(pollInfo.status()).isEqualTo(PollStatus.DONE); } From 117a5f1b6f324196946f0bf9d5138b90e32bdb1b Mon Sep 17 00:00:00 2001 From: coli Date: Thu, 24 Jul 2025 18:03:30 +0900 Subject: [PATCH 21/29] rename : resolveVoteInfo > countVotes --- .../domainrepository/poll/VoteDomainRepository.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/debatetimer/domainrepository/poll/VoteDomainRepository.java b/src/main/java/com/debatetimer/domainrepository/poll/VoteDomainRepository.java index 3871f17a..97f8dd1f 100644 --- a/src/main/java/com/debatetimer/domainrepository/poll/VoteDomainRepository.java +++ b/src/main/java/com/debatetimer/domainrepository/poll/VoteDomainRepository.java @@ -18,10 +18,10 @@ public class VoteDomainRepository { public VoteInfo findVoteInfoByPollId(long pollId) { List pollVotes = voteRepository.findAllByPollId(pollId); - return resolveVoteInfo(pollId, pollVotes); + return countVotes(pollId, pollVotes); } - private VoteInfo resolveVoteInfo(long pollId, List voteEntities) { + private VoteInfo countVotes(long pollId, List voteEntities) { Map teamCount = voteEntities.stream() .collect(Collectors.groupingBy(VoteEntity::getTeam, Collectors.counting())); long prosCount = teamCount.getOrDefault(VoteTeam.PROS, 0L); From c9666f9cdbce234ba772a1a82785889fd5ad4c41 Mon Sep 17 00:00:00 2001 From: coli Date: Thu, 24 Jul 2025 18:19:51 +0900 Subject: [PATCH 22/29] =?UTF-8?q?style:=20=EB=AC=B4=EC=9D=98=EB=AF=B8?= =?UTF-8?q?=ED=95=9C=20=EA=B0=9C=ED=96=89=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/debatetimer/exception/errorcode/ClientErrorCode.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/debatetimer/exception/errorcode/ClientErrorCode.java b/src/main/java/com/debatetimer/exception/errorcode/ClientErrorCode.java index 042ee82a..f0672c70 100644 --- a/src/main/java/com/debatetimer/exception/errorcode/ClientErrorCode.java +++ b/src/main/java/com/debatetimer/exception/errorcode/ClientErrorCode.java @@ -51,7 +51,6 @@ public enum ClientErrorCode implements ResponseErrorCode { INVALID_POLL_PARTICIPANT_NAME(HttpStatus.BAD_REQUEST, "잘못된 투표자 이름입니다"), INVALID_POLL_PARTICIPANT_CODE(HttpStatus.BAD_REQUEST, "잘못된 투표참여 코드입니다"), - TABLE_NOT_FOUND(HttpStatus.NOT_FOUND, "토론 테이블을 찾을 수 없습니다."), NOT_TABLE_OWNER(HttpStatus.UNAUTHORIZED, "테이블을 소유한 회원이 아닙니다."), POLL_NOT_FOUND(HttpStatus.NOT_FOUND, "투표를 찾을 수 없습니다."), From 32cfd076ce4be34e19bd59746547fc7191b98b90 Mon Sep 17 00:00:00 2001 From: coli Date: Thu, 24 Jul 2025 18:20:24 +0900 Subject: [PATCH 23/29] =?UTF-8?q?style:=20=EB=AC=B4=EC=9D=98=EB=AF=B8?= =?UTF-8?q?=ED=95=9C=20=EA=B0=9C=ED=96=89=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/debatetimer/repository/poll/PollRepository.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/debatetimer/repository/poll/PollRepository.java b/src/main/java/com/debatetimer/repository/poll/PollRepository.java index ae4f9026..121d1627 100644 --- a/src/main/java/com/debatetimer/repository/poll/PollRepository.java +++ b/src/main/java/com/debatetimer/repository/poll/PollRepository.java @@ -7,5 +7,4 @@ public interface PollRepository extends JpaRepository { Optional findByIdAndMemberId(long id, long memberId); - } From 0d58848f19ed12ca833b717ebbbbb09ba6ff8dc0 Mon Sep 17 00:00:00 2001 From: coli Date: Thu, 24 Jul 2025 18:24:17 +0900 Subject: [PATCH 24/29] =?UTF-8?q?refactor:=20=EC=B4=88=EA=B8=B0=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=EC=9E=90=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/debatetimer/domain/poll/Poll.java | 5 +++++ src/main/java/com/debatetimer/service/poll/PollService.java | 5 ++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/debatetimer/domain/poll/Poll.java b/src/main/java/com/debatetimer/domain/poll/Poll.java index 35c19a17..fd1c15a5 100644 --- a/src/main/java/com/debatetimer/domain/poll/Poll.java +++ b/src/main/java/com/debatetimer/domain/poll/Poll.java @@ -17,6 +17,11 @@ public class Poll { private final TeamName consTeamName; private final Agenda agenda; + public Poll(long tableId, long memberId, String prosTeamName, String consTeamName, String agenda) { + this(null, tableId, memberId, PollStatus.PROGRESS, + new TeamName(prosTeamName), new TeamName(consTeamName), new Agenda(agenda)); + } + public Poll(Long id, long tableId, long memberId, PollStatus status, String prosTeamName, String consTeamName, String agenda) { this(id, tableId, memberId, status, new TeamName(prosTeamName), new TeamName(consTeamName), new Agenda(agenda)); diff --git a/src/main/java/com/debatetimer/service/poll/PollService.java b/src/main/java/com/debatetimer/service/poll/PollService.java index 3d4df5b6..bb61fb83 100644 --- a/src/main/java/com/debatetimer/service/poll/PollService.java +++ b/src/main/java/com/debatetimer/service/poll/PollService.java @@ -3,7 +3,6 @@ import com.debatetimer.domain.customize.CustomizeTable; import com.debatetimer.domain.member.Member; import com.debatetimer.domain.poll.Poll; -import com.debatetimer.domain.poll.PollStatus; import com.debatetimer.domain.poll.VoteInfo; import com.debatetimer.domainrepository.poll.CustomizeTableDomainRepository; import com.debatetimer.domainrepository.poll.PollDomainRepository; @@ -25,8 +24,8 @@ public class PollService { @Transactional public PollCreateResponse create(long tableId, Member member) { CustomizeTable table = customizeTableDomainRepository.getByIdAndMember(tableId, member); - Poll poll = new Poll(null, table.getId(), member.getId(), PollStatus.PROGRESS, - table.getProsTeamName(), table.getConsTeamName(), table.getAgenda()); + Poll poll = new Poll(table.getId(), member.getId(), table.getProsTeamName(), + table.getConsTeamName(), table.getAgenda()); Poll savedPoll = pollDomainRepository.create(poll); return new PollCreateResponse(savedPoll); } From 9134f8453e36eb8ce0e1bc7421204630fe3f05b7 Mon Sep 17 00:00:00 2001 From: coli Date: Thu, 24 Jul 2025 18:27:04 +0900 Subject: [PATCH 25/29] rename : readPollInfo > getPollInfo --- .../java/com/debatetimer/controller/poll/PollController.java | 4 ++-- src/main/java/com/debatetimer/service/poll/PollService.java | 2 +- .../com/debatetimer/controller/poll/PollControllerTest.java | 2 +- .../com/debatetimer/controller/poll/PollDocumentTest.java | 4 ++-- .../java/com/debatetimer/service/poll/PollServiceTest.java | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/debatetimer/controller/poll/PollController.java b/src/main/java/com/debatetimer/controller/poll/PollController.java index a0c8748b..88da0830 100644 --- a/src/main/java/com/debatetimer/controller/poll/PollController.java +++ b/src/main/java/com/debatetimer/controller/poll/PollController.java @@ -31,11 +31,11 @@ public PollCreateResponse createPoll( @GetMapping("/api/polls/{pollId}") @ResponseStatus(HttpStatus.OK) - public PollInfoResponse readPollInfo( + public PollInfoResponse getPollInfo( @AuthMember Member member, @PathVariable(name = "pollId") long pollId ) { - return pollService.readPollInfo(pollId, member); + return pollService.getPollInfo(pollId, member); } @PatchMapping("/api/polls/{pollId}") diff --git a/src/main/java/com/debatetimer/service/poll/PollService.java b/src/main/java/com/debatetimer/service/poll/PollService.java index bb61fb83..a6409fdb 100644 --- a/src/main/java/com/debatetimer/service/poll/PollService.java +++ b/src/main/java/com/debatetimer/service/poll/PollService.java @@ -31,7 +31,7 @@ public PollCreateResponse create(long tableId, Member member) { } @Transactional(readOnly = true) - public PollInfoResponse readPollInfo(long pollId, Member member) { + public PollInfoResponse getPollInfo(long pollId, Member member) { Poll poll = pollDomainRepository.getByIdAndMemberId(pollId, member.getId()); VoteInfo voteInfo = voteDomainRepository.findVoteInfoByPollId(pollId); return new PollInfoResponse(poll, voteInfo); diff --git a/src/test/java/com/debatetimer/controller/poll/PollControllerTest.java b/src/test/java/com/debatetimer/controller/poll/PollControllerTest.java index 6f488709..22487d85 100644 --- a/src/test/java/com/debatetimer/controller/poll/PollControllerTest.java +++ b/src/test/java/com/debatetimer/controller/poll/PollControllerTest.java @@ -37,7 +37,7 @@ class CreatePoll { } @Nested - class ReadPollInfo { + class GetPollInfo { @Test void 선거정보를_읽을_수_있다() { diff --git a/src/test/java/com/debatetimer/controller/poll/PollDocumentTest.java b/src/test/java/com/debatetimer/controller/poll/PollDocumentTest.java index e704cccb..61d39fe4 100644 --- a/src/test/java/com/debatetimer/controller/poll/PollDocumentTest.java +++ b/src/test/java/com/debatetimer/controller/poll/PollDocumentTest.java @@ -65,7 +65,7 @@ class CreatePoll { } @Nested - class ReadPollInfo { + class GetPollInfo { private final RestDocumentationRequest requestDocument = request() .tag(Tag.POLL_API) @@ -99,7 +99,7 @@ class ReadPollInfo { 2L, 1L ); - doReturn(response).when(pollService).readPollInfo(anyLong(), any(Member.class)); + doReturn(response).when(pollService).getPollInfo(anyLong(), any(Member.class)); var document = document("poll/get", 200) .request(requestDocument) diff --git a/src/test/java/com/debatetimer/service/poll/PollServiceTest.java b/src/test/java/com/debatetimer/service/poll/PollServiceTest.java index 990d0b14..fd5c96c2 100644 --- a/src/test/java/com/debatetimer/service/poll/PollServiceTest.java +++ b/src/test/java/com/debatetimer/service/poll/PollServiceTest.java @@ -37,7 +37,7 @@ class CreatePoll { } @Nested - class ReadPollInfo { + class GetPollInfo { @Test void 선거_정보를_읽어온다() { @@ -48,7 +48,7 @@ class ReadPollInfo { voteGenerator.generate(pollEntity, VoteTeam.PROS, "비토"); voteGenerator.generate(pollEntity, VoteTeam.CONS, "커찬"); - PollInfoResponse pollInfo = pollService.readPollInfo(table.getId(), member); + PollInfoResponse pollInfo = pollService.getPollInfo(table.getId(), member); assertAll( () -> assertThat(pollInfo.id()).isEqualTo(pollEntity.getId()), From 7da7c6ee631331c665bee39eb7aa8bc0b0bc6684 Mon Sep 17 00:00:00 2001 From: coli Date: Thu, 24 Jul 2025 18:28:39 +0900 Subject: [PATCH 26/29] =?UTF-8?q?test:=20=EC=84=A0=EA=B1=B0=EC=99=84?= =?UTF-8?q?=EB=A3=8C=20=EB=AC=B8=EC=84=9C=ED=99=94=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?response=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/debatetimer/controller/poll/PollDocumentTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/debatetimer/controller/poll/PollDocumentTest.java b/src/test/java/com/debatetimer/controller/poll/PollDocumentTest.java index 61d39fe4..e0cd3b42 100644 --- a/src/test/java/com/debatetimer/controller/poll/PollDocumentTest.java +++ b/src/test/java/com/debatetimer/controller/poll/PollDocumentTest.java @@ -143,7 +143,7 @@ class FinishPoll { void 선거_완료() { PollInfoResponse response = new PollInfoResponse( 1L, - PollStatus.PROGRESS, + PollStatus.DONE, "찬성", "반대", 3L, From de1c89ffef12a991c73bf7b9191dc67001b675fb Mon Sep 17 00:00:00 2001 From: coli Date: Thu, 24 Jul 2025 18:29:27 +0900 Subject: [PATCH 27/29] =?UTF-8?q?test:=20nullandemptyandblanksource=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=ED=95=98=EB=8F=84=EB=A1=9D=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/debatetimer/domain/poll/ParticipantNameTest.java | 6 ++---- .../com/debatetimer/domain/poll/ParticipateCodeTest.java | 6 ++---- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/src/test/java/com/debatetimer/domain/poll/ParticipantNameTest.java b/src/test/java/com/debatetimer/domain/poll/ParticipantNameTest.java index 97b898fd..a6f25f32 100644 --- a/src/test/java/com/debatetimer/domain/poll/ParticipantNameTest.java +++ b/src/test/java/com/debatetimer/domain/poll/ParticipantNameTest.java @@ -4,10 +4,9 @@ import com.debatetimer.exception.custom.DTClientErrorException; import com.debatetimer.exception.errorcode.ClientErrorCode; +import com.debatetimer.fixture.NullAndEmptyAndBlankSource; import org.junit.jupiter.api.Nested; import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.NullAndEmptySource; -import org.junit.jupiter.params.provider.ValueSource; class ParticipantNameTest { @@ -15,8 +14,7 @@ class ParticipantNameTest { class Validate { @ParameterizedTest - @NullAndEmptySource - @ValueSource(strings = {" ", " "}) + @NullAndEmptyAndBlankSource void 투표참여자_이름은_널이거나_빈_값_일_수_없다(String name) { assertThatThrownBy(() -> new ParticipantName(name)) .isInstanceOf(DTClientErrorException.class) diff --git a/src/test/java/com/debatetimer/domain/poll/ParticipateCodeTest.java b/src/test/java/com/debatetimer/domain/poll/ParticipateCodeTest.java index 009024cb..d8d5245c 100644 --- a/src/test/java/com/debatetimer/domain/poll/ParticipateCodeTest.java +++ b/src/test/java/com/debatetimer/domain/poll/ParticipateCodeTest.java @@ -4,10 +4,9 @@ import com.debatetimer.exception.custom.DTClientErrorException; import com.debatetimer.exception.errorcode.ClientErrorCode; +import com.debatetimer.fixture.NullAndEmptyAndBlankSource; import org.junit.jupiter.api.Nested; import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.NullAndEmptySource; -import org.junit.jupiter.params.provider.ValueSource; class ParticipateCodeTest { @@ -15,8 +14,7 @@ class ParticipateCodeTest { class Validate { @ParameterizedTest - @NullAndEmptySource - @ValueSource(strings = {" ", " "}) + @NullAndEmptyAndBlankSource void 투표_참여_코드는_널이거나_빈_값_일_수_없다(String participatecode) { assertThatThrownBy(() -> new ParticipateCode(participatecode)) .isInstanceOf(DTClientErrorException.class) From 538be99a85e322c2d946b26ffd34f31ceae1657f Mon Sep 17 00:00:00 2001 From: coli Date: Thu, 24 Jul 2025 18:36:41 +0900 Subject: [PATCH 28/29] =?UTF-8?q?test:=20CRUD=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=EB=A5=BC=20=EC=BB=A8=EB=B2=A4=EC=85=98=EC=97=90=20?= =?UTF-8?q?=EB=A7=9E=EB=8F=84=EB=A1=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../poll/PollDomainRepositoryTest.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/test/java/com/debatetimer/domainrepository/poll/PollDomainRepositoryTest.java b/src/test/java/com/debatetimer/domainrepository/poll/PollDomainRepositoryTest.java index b057dd4c..9a5cd1cd 100644 --- a/src/test/java/com/debatetimer/domainrepository/poll/PollDomainRepositoryTest.java +++ b/src/test/java/com/debatetimer/domainrepository/poll/PollDomainRepositoryTest.java @@ -20,7 +20,7 @@ class PollDomainRepositoryTest extends BaseDomainRepositoryTest { private PollDomainRepository pollDomainRepository; @Nested - class CRUDTest { + class Create { @Test void 선거를_생성한다() { @@ -33,6 +33,10 @@ class CRUDTest { Optional foundPollEntity = pollRepository.findById(createdPoll.getId()); assertThat(foundPollEntity).isPresent(); } + } + + @Nested + class GetByIdAndMemberId { @Test void 회원이_개최한_선거를_가져온다() { @@ -51,6 +55,10 @@ class CRUDTest { () -> assertThat(foundPoll.getConsTeamName().getValue()).isEqualTo(pollEntity.getConsTeamName()) ); } + } + + @Nested + class FinishPoll { @Test void 선거를_완료_상태로_변경한다() { From 486abf135d3e764472007b510f6a10ae930fb0b1 Mon Sep 17 00:00:00 2001 From: coli Date: Sat, 26 Jul 2025 08:56:00 +0900 Subject: [PATCH 29/29] =?UTF-8?q?test:=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=EC=9E=90=20=EB=B3=80=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domainrepository/poll/PollDomainRepositoryTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/debatetimer/domainrepository/poll/PollDomainRepositoryTest.java b/src/test/java/com/debatetimer/domainrepository/poll/PollDomainRepositoryTest.java index 9a5cd1cd..c97849e4 100644 --- a/src/test/java/com/debatetimer/domainrepository/poll/PollDomainRepositoryTest.java +++ b/src/test/java/com/debatetimer/domainrepository/poll/PollDomainRepositoryTest.java @@ -26,7 +26,7 @@ class Create { void 선거를_생성한다() { Member member = memberGenerator.generate("email@email.com"); CustomizeTableEntity table = customizeTableGenerator.generate(member); - Poll poll = new Poll(null, table.getId(), member.getId(), PollStatus.PROGRESS, "찬성", "반대", "주제"); + Poll poll = new Poll(table.getId(), member.getId(), "찬성", "반대", "주제"); Poll createdPoll = pollDomainRepository.create(poll);