-
Notifications
You must be signed in to change notification settings - Fork 9
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Browse the repository at this point in the history
- Loading branch information
Showing
6 changed files
with
343 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
44 changes: 44 additions & 0 deletions
44
...pi/src/main/java/gg/agenda/api/admin/agendateam/controller/AgendaTeamAdminController.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | ||
} | ||
} |
51 changes: 51 additions & 0 deletions
51
...pi/src/main/java/gg/agenda/api/admin/agendateam/controller/response/AgendaTeamResDto.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | ||
} | ||
} |
31 changes: 31 additions & 0 deletions
31
...enda-api/src/main/java/gg/agenda/api/admin/agendateam/service/AgendaTeamAdminService.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); | ||
} | ||
} |
134 changes: 134 additions & 0 deletions
134
...rc/test/java/gg/agenda/api/admin/agendateam/controller/AgendaTeamAdminControllerTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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()); | ||
} | ||
} | ||
} |
78 changes: 78 additions & 0 deletions
78
...-api/src/test/java/gg/agenda/api/admin/agendateam/service/AgendaTeamAdminServiceTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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)); | ||
} | ||
} | ||
} |