diff --git a/gg-admin-repo/src/main/java/gg/admin/repo/agenda/AgendaTeamAdminRepository.java b/gg-admin-repo/src/main/java/gg/admin/repo/agenda/AgendaTeamAdminRepository.java index 7b299bfea..9bf0003e0 100644 --- a/gg-admin-repo/src/main/java/gg/admin/repo/agenda/AgendaTeamAdminRepository.java +++ b/gg-admin-repo/src/main/java/gg/admin/repo/agenda/AgendaTeamAdminRepository.java @@ -2,6 +2,8 @@ import java.util.List; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; @@ -14,4 +16,7 @@ public interface AgendaTeamAdminRepository extends JpaRepository findAllByAgenda(Agenda agenda); + + @Query("SELECT at FROM AgendaTeam at WHERE at.agenda = :agenda") + Page findAllByAgenda(Agenda agenda, Pageable pageable); } diff --git a/gg-agenda-api/src/main/java/gg/agenda/api/admin/agendateam/controller/AgendaTeamAdminController.java b/gg-agenda-api/src/main/java/gg/agenda/api/admin/agendateam/controller/AgendaTeamAdminController.java index 8cc8020a9..f47ee47dc 100644 --- a/gg-agenda-api/src/main/java/gg/agenda/api/admin/agendateam/controller/AgendaTeamAdminController.java +++ b/gg-agenda-api/src/main/java/gg/agenda/api/admin/agendateam/controller/AgendaTeamAdminController.java @@ -1,14 +1,11 @@ package gg.agenda.api.admin.agendateam.controller; -import gg.agenda.api.admin.agendateam.controller.response.AgendaTeamResDto; -import gg.agenda.api.admin.agendateam.service.AgendaTeamAdminService; -import gg.data.agenda.AgendaTeam; -import gg.utils.dto.PageRequestDto; import java.util.List; import java.util.UUID; import java.util.stream.Collectors; + import javax.validation.Valid; -import lombok.RequiredArgsConstructor; + import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; @@ -19,6 +16,12 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import gg.agenda.api.admin.agendateam.controller.response.AgendaTeamResDto; +import gg.agenda.api.admin.agendateam.service.AgendaTeamAdminService; +import gg.data.agenda.AgendaTeam; +import gg.utils.dto.PageRequestDto; +import lombok.RequiredArgsConstructor; + @RestController @RequestMapping("/admin/agenda/team") @RequiredArgsConstructor @@ -33,7 +36,8 @@ public ResponseEntity> getAgendaTeamList(@RequestParam("a int size = pageRequestDto.getSize(); Pageable pageable = PageRequest.of(page - 1, size, Sort.by("id").descending()); List agendaTeamList = agendaTeamAdminService.getAgendaTeamList(agendaKey, pageable); - List agendaTeamResDtoList = agendaTeamList.stream().map(AgendaTeamResDto.MapStruct.INSTANCE::toDto) + List agendaTeamResDtoList = agendaTeamList.stream() + .map(AgendaTeamResDto.MapStruct.INSTANCE::toDto) .collect(Collectors.toList()); return ResponseEntity.ok(agendaTeamResDtoList); } diff --git a/gg-agenda-api/src/main/java/gg/agenda/api/admin/agendateam/controller/response/AgendaTeamResDto.java b/gg-agenda-api/src/main/java/gg/agenda/api/admin/agendateam/controller/response/AgendaTeamResDto.java index 82425cfbd..34ca6369e 100644 --- a/gg-agenda-api/src/main/java/gg/agenda/api/admin/agendateam/controller/response/AgendaTeamResDto.java +++ b/gg-agenda-api/src/main/java/gg/agenda/api/admin/agendateam/controller/response/AgendaTeamResDto.java @@ -1,12 +1,15 @@ package gg.agenda.api.admin.agendateam.controller.response; +import java.util.UUID; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + import gg.data.agenda.AgendaTeam; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @@ -24,11 +27,11 @@ public class AgendaTeamResDto { private int teamMateCount; - private String teamKey; + private UUID teamKey; @Builder public AgendaTeamResDto(String teamName, String teamStatus, int teamScore, boolean teamIsPrivate, - String teamLeaderIntraId, int teamMateCount, String teamKey) { + String teamLeaderIntraId, int teamMateCount, UUID teamKey) { this.teamName = teamName; this.teamStatus = teamStatus; this.teamScore = teamScore; diff --git a/gg-agenda-api/src/main/java/gg/agenda/api/admin/agendateam/service/AgendaTeamAdminService.java b/gg-agenda-api/src/main/java/gg/agenda/api/admin/agendateam/service/AgendaTeamAdminService.java index 55d919026..ab46c3f96 100644 --- a/gg-agenda-api/src/main/java/gg/agenda/api/admin/agendateam/service/AgendaTeamAdminService.java +++ b/gg-agenda-api/src/main/java/gg/agenda/api/admin/agendateam/service/AgendaTeamAdminService.java @@ -1,21 +1,31 @@ package gg.agenda.api.admin.agendateam.service; -import gg.admin.repo.agenda.AgendaTeamAdminRepository; -import gg.data.agenda.AgendaTeam; -import gg.utils.dto.PageRequestDto; +import static gg.utils.exception.ErrorCode.*; + import java.util.List; import java.util.UUID; -import lombok.RequiredArgsConstructor; + import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; +import gg.admin.repo.agenda.AgendaAdminRepository; +import gg.admin.repo.agenda.AgendaTeamAdminRepository; +import gg.data.agenda.Agenda; +import gg.data.agenda.AgendaTeam; +import gg.utils.exception.custom.NotExistException; +import lombok.RequiredArgsConstructor; + @Service @RequiredArgsConstructor public class AgendaTeamAdminService { + private final AgendaAdminRepository agendaAdminRepository; + private final AgendaTeamAdminRepository agendaTeamAdminRepository; public List getAgendaTeamList(UUID agendaKey, Pageable pageable) { - return null; + Agenda agenda = agendaAdminRepository.findByAgendaKey(agendaKey) + .orElseThrow(() -> new NotExistException(AGENDA_NOT_FOUND)); + return agendaTeamAdminRepository.findAllByAgenda(agenda, pageable).getContent(); } } diff --git a/gg-agenda-api/src/test/java/gg/agenda/api/admin/agendateam/controller/AgendaTeamAdminControllerTest.java b/gg-agenda-api/src/test/java/gg/agenda/api/admin/agendateam/controller/AgendaTeamAdminControllerTest.java new file mode 100644 index 000000000..37b04b747 --- /dev/null +++ b/gg-agenda-api/src/test/java/gg/agenda/api/admin/agendateam/controller/AgendaTeamAdminControllerTest.java @@ -0,0 +1,134 @@ +package gg.agenda.api.admin.agendateam.controller; + +import static org.assertj.core.api.AssertionsForClassTypes.*; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +import java.util.List; +import java.util.UUID; + +import javax.persistence.EntityManager; +import javax.transaction.Transactional; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import gg.admin.repo.agenda.AgendaAdminRepository; +import gg.admin.repo.agenda.AgendaTeamAdminRepository; +import gg.agenda.api.admin.agendateam.controller.response.AgendaTeamResDto; +import gg.data.agenda.Agenda; +import gg.data.agenda.AgendaTeam; +import gg.data.agenda.type.AgendaTeamStatus; +import gg.data.user.User; +import gg.utils.AgendaTestDataUtils; +import gg.utils.TestDataUtils; +import gg.utils.annotation.IntegrationTest; +import gg.utils.dto.PageRequestDto; +import gg.utils.fixture.agenda.AgendaFixture; +import gg.utils.fixture.agenda.AgendaTeamFixture; + +@IntegrationTest +@Transactional +@AutoConfigureMockMvc +public class AgendaTeamAdminControllerTest { + + @Autowired + private MockMvc mockMvc; + + @Autowired + private ObjectMapper objectMapper; + + @Autowired + private TestDataUtils testDataUtils; + + @Autowired + private AgendaFixture agendaFixture; + + @Autowired + private AgendaTeamFixture agendaTeamFixture; + + @Autowired + private AgendaTestDataUtils agendaTestDataUtils; + + @Autowired + EntityManager em; + + @Autowired + AgendaAdminRepository agendaAdminRepository; + + @Autowired + AgendaTeamAdminRepository agendaTeamAdminRepository; + + private User user; + + private String accessToken; + + @BeforeEach + void setUp() { + user = testDataUtils.createAdminUser(); + accessToken = testDataUtils.getLoginAccessTokenFromUser(user); + } + + @Nested + @DisplayName("Admin AgendaTeam 전체 조회") + class GetAgencyTeamListAdmin { + + @ParameterizedTest + @ValueSource(ints = {1, 2, 3, 4, 5}) + @DisplayName("Admin AgendaTeam 전체 조회 성공") + void getAgendaTeamListAdminSuccess(int page) throws Exception { + // given + int size = 10; + int total = 37; + Agenda agenda = agendaFixture.createAgenda(); + List teams = agendaTeamFixture + .createAgendaTeamList(agenda, AgendaTeamStatus.CONFIRM, total); + PageRequestDto pageRequestDto = new PageRequestDto(page, size); + String request = objectMapper.writeValueAsString(pageRequestDto); + + // when + String response = mockMvc.perform(get("/admin/agenda/team/list") + .header("Authorization", "Bearer " + accessToken) + .param("agenda_key", agenda.getAgendaKey().toString()) + .contentType(MediaType.APPLICATION_JSON) + .content(request)) + .andExpect(status().isOk()).andReturn().getResponse().getContentAsString(); + AgendaTeamResDto[] result = objectMapper.readValue(response, AgendaTeamResDto[].class); + + // then + assertThat(result).isNotNull(); + assertThat(result).hasSize(((page - 1) * size) < teams.size() + ? Math.min(size, teams.size() - (page - 1) * size) : 0); + teams.sort((a, b) -> b.getId().compareTo(a.getId())); + for (int i = 0; i < result.length; i++) { + assertThat(result[i].getTeamKey()).isEqualTo(teams.get(i + (page - 1) * size).getTeamKey()); + } + } + + @Test + @DisplayName("Admin AgendaTeam 전체 조회 실패 - Agenda 없음") + void getAgendaTeamListAdminFailedWithNoAgenda() throws Exception { + // given + PageRequestDto pageRequestDto = new PageRequestDto(1, 10); + String request = objectMapper.writeValueAsString(pageRequestDto); + + // expected + mockMvc.perform(get("/admin/agenda/team/list") + .header("Authorization", "Bearer " + accessToken) + .param("agenda_key", UUID.randomUUID().toString()) + .contentType(MediaType.APPLICATION_JSON) + .content(request)) + .andExpect(status().isNotFound()); + } + } +} diff --git a/gg-agenda-api/src/test/java/gg/agenda/api/admin/agendateam/service/AgendaTeamAdminServiceTest.java b/gg-agenda-api/src/test/java/gg/agenda/api/admin/agendateam/service/AgendaTeamAdminServiceTest.java new file mode 100644 index 000000000..55226c349 --- /dev/null +++ b/gg-agenda-api/src/test/java/gg/agenda/api/admin/agendateam/service/AgendaTeamAdminServiceTest.java @@ -0,0 +1,78 @@ +package gg.agenda.api.admin.agendateam.service; + +import static org.assertj.core.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; + +import gg.admin.repo.agenda.AgendaAdminRepository; +import gg.admin.repo.agenda.AgendaTeamAdminRepository; +import gg.data.agenda.Agenda; +import gg.data.agenda.AgendaTeam; +import gg.utils.annotation.UnitTest; +import gg.utils.exception.custom.NotExistException; + +@UnitTest +public class AgendaTeamAdminServiceTest { + + @Mock + private AgendaAdminRepository agendaAdminRepository; + + @Mock + private AgendaTeamAdminRepository agendaTeamAdminRepository; + + @InjectMocks + private AgendaTeamAdminService agendaTeamAdminService; + + @Nested + @DisplayName("Admin AgendaTeam 전체 조회") + class GetAgendaTeamListAdmin { + + @Test + @DisplayName("Admin AgendaTeam 전체 조회 성공") + void getAgendaTeamListAdminSuccess() { + // given + Agenda agenda = Agenda.builder().build(); + List announcements = new ArrayList<>(); + Pageable pageable = PageRequest.of(0, 10, Sort.by("id").descending()); + when(agendaAdminRepository.findByAgendaKey(any(UUID.class))).thenReturn(Optional.of(agenda)); + when(agendaTeamAdminRepository.findAllByAgenda(any(Agenda.class), any(Pageable.class))) + .thenReturn(new PageImpl<>(announcements)); + + // when + List result = agendaTeamAdminService.getAgendaTeamList(agenda.getAgendaKey(), pageable); + + // then + verify(agendaAdminRepository, times(1)).findByAgendaKey(any(UUID.class)); + verify(agendaTeamAdminRepository, times(1)) + .findAllByAgenda(any(Agenda.class), any(Pageable.class)); + assertThat(result).isNotNull(); + } + + @Test + @DisplayName("Admin AgendaTeam 전체 조회 실패 - Agenda 없음") + void getAgendaTeamListAdminFailedWithNoAgenda() { + // given + Pageable pageable = mock(Pageable.class); + when(agendaAdminRepository.findByAgendaKey(any(UUID.class))).thenReturn(Optional.empty()); + + // expected + assertThrows(NotExistException.class, + () -> agendaTeamAdminService.getAgendaTeamList(UUID.randomUUID(), pageable)); + } + } +}