Skip to content
This repository has been archived by the owner on Aug 13, 2022. It is now read-only.

[#75] UserController 테스트 #76

Open
wants to merge 3 commits into
base: develop
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
156 changes: 156 additions & 0 deletions src/test/java/com/flab/makedel/service/UserControllerTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
package com.flab.makedel.service;

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

import com.flab.makedel.annotation.LoginCheck.UserLevel;
import com.flab.makedel.config.RedisConfig;
import com.flab.makedel.controller.UserController;
import com.flab.makedel.dto.UserDTO;
import com.flab.makedel.utils.PasswordEncrypter;
import java.util.Optional;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
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.Import;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;

@ExtendWith(SpringExtension.class)
@WebMvcTest(controllers = UserController.class)
@Import({RedisConfig.class, UserController.class})
class UserControllerTest {

@Autowired
MockMvc mockMvc;

@MockBean
UserService userService;

@MockBean
LoginService loginService;

@Test
@DisplayName("/users로 POST메소드를 보내 회원가입을 요청하는데 성공한다")
void signUpTest() throws Exception {
MultiValueMap<String, String> paramMap = new LinkedMultiValueMap<>();
paramMap.add("id", "here");
paramMap.add("password", "123123");
paramMap.add("name", "newname");
paramMap.add("phone", "01000000000");
paramMap.add("email", "mail@mail.com");
paramMap.add("address", "newaddress");
paramMap.add("level", "USER");

mockMvc.perform(
post("/users")
.contentType(MediaType.APPLICATION_JSON)
.params(paramMap))
.andExpect(status().isOk());

verify(userService).signUp(any(UserDTO.class));
}

@Test
@DisplayName("/{userId}/exists에 Get메소드로 중복된 아이디인지 체크하고 중복이 아니라면 200 상태코드를 반환한다")
void checkUniqueIdTest() throws Exception {
when(userService.isExistsId("newid1")).thenReturn(true);

mockMvc.perform(
get("/users/newid1/exists")
)
.andExpect(status().isOk());

verify(userService).isExistsId(any(String.class));
}

@Test
@DisplayName("/{userId}/exists에 Get메소드로 중복된 아이디인지 체크하고 중복이 아니라면 200 상태코드를 반환한다")
void checkUniqueIdTest_중복() throws Exception {
when(userService.isExistsId("newid1")).thenReturn(false);

mockMvc.perform(
get("/users/newid1/exists")
)
.andExpect(status().is4xxClientError());

verify(userService).isExistsId(any(String.class));
}

@Test
@DisplayName("/login에 Post 메소드로 로그인을 하는데 성공한다")
void loginTest() throws Exception {
UserDTO userDTO = UserDTO.builder()
.id("id")
.password(PasswordEncrypter.encrypt("pass"))
.name("name")
.email("email")
.phone("phone")
.address("ad")
.level(UserLevel.USER)
.build();

MultiValueMap<String, String> paramMap = new LinkedMultiValueMap<>();
paramMap.add("id", userDTO.getId());
paramMap.add("password", "pass");

Optional<UserDTO> user = Optional.ofNullable(userDTO);
when(userService.findUserByIdAndPassword(userDTO.getId(), "pass"))
.thenReturn(user);
doNothing().when(loginService).loginUser("id");

mockMvc.perform(post("/users/login")
.contentType(MediaType.APPLICATION_JSON)
.params(paramMap))
.andExpect(status().isOk());

verify(userService).findUserByIdAndPassword(any(String.class), any(String.class));
verify(loginService).loginUser(any(String.class));
}

@Test
@DisplayName("/login에 Post 메소드로 잘못된 비밀번호로 로그인을 하는데 실패하고 404에러를 보낸다")
void loginTest_실패() throws Exception {

MultiValueMap<String, String> paramMap = new LinkedMultiValueMap<>();
paramMap.add("id", "sameid");
paramMap.add("password", "wrong");

when(userService.findUserByIdAndPassword("sameid", "wrong"))
.thenReturn(Optional.empty());
doNothing().when(loginService).loginUser("id");

mockMvc.perform(post("/users/login")
.contentType(MediaType.APPLICATION_JSON)
.params(paramMap))
.andExpect(status().is4xxClientError());

verify(userService).findUserByIdAndPassword(any(String.class), any(String.class));
verify(loginService, times(0)).loginUser(any(String.class));
}

@Test
@DisplayName("/logout에 GET 메소드로 로그아웃을 하는데 성공한다")
void logoutTest() throws Exception {

doNothing().when(loginService).logoutUser();

mockMvc.perform(get("/users/logout"))
.andExpect(status().isOk());

verify(loginService).logoutUser();
}

}