diff --git a/src/main/java/com/gg/server/domain/tournament/controller/TournamentController.java b/src/main/java/com/gg/server/domain/tournament/controller/TournamentController.java index 013e2bbd5..58acfe25b 100644 --- a/src/main/java/com/gg/server/domain/tournament/controller/TournamentController.java +++ b/src/main/java/com/gg/server/domain/tournament/controller/TournamentController.java @@ -8,6 +8,7 @@ import org.springframework.data.domain.Sort; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ModelAttribute; @@ -31,6 +32,7 @@ @RestController @RequiredArgsConstructor @RequestMapping("/pingpong/tournaments") +@Validated public class TournamentController { private final TournamentService tournamentService; diff --git a/src/test/java/com/gg/server/domain/tournament/controller/TournamentControllerMvcTest.java b/src/test/java/com/gg/server/domain/tournament/controller/TournamentControllerMvcTest.java new file mode 100644 index 000000000..5c25a0200 --- /dev/null +++ b/src/test/java/com/gg/server/domain/tournament/controller/TournamentControllerMvcTest.java @@ -0,0 +1,218 @@ +package com.gg.server.domain.tournament.controller; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.Mockito.*; + +import javax.validation.ConstraintViolationException; + +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.mockito.Mockito; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.FilterType; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.test.web.servlet.MockMvc; + +import com.gg.server.domain.tournament.dto.TournamentFilterRequestDto; +import com.gg.server.domain.tournament.dto.TournamentGameListResponseDto; +import com.gg.server.domain.tournament.dto.TournamentListResponseDto; +import com.gg.server.domain.tournament.dto.TournamentResponseDto; +import com.gg.server.domain.tournament.dto.TournamentUserRegistrationResponseDto; +import com.gg.server.domain.tournament.service.TournamentService; +import com.gg.server.domain.user.dto.UserDto; +import com.gg.server.global.config.WebConfig; +import com.gg.server.global.security.config.SecurityConfig; +import com.gg.server.global.security.jwt.utils.TokenAuthenticationFilter; +import com.gg.server.global.utils.querytracker.LoggingInterceptor; +import com.gg.server.utils.annotation.UnitTest; + +@UnitTest +@WebMvcTest(controllers = TournamentController.class, excludeFilters = { + @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = SecurityConfig.class), + @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = WebConfig.class), + @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = TokenAuthenticationFilter.class), + @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = LoggingInterceptor.class)}) +class TournamentControllerMvcTest { + + @Autowired + private MockMvc mockMvc; + + @MockBean + private TournamentService tournamentService; + + @Autowired + private TournamentController tournamentController; + + @Nested + @DisplayName("getAllTournamentList") + class GetAllTournamentList { + + @DisplayName("페이지번호가 1보다 작을 경우 에러 발생") + @ParameterizedTest() + @ValueSource(ints = {-1, 0}) + void pageMustGreaterThanZero(Integer page) { + //Arrange + TournamentFilterRequestDto dto = new TournamentFilterRequestDto(page, 1, null, null); + + //Act, Assert + assertThatThrownBy(() -> tournamentController.getAllTournamentList(dto)) + .isInstanceOf(ConstraintViolationException.class); + } + + @DisplayName("사이즈가 1과 30 사이가 아닐경우 에러 발생") + @ParameterizedTest() + @ValueSource(ints = {-1, 0, 31}) + void sizeError(Integer size) { + //Arrange + TournamentFilterRequestDto dto = new TournamentFilterRequestDto(1, size, null, null); + + //Act, Assert + assertThatThrownBy(() -> tournamentController.getAllTournamentList(dto)) + .isInstanceOf(ConstraintViolationException.class); + } + + @DisplayName("Success") + @Test + void success() { + //Arrange + TournamentFilterRequestDto dto = new TournamentFilterRequestDto(1, 1, null, null); + TournamentListResponseDto resultDto = Mockito.mock(TournamentListResponseDto.class); + when(tournamentService.getAllTournamentList(any(), any(), any())).thenReturn(resultDto); + + //Act + ResponseEntity response = tournamentController.getAllTournamentList(dto); + + //Assert + assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); + assertThat(response.getBody()).isEqualTo(resultDto); + } + } + + @Nested + @DisplayName("getUserStatusInTournament") + class GetUserStatusInTournament { + @DisplayName("Success") + @Test + void success() { + //Arrange + UserDto userDto = Mockito.mock(UserDto.class); + TournamentUserRegistrationResponseDto resultDto = Mockito.mock(TournamentUserRegistrationResponseDto.class); + when(tournamentService.getUserStatusInTournament(any(), any())).thenReturn(resultDto); + + //Act + ResponseEntity response = tournamentController + .getUserStatusInTournament(1L, userDto); + + //Assert + assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); + assertThat(response.getBody()).isEqualTo(resultDto); + } + } + + @Nested + @DisplayName("getTournnament") + class GetTournnament { + @DisplayName("id가 양수가 아닐경우 에러 발생") + @ParameterizedTest() + @ValueSource(longs = {-1, 0}) + void idGreaterThanZero(Long id) { + //Act, Assert + assertThatThrownBy(() -> tournamentController.getTournnament(id)) + .isInstanceOf(ConstraintViolationException.class); + } + + @DisplayName("Success") + @Test + void success() { + //Arrange + TournamentResponseDto resultDto = Mockito.mock(TournamentResponseDto.class); + when(tournamentService.getTournament(anyLong())).thenReturn(resultDto); + + //Act + ResponseEntity response = tournamentController.getTournnament(1L); + + //Assert + assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); + assertThat(response.getBody()).isEqualTo(resultDto); + } + } + + @Nested + @DisplayName("cancelTournamentUserRegistration") + class CancelTournamentUserRegistration { + + @DisplayName("Success") + @Test + void success() { + //Arrange + UserDto userDto = Mockito.mock(UserDto.class); + TournamentUserRegistrationResponseDto resultDto = Mockito.mock(TournamentUserRegistrationResponseDto.class); + when(tournamentService.cancelTournamentUserRegistration(anyLong(), any())).thenReturn(resultDto); + + //Act + ResponseEntity response; + response = tournamentController.cancelTournamentUserRegistration(1L, userDto); + + //Assert + assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); + assertThat(response.getBody()).isEqualTo(resultDto); + } + } + + @Nested + @DisplayName("getTournamentGames") + class GetTournamentGames { + @DisplayName("id가 양수가 아닐경우 에러 발생") + @ParameterizedTest() + @ValueSource(longs = {-1, 0}) + void idGreaterThanZero(Long id) { + //Act, Assert + assertThatThrownBy(() -> tournamentController.getTournamentGames(id)) + .isInstanceOf(ConstraintViolationException.class); + } + + @DisplayName("Success") + @Test + void success() { + //Arrange + TournamentGameListResponseDto resultDto = Mockito.mock(TournamentGameListResponseDto.class); + when(tournamentService.getTournamentGames(anyLong())).thenReturn(resultDto); + + //Act + ResponseEntity response = tournamentController.getTournamentGames(1L); + + //Assert + assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); + assertThat(response.getBody()).isEqualTo(resultDto); + } + } + + @Nested + @DisplayName("registerTournamentUser") + class RegisterTournamentUser { + + @DisplayName("Success") + @Test + void success() { + //Arrange + UserDto userDto = Mockito.mock(UserDto.class); + TournamentUserRegistrationResponseDto resultDto = Mockito.mock(TournamentUserRegistrationResponseDto.class); + when(tournamentService.registerTournamentUser(anyLong(), any())).thenReturn(resultDto); + + //Act + ResponseEntity response; + response = tournamentController.registerTournamentUser(1L, userDto); + + //Assert + assertThat(response.getStatusCode()).isEqualTo(HttpStatus.CREATED); + assertThat(response.getBody()).isEqualTo(resultDto); + } + } +}