Skip to content

Commit

Permalink
✨ [Feature] Admin AgendaTeam 전체 조회하기 #898 (#918)
Browse files Browse the repository at this point in the history
  • Loading branch information
yhames authored Jul 29, 2024
1 parent 1bd1019 commit 696875c
Show file tree
Hide file tree
Showing 6 changed files with 343 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -14,4 +16,7 @@ public interface AgendaTeamAdminRepository extends JpaRepository<AgendaTeam, Lon

@Query("SELECT at FROM AgendaTeam at WHERE at.agenda = :agenda")
List<AgendaTeam> findAllByAgenda(Agenda agenda);

@Query("SELECT at FROM AgendaTeam at WHERE at.agenda = :agenda")
Page<AgendaTeam> findAllByAgenda(Agenda agenda, Pageable pageable);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package gg.agenda.api.admin.agendateam.controller;

import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;

import javax.validation.Valid;

import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
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
public class AgendaTeamAdminController {

private final AgendaTeamAdminService agendaTeamAdminService;

@GetMapping("/list")
public ResponseEntity<List<AgendaTeamResDto>> getAgendaTeamList(@RequestParam("agenda_key") UUID agendaKey,
@RequestBody @Valid PageRequestDto pageRequestDto) {
int page = pageRequestDto.getPage();
int size = pageRequestDto.getSize();
Pageable pageable = PageRequest.of(page - 1, size, Sort.by("id").descending());
List<AgendaTeam> agendaTeamList = agendaTeamAdminService.getAgendaTeamList(agendaKey, pageable);
List<AgendaTeamResDto> agendaTeamResDtoList = agendaTeamList.stream()
.map(AgendaTeamResDto.MapStruct.INSTANCE::toDto)
.collect(Collectors.toList());
return ResponseEntity.ok(agendaTeamResDtoList);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
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;

@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class AgendaTeamResDto {

private String teamName;

private String teamStatus;

private int teamScore;

private boolean teamIsPrivate;

private String teamLeaderIntraId;

private int teamMateCount;

private UUID teamKey;

@Builder
public AgendaTeamResDto(String teamName, String teamStatus, int teamScore, boolean teamIsPrivate,
String teamLeaderIntraId, int teamMateCount, UUID teamKey) {
this.teamName = teamName;
this.teamStatus = teamStatus;
this.teamScore = teamScore;
this.teamIsPrivate = teamIsPrivate;
this.teamLeaderIntraId = teamLeaderIntraId;
this.teamMateCount = teamMateCount;
this.teamKey = teamKey;
}

@Mapper
public interface MapStruct {

AgendaTeamResDto.MapStruct INSTANCE = Mappers.getMapper(AgendaTeamResDto.MapStruct.class);

AgendaTeamResDto toDto(AgendaTeam agendaTeam);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package gg.agenda.api.admin.agendateam.service;

import static gg.utils.exception.ErrorCode.*;

import java.util.List;
import java.util.UUID;

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<AgendaTeam> getAgendaTeamList(UUID agendaKey, Pageable pageable) {
Agenda agenda = agendaAdminRepository.findByAgendaKey(agendaKey)
.orElseThrow(() -> new NotExistException(AGENDA_NOT_FOUND));
return agendaTeamAdminRepository.findAllByAgenda(agenda, pageable).getContent();
}
}
Original file line number Diff line number Diff line change
@@ -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<AgendaTeam> 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());
}
}
}
Original file line number Diff line number Diff line change
@@ -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<AgendaTeam> 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<AgendaTeam> 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));
}
}
}

0 comments on commit 696875c

Please sign in to comment.