Skip to content

Commit

Permalink
Merge pull request #67 from Stumeet/dev
Browse files Browse the repository at this point in the history
✅ [STMT-146] 로그아웃 API 테스트 코드 추가 (#66)
  • Loading branch information
zxcv9203 authored Feb 29, 2024
2 parents 879730b + 552034d commit fde7f49
Show file tree
Hide file tree
Showing 6 changed files with 96 additions and 4 deletions.
15 changes: 15 additions & 0 deletions src/docs/asciidoc/index.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,21 @@ include::{snippets}/social_login/fail/not-exist-header/response-body.adoc[]

include::{snippets}/social_login/fail/invalid-token/response-fields.adoc[]

== 로그아웃

로그아웃 시 사용되는 API입니다.

=== POST /api/v1/logout

==== 요청

include::{snippets}/logout/success/http-request.adoc[]
include::{snippets}/logout/success/request-headers.adoc[]

==== 응답 성공 (200)
include::{snippets}/logout/success/response-body.adoc[]
include::{snippets}/logout/success/response-fields.adoc[]

== 토큰 재발급

서버로 부터 받은 액세스 토큰이 만료된 경우 액세스 토큰 재발급을 위해 사용되는 API입니다.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {

http.authorizeHttpRequests(auth -> {
auth.requestMatchers(HttpMethod.POST, "/api/v1/oauth").permitAll();
auth.requestMatchers(HttpMethod.POST,"/api/v1/tokens").permitAll();
auth.requestMatchers(HttpMethod.POST, "/api/v1/tokens").permitAll();
auth.requestMatchers("/h2-console/**").permitAll();
auth.requestMatchers("/docs/**").permitAll();
auth.requestMatchers("/api/v1/signup").hasAnyAuthority("FIRST_LOGIN");
Expand All @@ -82,6 +82,7 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {

return http.build();
}

@Bean
public SecurityContextRepository securityContextRepository() {
return new RequestAttributeSecurityContextRepository();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
package com.stumeet.server.common.auth.filter;

import com.stumeet.server.common.auth.model.AuthenticationHeader;
import com.stumeet.server.common.token.JwtTokenProvider;
import com.stumeet.server.common.util.JwtUtil;
import com.stumeet.server.member.adapter.out.persistence.JpaMemberRepository;
import com.stumeet.server.member.adapter.out.persistence.MemberJpaEntity;
import com.stumeet.server.stub.MemberStub;
import com.stumeet.server.stub.TokenStub;
import com.stumeet.server.template.ApiTest;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.restdocs.payload.JsonFieldType;
import org.springframework.transaction.annotation.Transactional;

import static org.springframework.restdocs.headers.HeaderDocumentation.headerWithName;
import static org.springframework.restdocs.headers.HeaderDocumentation.requestHeaders;
import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document;
import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.post;
import static org.springframework.restdocs.operation.preprocess.Preprocessors.*;
import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath;
import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

@Transactional
public class LogoutFilterTest extends ApiTest {

@Autowired
private JpaMemberRepository jpaMemberRepository;

@Autowired
private JwtTokenProvider jwtTokenProvider;

@Autowired
private RedisTemplate<String, String> redisTemplate;

@Nested
@DisplayName("로그아웃")
class Logout {

private final String path = "/api/v1/logout";

@BeforeEach
void setUp() {
MemberJpaEntity entity = jpaMemberRepository.save(MemberStub.getMemberEntity());
redisTemplate.opsForValue()
.set(
JwtUtil.resolveToken(TokenStub.getMockAccessToken()),
jwtTokenProvider.generateRefreshToken(entity.getId())
);
}

@Test
@DisplayName("[성공] 로그아웃에 성공합니다.")
void successTest() throws Exception {
mockMvc.perform(post(path)
.header(AuthenticationHeader.ACCESS_TOKEN.getName(), TokenStub.getMockAccessToken()))
.andExpect(status().isOk())
.andDo(document("logout/success",
preprocessRequest(prettyPrint()),
preprocessResponse(prettyPrint()),
requestHeaders(
headerWithName(AuthenticationHeader.ACCESS_TOKEN.getName()).description("서버로부터 전달받은 액세스 토큰")
),
responseFields(
fieldWithPath("code").type(JsonFieldType.NUMBER).description("응답에 대한 결과 코드"),
fieldWithPath("message").type(JsonFieldType.STRING).description("응답에 대한 메시지")
)
)
);
}
}
}
2 changes: 1 addition & 1 deletion src/test/java/com/stumeet/server/stub/TokenStub.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public static String getExpiredAccessToken() {
}

public static String getInvalidToken() {
return "invalidToken";
return "Bearer eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJTVFVNRUVUIiwic3ViIjoiMSIsImF1dGgiOiJGSVJTVF9MT0dJTiIsImV4cCI6MTcwOTA0MTM1Mn0.1dU2fb1wUgJeV8R1RAjFpKx3g3qToRZnft1lxSejL7o";
}
public static String getMockAccessToken() {
return "Bearer eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJTVFVNRUVUIiwic3ViIjoiMSIsImF1dGgiOiJGSVJTVF9MT0dJTiIsImV4cCI6MTcwOTA0MTM1Mn0.1dU2fb1wUgJeV8R1RAjFpKxBg3qToRZnft1lxSejL7o";
Expand Down
1 change: 0 additions & 1 deletion src/test/java/com/stumeet/server/template/ApiTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,6 @@ public abstract class ApiTest {

@BeforeEach
void setUpMockMvc(WebApplicationContext context, RestDocumentationContextProvider provider) {

this.mockMvc = MockMvcBuilders.webAppContextSetup(context)
.addFilter(new CharacterEncodingFilter("UTF-8", true))
.apply(documentationConfiguration(provider))
Expand Down
2 changes: 1 addition & 1 deletion src/test/resources/application.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,4 +39,4 @@ oauth:
apple:
url: http://localhost:8089
kakao:
url: http://localhost:8089
url: http://localhost:8089

0 comments on commit fde7f49

Please sign in to comment.