Skip to content

Commit

Permalink
test: add integration test
Browse files Browse the repository at this point in the history
  • Loading branch information
yhames committed Jul 15, 2024
1 parent 48a3cbc commit 7651cfc
Show file tree
Hide file tree
Showing 2 changed files with 124 additions and 15 deletions.
27 changes: 27 additions & 0 deletions gg-agenda-api/src/test/java/gg/agenda/api/AgendaMockData.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import static java.util.UUID.*;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;
Expand Down Expand Up @@ -152,6 +153,32 @@ public AgendaAnnouncement createAgendaAnnouncement(Agenda agenda) {
return announcement;
}

public List<AgendaAnnouncement> createAgendaAnnouncementList(Agenda agenda, int size) {
List<AgendaAnnouncement> announcements = new ArrayList<>();
for (int i = 0; i < size; i++) {
announcements.add(AgendaAnnouncement.builder()
.title("title " + i)
.content("content " + i)
.isShow(true)
.agenda(agenda)
.build());
}
return agendaAnnouncementRepository.saveAll(announcements);
}

public List<AgendaAnnouncement> createAgendaAnnouncementList(Agenda agenda, int size, boolean isShow) {
List<AgendaAnnouncement> announcements = new ArrayList<>();
for (int i = 0; i < size; i++) {
announcements.add(AgendaAnnouncement.builder()
.title("title " + i)
.content("content " + i)
.isShow(isShow)
.agenda(agenda)
.build());
}
return agendaAnnouncementRepository.saveAll(announcements);
}

public List<Agenda> createAgendaHistory(int size) {
List<Agenda> agendas = IntStream.range(0, size).mapToObj(i -> Agenda.builder()
.title("title " + UUID.randomUUID())
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
package gg.agenda.api.user.agendaannouncement.controller;

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.AssertionsForClassTypes.*;
import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;

import java.awt.print.Pageable;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;
import java.util.UUID;

Expand All @@ -14,6 +19,8 @@
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;
Expand All @@ -24,12 +31,14 @@

import gg.agenda.api.AgendaMockData;
import gg.agenda.api.user.agendaannouncement.controller.request.AgendaAnnouncementCreateReqDto;
import gg.agenda.api.user.agendaannouncement.controller.response.AgendaAnnouncementResDto;
import gg.data.agenda.Agenda;
import gg.data.agenda.AgendaAnnouncement;
import gg.data.user.User;
import gg.repo.agenda.AgendaAnnouncementRepository;
import gg.utils.TestDataUtils;
import gg.utils.annotation.IntegrationTest;
import gg.utils.dto.PageRequestDto;
import lombok.extern.slf4j.Slf4j;

@Slf4j
Expand Down Expand Up @@ -77,13 +86,14 @@ void createAgendaAnnouncementSuccess() throws Exception {
Agenda agenda = agendaMockData.createAgenda(user.getIntraId());
AgendaAnnouncementCreateReqDto dto = AgendaAnnouncementCreateReqDto.builder()
.title("title").content("content").build();
String request = objectMapper.writeValueAsString(dto);

// when
mockMvc.perform(post("/agenda/announcement")
.header("Authorization", "Bearer " + accessToken)
.param("agenda_key", agenda.getAgendaKey().toString())
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(dto)))
.content(request))
.andExpect(status().isCreated());
Optional<AgendaAnnouncement> latestAnnounce = agendaAnnouncementRepository.findLatestByAgenda(agenda);

Expand All @@ -99,14 +109,15 @@ void createAgendaAnnouncementFailedWithNoTitle() throws Exception {
// given
Agenda agenda = agendaMockData.createAgenda(user.getIntraId());
AgendaAnnouncementCreateReqDto dto = AgendaAnnouncementCreateReqDto.builder()
.content("content").build(); // title이 null인 경우
.content("content").build(); // title이 null인 경우
String request = objectMapper.writeValueAsString(dto);

// expected
mockMvc.perform(post("/agenda/announcement")
.header("Authorization", "Bearer " + accessToken)
.param("agenda_key", agenda.getAgendaKey().toString())
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(dto)))
.content(request))
.andExpect(status().isBadRequest());
}

Expand All @@ -116,14 +127,15 @@ void createAgendaAnnouncementFailedWithEmptyTitle() throws Exception {
// given
Agenda agenda = agendaMockData.createAgenda(user.getIntraId());
AgendaAnnouncementCreateReqDto dto = AgendaAnnouncementCreateReqDto.builder()
.title("").content("content").build(); // title이 empty인 경우
.title("").content("content").build(); // title이 empty인 경우
String request = objectMapper.writeValueAsString(dto);

// expected
mockMvc.perform(post("/agenda/announcement")
.header("Authorization", "Bearer " + accessToken)
.param("agenda_key", agenda.getAgendaKey().toString())
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(dto)))
.content(request))
.andExpect(status().isBadRequest());
}

Expand All @@ -133,14 +145,15 @@ void createAgendaAnnouncementFailedWithNoContent() throws Exception {
// given
Agenda agenda = agendaMockData.createAgenda(user.getIntraId());
AgendaAnnouncementCreateReqDto dto = AgendaAnnouncementCreateReqDto.builder()
.title("title").build(); // content가 null인 경우
.title("title").build(); // content가 null인 경우
String request = objectMapper.writeValueAsString(dto);

// expected
mockMvc.perform(post("/agenda/announcement")
.header("Authorization", "Bearer " + accessToken)
.param("agenda_key", agenda.getAgendaKey().toString())
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(dto)))
.content(request))
.andExpect(status().isBadRequest());
}

Expand All @@ -150,14 +163,15 @@ void createAgendaAnnouncementFailedWithEmptyContent() throws Exception {
// given
Agenda agenda = agendaMockData.createAgenda(user.getIntraId());
AgendaAnnouncementCreateReqDto dto = AgendaAnnouncementCreateReqDto.builder()
.title("title").content("").build(); // content가 empty인 경우
.title("title").content("").build(); // content가 empty인 경우
String request = objectMapper.writeValueAsString(dto);

// expected
mockMvc.perform(post("/agenda/announcement")
.header("Authorization", "Bearer " + accessToken)
.param("agenda_key", agenda.getAgendaKey().toString())
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(dto)))
.content(request))
.andExpect(status().isBadRequest());
}

Expand All @@ -167,30 +181,32 @@ void createAgendaAnnouncementFailedWithNoAgenda() throws Exception {
// given
AgendaAnnouncementCreateReqDto dto = AgendaAnnouncementCreateReqDto.builder()
.title("title").content("content").build();
String request = objectMapper.writeValueAsString(dto);

// expected
mockMvc.perform(post("/agenda/announcement")
.header("Authorization", "Bearer " + accessToken)
.param("agenda_key", UUID.randomUUID().toString())
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(dto)))
.content(request))
.andExpect(status().isNotFound());
}

@Test
@DisplayName("AgendaAnnouncement 생성 실패 - 개최자가 아닌 경우")
void createAgendaAnnouncementFailedWithNotHost() throws Exception {
// given
Agenda agenda = agendaMockData.createAgenda("another"); // 다른 사용자가 생성한 Agenda
Agenda agenda = agendaMockData.createAgenda("another"); // 다른 사용자가 생성한 Agenda
AgendaAnnouncementCreateReqDto dto = AgendaAnnouncementCreateReqDto.builder()
.title("title").content("content").build();
String request = objectMapper.writeValueAsString(dto);

// expected
mockMvc.perform(post("/agenda/announcement")
.header("Authorization", "Bearer " + accessToken)
.param("agenda_key", agenda.getAgendaKey().toString())
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(dto)))
.content(request))
.andExpect(status().isForbidden());
}
}
Expand All @@ -199,20 +215,86 @@ void createAgendaAnnouncementFailedWithNotHost() throws Exception {
@DisplayName("AgendaAnnouncement 전체 조회")
class getAgendaAnnouncementList {

@Test
@ParameterizedTest
@ValueSource(ints = {1, 2, 3})
@DisplayName("AgendaAnnouncement 전체 조회 성공")
void getAgendaAnnouncementListSuccess() {
void getAgendaAnnouncementListSuccess(int page) throws Exception {
// given
int total = 35;
int size = 10;
Agenda agenda = agendaMockData.createAgenda(user.getIntraId());
agendaMockData.createAgendaAnnouncementList(agenda, 30, false);
List<AgendaAnnouncement> announcements = agendaMockData
.createAgendaAnnouncementList(agenda, total, true);
PageRequestDto pageRequest = new PageRequestDto(page, size);
String request = objectMapper.writeValueAsString(pageRequest);

// when
String response = mockMvc.perform(get("/agenda/announcement")
.param("agenda_key", agenda.getAgendaKey().toString())
.header("Authorization", "Bearer " + accessToken)
.contentType(MediaType.APPLICATION_JSON)
.content(request))
.andExpect(status().isOk()).andReturn().getResponse().getContentAsString();
AgendaAnnouncementResDto[] result = objectMapper.readValue(response, AgendaAnnouncementResDto[].class);

// then
assertThat(result).hasSize(size * page < total ? size : total % size);
announcements.sort((o1, o2) -> Long.compare(o2.getId(), o1.getId()));
for (int i = 0; i < result.length; i++) {
assertThat(result[i].getId()).isEqualTo(announcements.get(i + (page - 1) * size).getId());
assertThat(result[i].getTitle()).isEqualTo(announcements.get(i + (page - 1) * size).getTitle());
assertThat(result[i].getContent()).isEqualTo(announcements.get(i + (page - 1) * size).getContent());
if (i == 0) {
continue;
}
assertThat(result[i].getId()).isLessThan(result[i - 1].getId());
}
}

@Test
@DisplayName("AgendaAnnouncement 전체 조회 성공 - 데이터 없는 경우")
void getAgendaAnnouncementListSuccessWhenNoEntity() {
void getAgendaAnnouncementListSuccessWhenNoEntity() throws Exception {
// given
int page = 1;
int size = 10;
Agenda agenda = agendaMockData.createAgenda(user.getIntraId());
agendaMockData.createAgendaAnnouncementList(agenda, 30, false);
PageRequestDto pageRequest = new PageRequestDto(page, size);
String request = objectMapper.writeValueAsString(pageRequest);

// when
String response = mockMvc.perform(get("/agenda/announcement")
.param("agenda_key", agenda.getAgendaKey().toString())
.header("Authorization", "Bearer " + accessToken)
.contentType(MediaType.APPLICATION_JSON)
.content(request))
.andExpect(status().isOk()).andReturn().getResponse().getContentAsString();
AgendaAnnouncementResDto[] result = objectMapper.readValue(response, AgendaAnnouncementResDto[].class);

// then
assertThat(result).hasSize(0);
}

@Test
@DisplayName("AgendaAnnouncement 전체 조회 실패 - Agenda가 없는 경우")
void getAgendaAnnouncementListFailedWithInvalidAgenda() throws Exception {
// given
int page = 1;
int size = 10;
Agenda agenda = agendaMockData.createAgenda(user.getIntraId());
agendaMockData.createAgendaAnnouncementList(agenda, 30, false);
agendaMockData.createAgendaAnnouncementList(agenda, 30, true);
PageRequestDto pageRequest = new PageRequestDto(page, size);
String request = objectMapper.writeValueAsString(pageRequest);

// when
mockMvc.perform(get("/agenda/announcement")
.param("agenda_key", UUID.randomUUID().toString())
.header("Authorization", "Bearer " + accessToken)
.contentType(MediaType.APPLICATION_JSON)
.content(request))
.andExpect(status().isNotFound());
}
}
}

0 comments on commit 7651cfc

Please sign in to comment.