From b6ecacb3b9bb6f02d3e267e7343603bbe1778224 Mon Sep 17 00:00:00 2001 From: binary_ho Date: Tue, 12 Mar 2024 17:24:00 +0900 Subject: [PATCH] =?UTF-8?q?test=20:=20SecurityConfig=20Test=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=9E=91=EC=84=B1=20(#112)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../imhere/security/SecurityConfigTest.java | 83 +++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 src/test/java/gdsc/binaryho/imhere/security/SecurityConfigTest.java diff --git a/src/test/java/gdsc/binaryho/imhere/security/SecurityConfigTest.java b/src/test/java/gdsc/binaryho/imhere/security/SecurityConfigTest.java new file mode 100644 index 0000000..54e2cdb --- /dev/null +++ b/src/test/java/gdsc/binaryho/imhere/security/SecurityConfigTest.java @@ -0,0 +1,83 @@ +package gdsc.binaryho.imhere.security; + +import static gdsc.binaryho.imhere.mock.fixture.MemberFixture.MOCK_STUDENT; +import static org.hamcrest.Matchers.containsString; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.BDDMockito.given; +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.header; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import gdsc.binaryho.imhere.core.member.Role; +import gdsc.binaryho.imhere.core.member.infrastructure.MemberRepository; +import gdsc.binaryho.imhere.security.jwt.Token; +import gdsc.binaryho.imhere.security.jwt.TokenService; +import java.util.Optional; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +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.mock.mockito.MockBean; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.security.oauth2.client.userinfo.DefaultOAuth2UserService; +import org.springframework.test.web.servlet.MockMvc; + +@SpringBootTest +@ExtendWith(MockitoExtension.class) +@AutoConfigureMockMvc +public class SecurityConfigTest { + + @Autowired + private MockMvc mockMvc; + + @Autowired + private TokenService tokenService; + + @MockBean + private MemberRepository memberRepository; + + @Mock + private DefaultOAuth2UserService defaultOAuth2UserService; + + private static final String ACCESS_TOKEN_PREFIX = "Token "; + + @Test + public void 인증이_필요한_경로에_접근하면_깃허브_로그인_페이지로_Redirection_된다() throws Exception { + mockMvc.perform(post("/") + .contentType(MediaType.APPLICATION_JSON) + ) + .andExpect(status().is3xxRedirection()) + .andExpect(header().string("Location", containsString("/oauth2/authorization/github"))); + } + + @Test + public void 토큰을_통해_인가_할_수_있다() throws Exception { + given(memberRepository.findById(any())) + .willReturn(Optional.of(MOCK_STUDENT)); + Token token = tokenService.createToken(1L, Role.STUDENT); + + mockMvc.perform(get("/api/lecture") + .contentType(MediaType.APPLICATION_JSON) + .header(HttpHeaders.AUTHORIZATION, ACCESS_TOKEN_PREFIX + token.getAccessToken()) + ) + .andExpect(status().is2xxSuccessful()); + } + + @Test + public void 권한이_없는_토큰_요청은_403_응답을_반환한다() throws Exception { + given(memberRepository.findById(any())) + .willReturn(Optional.of(MOCK_STUDENT)); + Token token = tokenService.createToken(1L, Role.STUDENT); + + mockMvc.perform(post("/api/admin/role/1") + .contentType(MediaType.APPLICATION_JSON) + .header(HttpHeaders.AUTHORIZATION, ACCESS_TOKEN_PREFIX + token.getAccessToken()) + ) + .andExpect(status().isForbidden()); + } +}