diff --git a/src/main/java/ddingdong/ddingdongBE/domain/activityreport/service/ActivityReportService.java b/src/main/java/ddingdong/ddingdongBE/domain/activityreport/service/ActivityReportService.java index 34905483..2f0d84c8 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/activityreport/service/ActivityReportService.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/activityreport/service/ActivityReportService.java @@ -49,7 +49,7 @@ public List getAll() { @Transactional(readOnly = true) public List getMyActivityReports(final User user) { - Club club = clubService.findClubByClubId(user.getId()); + Club club = clubService.getByUserId(user.getId()); List activityReports = activityReportRepository.findByClubName( club.getName()); @@ -73,7 +73,7 @@ public List getActivityReport(final String term, public Long register(final User user, final RegisterActivityReportRequest registerActivityReportRequest) { - Club club = clubService.findClubByUserId(user.getId()); + Club club = clubService.getByUserId(user.getId()); ActivityReport activityReport = registerActivityReportRequest.toEntity(club); ActivityReport savedActivityReport = activityReportRepository.save(activityReport); @@ -83,7 +83,7 @@ public Long register(final User user, public List update(final User user, final String term, final List requests) { - Club club = clubService.findClubByUserId(user.getId()); + Club club = clubService.getByUserId(user.getId()); List activityReports = activityReportRepository.findByClubNameAndTerm( club.getName(), term); @@ -96,7 +96,7 @@ public List update(final User user, final String term, } public List delete(final User user, final String term) { - Club club = clubService.findClubByUserId(user.getId()); + Club club = clubService.getByUserId(user.getId()); List activityReports = activityReportRepository.findByClubNameAndTerm( club.getName(), term); diff --git a/src/main/java/ddingdong/ddingdongBE/domain/club/entity/Club.java b/src/main/java/ddingdong/ddingdongBE/domain/club/entity/Club.java index 16a14a86..3d587657 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/club/entity/Club.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/club/entity/Club.java @@ -74,8 +74,9 @@ public class Club extends BaseEntity { private Score score; @Builder - public Club(User user, String name, String category, String tag, String leader, Location location, + public Club(Long id, User user, String name, String category, String tag, String leader, Location location, PhoneNumber phoneNumber, Score score) { + this.id = id; this.user = user; this.name = name; this.category = category; diff --git a/src/main/java/ddingdong/ddingdongBE/domain/club/service/ClubService.java b/src/main/java/ddingdong/ddingdongBE/domain/club/service/ClubService.java index 607dde79..ab6892cc 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/club/service/ClubService.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/club/service/ClubService.java @@ -27,7 +27,6 @@ import java.time.LocalDateTime; import java.util.List; import java.util.NoSuchElementException; -import java.util.Optional; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -122,10 +121,6 @@ public Long update(Long userId, UpdateClubRequest request) { return club.getId(); } - public Optional findByUserId(final Long userId) { - return clubRepository.findByUserId(userId); - } - public Club getByUserId(final Long userId) { return clubRepository.findByUserId(userId) .orElseThrow(() -> new NoSuchElementException(NO_SUCH_CLUB.getText())); @@ -180,7 +175,7 @@ private RecruitmentStatus checkRecruit(LocalDateTime now, Club club) { return BEFORE_RECRUIT; } - return club.getEndRecruitPeriod().isAfter(now) ? RECRUITING : END_RECRUIT; + return club.getEndRecruitPeriod().isAfter(now) ? RECRUITING : END_RECRUIT; } } diff --git a/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/api/AdminScoreHistoryApi.java b/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/api/AdminScoreHistoryApi.java new file mode 100644 index 00000000..705d40d2 --- /dev/null +++ b/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/api/AdminScoreHistoryApi.java @@ -0,0 +1,32 @@ +package ddingdong.ddingdongBE.domain.scorehistory.api; + +import ddingdong.ddingdongBE.domain.scorehistory.controller.dto.request.RegisterScoreRequest; +import ddingdong.ddingdongBE.domain.scorehistory.controller.dto.response.ScoreHistoryFilterByClubResponse; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseStatus; + +@Tag(name = "ScoreHistory - Admin", description = "ScoreHistory Admin API") +@RequestMapping("/server/admin/{clubId}/score") +public interface AdminScoreHistoryApi { + + @Operation(summary = "어드민 점수 등록 API") + @PostMapping + @ResponseStatus(HttpStatus.CREATED) + @SecurityRequirement(name = "AccessToken") + void register(@PathVariable Long clubId, @RequestBody RegisterScoreRequest registerScoreRequest); + + @Operation(summary = "어드민 동아리 점수 내역 목록 조회 API") + @GetMapping + @ResponseStatus(HttpStatus.OK) + @SecurityRequirement(name = "AccessToken") + ScoreHistoryFilterByClubResponse getScoreHistories(@PathVariable Long clubId); + +} diff --git a/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/api/ClubScoreHistoryApi.java b/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/api/ClubScoreHistoryApi.java new file mode 100644 index 00000000..bdb0db7b --- /dev/null +++ b/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/api/ClubScoreHistoryApi.java @@ -0,0 +1,28 @@ +package ddingdong.ddingdongBE.domain.scorehistory.api; + +import ddingdong.ddingdongBE.auth.PrincipalDetails; +import ddingdong.ddingdongBE.domain.scorehistory.controller.dto.request.RegisterScoreRequest; +import ddingdong.ddingdongBE.domain.scorehistory.controller.dto.response.ScoreHistoryFilterByClubResponse; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.http.HttpStatus; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseStatus; + +@Tag(name = "ScoreHistory - Club", description = "ScoreHistory Club API") +@RequestMapping("/server/club/my/score") +public interface ClubScoreHistoryApi { + + @Operation(summary = "동아리 내 점수 내역 목록 조회 API") + @GetMapping + @ResponseStatus(HttpStatus.OK) + @SecurityRequirement(name = "AccessToken") + ScoreHistoryFilterByClubResponse getMyScoreHistories(@AuthenticationPrincipal PrincipalDetails principalDetails); + +} diff --git a/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/controller/AdminScoreHistoryController.java b/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/controller/AdminScoreHistoryController.java index 8f72b939..fba12719 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/controller/AdminScoreHistoryController.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/controller/AdminScoreHistoryController.java @@ -1,38 +1,32 @@ package ddingdong.ddingdongBE.domain.scorehistory.controller; +import ddingdong.ddingdongBE.domain.club.entity.Club; +import ddingdong.ddingdongBE.domain.club.service.ClubService; +import ddingdong.ddingdongBE.domain.scorehistory.api.AdminScoreHistoryApi; import ddingdong.ddingdongBE.domain.scorehistory.controller.dto.request.RegisterScoreRequest; import ddingdong.ddingdongBE.domain.scorehistory.controller.dto.response.ScoreHistoryFilterByClubResponse; +import ddingdong.ddingdongBE.domain.scorehistory.controller.dto.response.ScoreHistoryFilterByClubResponse.ScoreHistoryResponse; import ddingdong.ddingdongBE.domain.scorehistory.service.ScoreHistoryService; - import java.util.List; import lombok.RequiredArgsConstructor; - -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequiredArgsConstructor -@RequestMapping("/server/admin/{clubId}/score") -public class AdminScoreHistoryController { +public class AdminScoreHistoryController implements AdminScoreHistoryApi { + private final ClubService clubService; private final ScoreHistoryService scoreHistoryService; - @PostMapping - public void register( - @PathVariable Long clubId, - @RequestBody RegisterScoreRequest registerScoreRequest - ) { + public void register(Long clubId, RegisterScoreRequest registerScoreRequest) { scoreHistoryService.register(clubId, registerScoreRequest); } - @GetMapping - public List getScoreHistories( - @PathVariable Long clubId - ) { - return scoreHistoryService.getScoreHistories(clubId); + public ScoreHistoryFilterByClubResponse getScoreHistories(Long clubId) { + Club club = clubService.getByClubId(clubId); + List scoreHistoryResponses = scoreHistoryService.getScoreHistories(clubId).stream() + .map(ScoreHistoryResponse::from) + .toList(); + return ScoreHistoryFilterByClubResponse.of(club, scoreHistoryResponses); } } diff --git a/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/controller/ClubScoreHistoryController.java b/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/controller/ClubScoreHistoryController.java index 8f5f9762..bc71b2bb 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/controller/ClubScoreHistoryController.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/controller/ClubScoreHistoryController.java @@ -1,28 +1,29 @@ package ddingdong.ddingdongBE.domain.scorehistory.controller; import ddingdong.ddingdongBE.auth.PrincipalDetails; +import ddingdong.ddingdongBE.domain.club.entity.Club; +import ddingdong.ddingdongBE.domain.club.service.ClubService; +import ddingdong.ddingdongBE.domain.scorehistory.api.ClubScoreHistoryApi; import ddingdong.ddingdongBE.domain.scorehistory.controller.dto.response.ScoreHistoryFilterByClubResponse; +import ddingdong.ddingdongBE.domain.scorehistory.controller.dto.response.ScoreHistoryFilterByClubResponse.ScoreHistoryResponse; import ddingdong.ddingdongBE.domain.scorehistory.service.ScoreHistoryService; import java.util.List; - import lombok.RequiredArgsConstructor; - -import org.springframework.security.core.annotation.AuthenticationPrincipal; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequiredArgsConstructor -@RequestMapping("/server/club/my/score") -public class ClubScoreHistoryController { +public class ClubScoreHistoryController implements ClubScoreHistoryApi { + private final ClubService clubService; private final ScoreHistoryService scoreHistoryService; - @GetMapping - public List getMyScoreHistories( - @AuthenticationPrincipal PrincipalDetails principalDetails - ) { - return scoreHistoryService.getMyScoreHistories(principalDetails.getUser().getId()); + public ScoreHistoryFilterByClubResponse getMyScoreHistories(PrincipalDetails principalDetails) { + Club club = clubService.getByUserId(principalDetails.getUser().getId()); + List scoreHistoryResponses = scoreHistoryService.getMyScoreHistories(club.getId()) + .stream() + .map(ScoreHistoryResponse::from) + .toList(); + return ScoreHistoryFilterByClubResponse.of(club, scoreHistoryResponses); } } diff --git a/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/controller/dto/request/RegisterScoreRequest.java b/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/controller/dto/request/RegisterScoreRequest.java index f1b94252..13fb79a6 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/controller/dto/request/RegisterScoreRequest.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/controller/dto/request/RegisterScoreRequest.java @@ -14,13 +14,12 @@ public class RegisterScoreRequest { private float amount; - public ScoreHistory toEntity(Club club, float remainingScore) { + public ScoreHistory toEntity(Club club) { return ScoreHistory.builder() .club(club) .amount(amount) .scoreCategory(ScoreCategory.of(scoreCategory)) .reason(reason) - .remainingScore(remainingScore) .build(); } } diff --git a/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/controller/dto/response/ScoreHistoryFilterByClubResponse.java b/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/controller/dto/response/ScoreHistoryFilterByClubResponse.java index 9938aed9..1f4d7485 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/controller/dto/response/ScoreHistoryFilterByClubResponse.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/controller/dto/response/ScoreHistoryFilterByClubResponse.java @@ -1,39 +1,60 @@ package ddingdong.ddingdongBE.domain.scorehistory.controller.dto.response; +import com.fasterxml.jackson.annotation.JsonFormat; +import ddingdong.ddingdongBE.domain.club.entity.Club; import ddingdong.ddingdongBE.domain.scorehistory.entity.ScoreHistory; - +import io.swagger.v3.oas.annotations.media.ArraySchema; +import io.swagger.v3.oas.annotations.media.Schema; import java.time.LocalDateTime; +import java.util.List; import lombok.Builder; -import lombok.Getter; - -@Getter -public class ScoreHistoryFilterByClubResponse { - private String scoreCategory; - - private String reason; - private float amount; +@Schema( + name = "ScoreHistoryFilterByClubResponse", + description = "어드민 - 동아리 점수 변동 내역 목록 응답" +) +@Builder +public record ScoreHistoryFilterByClubResponse( - private float remainingScore; + @Schema(description = "동아리 총 점수", example = "50") + float totalScore, + @ArraySchema(schema = @Schema(description = "점수내역 목록", implementation = ScoreHistoryResponse.class)) + List scoreHistories +) { - private LocalDateTime createdAt; + public static ScoreHistoryFilterByClubResponse of(Club club, List scoreHistories) { + return ScoreHistoryFilterByClubResponse.builder() + .totalScore(club.getScore().getValue()) + .scoreHistories(scoreHistories) + .build(); + } + @Schema( + name = "ScoreHistoryResponse", + description = "점수 변동 내역 응답" + ) @Builder - public ScoreHistoryFilterByClubResponse(String scoreCategory, String reason, float amount, float remainingScore, LocalDateTime createdAt) { - this.scoreCategory = scoreCategory; - this.reason = reason; - this.amount = amount; - this.remainingScore = remainingScore; - this.createdAt = createdAt; - } + public record ScoreHistoryResponse( + + @Schema(description = "점수 내역 카테고리", example = "활동보고서") + String scoreCategory, + @Schema(description = "점수 내역 이유", example = "활동보고서 작성") + String reason, + @Schema(description = "변동 점수", example = "10") + float amount, + @Schema(description = "작성일", example = "2024-01-01") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + LocalDateTime createdAt + ) { + + public static ScoreHistoryResponse from(ScoreHistory scoreHistory) { + return ScoreHistoryResponse.builder() + .scoreCategory(scoreHistory.getScoreCategory().getCategory()) + .reason(scoreHistory.getReason()) + .amount(scoreHistory.getAmount()) + .createdAt(scoreHistory.getCreatedAt()) + .build(); + } - public static ScoreHistoryFilterByClubResponse of(final ScoreHistory scoreHistory) { - return ScoreHistoryFilterByClubResponse.builder() - .scoreCategory(scoreHistory.getScoreCategory().getCategory()) - .reason(scoreHistory.getReason()) - .amount(scoreHistory.getAmount()) - .remainingScore(scoreHistory.getRemainingScore()) - .createdAt(scoreHistory.getCreatedAt()) - .build(); } } diff --git a/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/entity/ScoreCategory.java b/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/entity/ScoreCategory.java index 33306884..d0f162c8 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/entity/ScoreCategory.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/entity/ScoreCategory.java @@ -25,4 +25,4 @@ public static ScoreCategory of(String category) { } throw new IllegalArgumentException(ILLEGAL_SCORE_CATEGORY.getText()); } -} \ No newline at end of file +} diff --git a/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/entity/ScoreHistory.java b/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/entity/ScoreHistory.java index d4e83823..8a44f681 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/entity/ScoreHistory.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/entity/ScoreHistory.java @@ -38,14 +38,11 @@ public class ScoreHistory extends BaseEntity { private String reason; - private float remainingScore; - @Builder - public ScoreHistory(Club club, float amount, ScoreCategory scoreCategory, String reason, float remainingScore) { + public ScoreHistory(Club club, float amount, ScoreCategory scoreCategory, String reason) { this.club = club; this.amount = amount; this.scoreCategory = scoreCategory; this.reason = reason; - this.remainingScore = remainingScore; } } diff --git a/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/service/ScoreHistoryService.java b/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/service/ScoreHistoryService.java index 5c091389..df893049 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/service/ScoreHistoryService.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/service/ScoreHistoryService.java @@ -3,7 +3,7 @@ import ddingdong.ddingdongBE.domain.club.entity.Club; import ddingdong.ddingdongBE.domain.club.service.ClubService; import ddingdong.ddingdongBE.domain.scorehistory.controller.dto.request.RegisterScoreRequest; -import ddingdong.ddingdongBE.domain.scorehistory.controller.dto.response.ScoreHistoryFilterByClubResponse; +import ddingdong.ddingdongBE.domain.scorehistory.entity.ScoreHistory; import ddingdong.ddingdongBE.domain.scorehistory.repository.ScoreHistoryRepository; import java.util.List; import lombok.RequiredArgsConstructor; @@ -22,27 +22,20 @@ public void register(final Long clubId, RegisterScoreRequest registerScoreReques Club club = clubService.getByClubId(clubId); float score = roundToThirdPoint(registerScoreRequest.getAmount()); - - float remainingScore = clubService.editClubScore(clubId, score); - - scoreHistoryRepository.save(registerScoreRequest.toEntity(club, remainingScore)); + clubService.editClubScore(clubId, score); + scoreHistoryRepository.save(registerScoreRequest.toEntity(club)); } @Transactional(readOnly = true) - public List getScoreHistories(final Long clubId) { + public List getScoreHistories(final Long clubId) { - return scoreHistoryRepository.findByClubId(clubId).stream() - .map(ScoreHistoryFilterByClubResponse::of) - .toList(); + return scoreHistoryRepository.findByClubId(clubId); } @Transactional(readOnly = true) - public List getMyScoreHistories(final Long userId) { + public List getMyScoreHistories(final Long userId) { Club club = clubService.getByUserId(userId); - - return scoreHistoryRepository.findByClubId(club.getId()).stream() - .map(ScoreHistoryFilterByClubResponse::of) - .toList(); + return scoreHistoryRepository.findByClubId(club.getId()); } private static float roundToThirdPoint(float value) { diff --git a/src/test/java/ddingdong/ddingdongBE/domain/scorehistory/controller/AdminScoreHistoryControllerTest.java b/src/test/java/ddingdong/ddingdongBE/domain/scorehistory/controller/AdminScoreHistoryControllerTest.java new file mode 100644 index 00000000..d451a7dc --- /dev/null +++ b/src/test/java/ddingdong/ddingdongBE/domain/scorehistory/controller/AdminScoreHistoryControllerTest.java @@ -0,0 +1,57 @@ +package ddingdong.ddingdongBE.domain.scorehistory.controller; + +import static ddingdong.ddingdongBE.domain.scorehistory.entity.ScoreCategory.ACTIVITY_REPORT; +import static ddingdong.ddingdongBE.domain.scorehistory.entity.ScoreCategory.CARRYOVER_SCORE; +import static org.hamcrest.Matchers.hasSize; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.Mockito.when; +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import ddingdong.ddingdongBE.domain.club.entity.Club; +import ddingdong.ddingdongBE.domain.scorehistory.entity.Score; +import ddingdong.ddingdongBE.domain.scorehistory.entity.ScoreHistory; +import ddingdong.ddingdongBE.support.WebApiTestSupport; +import ddingdong.ddingdongBE.support.WithMockAuthenticatedUser; +import java.util.List; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class AdminScoreHistoryControllerTest extends WebApiTestSupport { + + @WithMockAuthenticatedUser(role = "ADMIN") + @DisplayName("동아리 점수 내역 조회 요청을 수행한다.") + @Test + void getScoreHistories() throws Exception { + //given + Club club = Club.builder() + .id(1L) + .score(Score.of(55)).build(); + List scoreHistories = List.of(ScoreHistory.builder() + .club(club) + .scoreCategory(CARRYOVER_SCORE) + .amount(5) + .reason("reasonA").build(), + ScoreHistory.builder() + .club(club) + .scoreCategory(ACTIVITY_REPORT) + .amount(5) + .reason("reasonB").build()); + when(clubService.getByClubId(anyLong())).thenReturn(club); + when(scoreHistoryService.getScoreHistories(club.getId())).thenReturn(scoreHistories); + + //when //then + mockMvc.perform(get("/server/admin/{clubId}/score", 1L) + .with(csrf())) + .andDo(print()) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.totalScore").value(55)) + .andExpect(jsonPath("$.scoreHistories", hasSize(scoreHistories.size()))) + .andExpect(jsonPath("$.scoreHistories[0].scoreCategory").value(CARRYOVER_SCORE.getCategory())) + .andExpect(jsonPath("$.scoreHistories[0].reason").value("reasonA")) + .andExpect(jsonPath("$.scoreHistories[0].amount").value(5)); + } +} diff --git a/src/test/java/ddingdong/ddingdongBE/domain/scorehistory/controller/ClubScoreHistoryControllerTest.java b/src/test/java/ddingdong/ddingdongBE/domain/scorehistory/controller/ClubScoreHistoryControllerTest.java new file mode 100644 index 00000000..17f02116 --- /dev/null +++ b/src/test/java/ddingdong/ddingdongBE/domain/scorehistory/controller/ClubScoreHistoryControllerTest.java @@ -0,0 +1,58 @@ +package ddingdong.ddingdongBE.domain.scorehistory.controller; + +import static ddingdong.ddingdongBE.domain.scorehistory.entity.ScoreCategory.ACTIVITY_REPORT; +import static ddingdong.ddingdongBE.domain.scorehistory.entity.ScoreCategory.CARRYOVER_SCORE; +import static org.hamcrest.Matchers.hasSize; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.Mockito.when; +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import ddingdong.ddingdongBE.domain.club.entity.Club; +import ddingdong.ddingdongBE.domain.scorehistory.entity.Score; +import ddingdong.ddingdongBE.domain.scorehistory.entity.ScoreHistory; +import ddingdong.ddingdongBE.support.WebApiTestSupport; +import ddingdong.ddingdongBE.support.WithMockAuthenticatedUser; +import java.util.List; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class ClubScoreHistoryControllerTest extends WebApiTestSupport { + + @WithMockAuthenticatedUser(role = "CLUB") + @DisplayName("동아리- 내 점수 내역 조회 요청을 수행한다.") + @Test + void getScoreHistories() throws Exception { + //given + Club club = Club.builder() + .id(1L) + .score(Score.of(55)).build(); + List scoreHistories = List.of(ScoreHistory.builder() + .club(club) + .scoreCategory(CARRYOVER_SCORE) + .amount(5) + .reason("reasonA").build(), + ScoreHistory.builder() + .club(club) + .scoreCategory(ACTIVITY_REPORT) + .amount(5) + .reason("reasonB").build()); + when(clubService.getByUserId(anyLong())).thenReturn(club); + when(scoreHistoryService.getMyScoreHistories(club.getId())).thenReturn(scoreHistories); + + //when //then + mockMvc.perform(get("/server/club/my/score") + .with(csrf())) + .andDo(print()) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.totalScore").value(55)) + .andExpect(jsonPath("$.scoreHistories", hasSize(scoreHistories.size()))) + .andExpect(jsonPath("$.scoreHistories[0].scoreCategory").value(CARRYOVER_SCORE.getCategory())) + .andExpect(jsonPath("$.scoreHistories[0].reason").value("reasonA")) + .andExpect(jsonPath("$.scoreHistories[0].amount").value(5)); + } + +} diff --git a/src/test/java/ddingdong/ddingdongBE/support/WebApiTestSupport.java b/src/test/java/ddingdong/ddingdongBE/support/WebApiTestSupport.java index 316149c8..5dd00fa3 100644 --- a/src/test/java/ddingdong/ddingdongBE/support/WebApiTestSupport.java +++ b/src/test/java/ddingdong/ddingdongBE/support/WebApiTestSupport.java @@ -2,6 +2,7 @@ import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.springSecurity; +import ddingdong.ddingdongBE.domain.club.service.ClubService; import ddingdong.ddingdongBE.domain.documents.controller.AdminDocumentController; import ddingdong.ddingdongBE.domain.documents.controller.DocumentController; import ddingdong.ddingdongBE.domain.documents.service.DocumentService; @@ -9,6 +10,9 @@ import ddingdong.ddingdongBE.domain.question.controller.AdminQuestionController; import ddingdong.ddingdongBE.domain.question.controller.QuestionController; import ddingdong.ddingdongBE.domain.question.service.QuestionService; +import ddingdong.ddingdongBE.domain.scorehistory.controller.AdminScoreHistoryController; +import ddingdong.ddingdongBE.domain.scorehistory.controller.ClubScoreHistoryController; +import ddingdong.ddingdongBE.domain.scorehistory.service.ScoreHistoryService; import ddingdong.ddingdongBE.file.service.FileService; import org.junit.jupiter.api.BeforeEach; import org.springframework.beans.factory.annotation.Autowired; @@ -24,27 +28,28 @@ AdminDocumentController.class, DocumentController.class, AdminQuestionController.class, - QuestionController.class + QuestionController.class, + AdminScoreHistoryController.class, + ClubScoreHistoryController.class }) public abstract class WebApiTestSupport { @Autowired private WebApplicationContext context; - @Autowired protected MockMvc mockMvc; - @MockBean protected DocumentService documentService; - @MockBean protected FileService fileService; - @MockBean protected FileInformationService fileInformationService; - @MockBean protected QuestionService questionService; + @MockBean + protected ClubService clubService; + @MockBean + protected ScoreHistoryService scoreHistoryService; @BeforeEach void setUp() {