package shop.mtcoding.bank.config.jwt;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.ResultActions;
import com.fasterxml.jackson.databind.ObjectMapper;
import shop.mtcoding.bank.dto.user.UserRequestDto.LoginRequestDto;
@AutoConfigureMockMvc
@SpringBootTest(webEnvironment = WebEnvironment.MOCK)
public class JwtAuthenticationFilterTest {
@Autowired
private ObjectMapper om;
@Autowired
private MockMvc mvc;
@Test
public void successfulAuthentication_test() throws Exception {
// given
LoginRequestDto loginRequestDto = new LoginRequestDto();
loginRequestDto.setUsername("ssar");
loginRequestDto.setPassword("1234");
String reqeustBody = om.writeValueAsString(loginRequestDto);
System.out.println("테스트 : " + reqeustBody);
// when
ResultActions resultActions = mvc
.perform(post("/api/login").content(reqeustBody).contentType(MediaType.APPLICATION_JSON));
String reasponseBody = resultActions.andReturn().getResponse().getContentAsString();
System.out.println("테스트 : " + reasponseBody);
// then
}
실핼 시 오류 발생 -1 발생
이유 : ssar이 DB에 존재 X
동작 순서 확인
successfulAuthentication 발동
강제로그인 발동 -> UserDetailsService를 구현한 LoginService 발동
이때 Username을 넣는데, username이 없기 때문에 InternalAuthenticationServiceException 에러 발생
에러를 catach 해서
아래의 unsuccessfulAuthentication 발동
package shop.mtcoding.bank.config.jwt;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.ResultActions;
import com.fasterxml.jackson.databind.ObjectMapper;
import shop.mtcoding.bank.config.dummy.DummyObject;
import shop.mtcoding.bank.domain.user.UserRepository;
import shop.mtcoding.bank.dto.user.UserRequestDto.LoginRequestDto;
@AutoConfigureMockMvc
@SpringBootTest(webEnvironment = WebEnvironment.MOCK)
public class JwtAuthenticationFilterTest extends DummyObject {
@Autowired
private ObjectMapper om;
@Autowired
private MockMvc mvc;
@Autowired
private UserRepository userRepository;
@BeforeEach
public void setUp() throws Exception {
userRepository.save(newUser("ssar", "쌀"));
}
@Test
public void successfulAuthentication_test() throws Exception {
// given
LoginRequestDto loginRequestDto = new LoginRequestDto();
loginRequestDto.setUsername("ssar");
loginRequestDto.setPassword("1234");
String reqeustBody = om.writeValueAsString(loginRequestDto);
System.out.println("테스트 : " + reqeustBody);
// when
ResultActions resultActions = mvc
.perform(post("/api/login").content(reqeustBody).contentType(MediaType.APPLICATION_JSON));
String reasponseBody = resultActions.andReturn().getResponse().getContentAsString();
System.out.println("테스트 : " + reasponseBody);
// then
}
@Test
public void unsuccessfulAuthentication_test() throws Exception {
// given
// when
// then
}
}
잡지식, test.yml
SQL 문을 이쁘게 format 해줌
@ActiveProfiles("test") // 여기
@AutoConfigureMockMvc
@SpringBootTest(webEnvironment = WebEnvironment.MOCK)
public class JwtAuthenticationFilterTest extends DummyObject {
TRACE가 있으면 어떤 값들이 들어왔는지 알 수 있다. 따라서 TEST 할때는 TRACE를 추가하자.
이렇게 결과가 나왔다는 것은,
여기서 토큰이 만들어지고
위에 사진에서 실행이 됬다는 것은 UserDetailsService가 실행이 잘 되어서 LoginUser를 리턴하고 Authentication이 잘 만들어진 것이다.
디버그를 해보면 잘 나왔을 것이다.
@Test
public void successfulAuthentication_test() throws Exception {
// given
LoginRequestDto loginRequestDto = new LoginRequestDto();
loginRequestDto.setUsername("ssar");
loginRequestDto.setPassword("1234");
String reqeustBody = om.writeValueAsString(loginRequestDto);
System.out.println("테스트 : " + reqeustBody);
// when
ResultActions resultActions = mvc
.perform(post("/api/login").content(reqeustBody).contentType(MediaType.APPLICATION_JSON));
String reasponseBody = resultActions.andReturn().getResponse().getContentAsString();
String jwtToken = resultActions.andReturn().getResponse().getHeader(JwtValueObject.HEADER);
System.out.println("테스트 : " + reasponseBody);
System.out.println("테스트 : " + jwtToken);
// then
resultActions.andExpect(status().isOk());
assertNotNull(jwtToken);
assertTrue(jwtToken.startsWith(JwtValueObject.TOKEN_PREFIX));
resultActions.andExpect(jsonPath("$.data.username").value("ssar"));
}