본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.
공부 시작 시각 인증
공부 시작 시각 인증
수강 인증 사진
수강 인증 사진
AuthConfig.java
package org.fastcampus.common.config;
import java.util.List;
import org.fastcampus.auth.domain.*;
import org.fastcampus.common.principal.*;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class AuthConfig implements WebMvcConfigurer {
private TokenProvider tokenProvider;
public AuthConfig(TokenProvider tokenProvider) {
this.tokenProvider = tokenProvider;
}
@Override
public void addArgumentResolvers(List argumentResolvers) {
argumentResolvers.add(new AuthPrincipalArgumentResolver(tokenProvider));
}
}
AuthPrincipalArgumentResolver.java
package org.fastcampus.common.principal;
import org.fastcampus.auth.domain.TokenProvider;
import org.springframework.core.MethodParameter;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;
public class AuthPrincipalArgumentResolver implements HandlerMethodArgumentResolver {
private final TokenProvider tokenProvider;
public AuthPrincipalArgumentResolver(TokenProvider tokenProvider) {
this.tokenProvider = tokenProvider;
}
@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.hasParameterAnnotation(AuthPrincipal.class);
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, WebDataBinderFactory binderFactory) {
try {
String authToken = webRequest.getHeader("Authorization");
if (authToken == null || authToken.split(" ").length != 2) {
throw new IllegalArgumentException();
}
String token = authToken.split(" ")[1];
Long userId = tokenProvider.getUserId(token);
String role = tokenProvider.getUserRole(token);
return new UserPrincipal(userId, role);
} catch (Exception e) {
throw new IllegalArgumentException("Invalid token");
}
}
}
FeedController.java
package org.fastcampus.post.ui;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.fastcampus.common.principal.*;
import org.fastcampus.common.ui.*;
import org.fastcampus.post.application.dto.GetPostContentResponseDto;
import org.fastcampus.post.repository.post_queue.UserPostQueueQueryRepository;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/feed")
@RequiredArgsConstructor
public class FeedController {
private final UserPostQueueQueryRepository userPostQueueQueryRepository;
@GetMapping
public Response<List<GetPostContentResponseDto>> getPostFeedList(@AuthPrincipal UserPrincipal userPrincipal, Long lastContentId) {
List<GetPostContentResponseDto> contentResponse = userPostQueueQueryRepository.getContentResponse(userPrincipal.getUserId(), lastContentId);
return Response.OK(contentResponse);
}
}
AcceptanceTestTemplate.java
package org.fastcampus.acceptance.utils;
import org.fastcampus.auth.application.dto.*;
import org.junit.jupiter.api.BeforeEach;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
import org.springframework.test.context.ActiveProfiles;
import static org.fastcampus.acceptance.steps.LoginAcceptanceSteps.*;
@ActiveProfiles("test")
@SpringBootTest(webEnvironment = WebEnvironment.DEFINED_PORT)
public class AcceptanceTestTemplate {
@Autowired
private DatabaseCleanUp cleanUp;
@Autowired
private DataLoader loader;
@BeforeEach
public void init() {
cleanUp.execute();
loader.loadData();
}
protected void cleanUp() {
cleanUp.execute();
}
protected String getEmailToken(String email) {
return loader.getEmailToken(email);
}
protected boolean isEmailVerified(String email) {
return loader.isEmailVerified(email);
}
protected Long getUserId(String email) {
return loader.getUserId(email);
}
protected void createUser(String email) {
loader.createUser(email);
}
protected String login(String email) {
return requestLoginGetToken(new LoginRequestDto(email, "password"));
}
}
FeedAcceptanceSteps.java
package org.fastcampus.acceptance.steps;
import io.restassured.RestAssured;
import java.util.List;
import org.fastcampus.post.application.dto.CreatePostRequestDto;
import org.fastcampus.post.application.dto.GetPostContentResponseDto;
import org.springframework.http.MediaType;
public class FeedAcceptanceSteps {
public static Long requestCreatePost(CreatePostRequestDto dto) {
return RestAssured
.given().log().all()
.body(dto)
.contentType(MediaType.APPLICATION_JSON_VALUE)
.when()
.post("/post")
.then().log().all()
.extract()
.jsonPath()
.getObject("value", Long.class);
}
public static List<GetPostContentResponseDto> requestFeed(String token) {
return RestAssured
.given().log().all()
.header("Authorization", "Bearer " + token)
.accept(MediaType.APPLICATION_JSON_VALUE)
.when()
.get("/feed")
.then().log().all()
.extract()
.jsonPath()
.getList("value", GetPostContentResponseDto.class);
}
public static Integer requestFeedCode(String token) {
return RestAssured
.given().log().all()
.header("Authorization", "Bearer " + token)
.accept(MediaType.APPLICATION_JSON_VALUE)
.when()
.get("/feed")
.then().log().all()
.extract()
.jsonPath()
.get("code");
}
}
FeedAcceptanceTest.java
package org.fastcampus.acceptance;
import java.util.List;
import org.fastcampus.acceptance.utils.*;
import org.fastcampus.post.application.dto.CreatePostRequestDto;
import org.fastcampus.post.domain.content.PostPublicationState;
import org.fastcampus.post.application.dto.GetPostContentResponseDto;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.fastcampus.acceptance.steps.FeedAcceptanceSteps.*;
import static org.junit.jupiter.api.Assertions.*;
class FeedAcceptanceTest extends AcceptanceTestTemplate {
private String token;
/**
* User 1 --- follows ---> User 2
* User 1 --- follows ---> User 3
*/
@BeforeEach
void setUp() {
super.init();
this.token = login("user1@test.com");
}
/**
* User 2 create Post 1
* User 1 Get Post 1 From Feed
*/
@Test
void givenUserHasFollowerAndCreatePost_whenFollowerUserRequestFeed_thenFollowerCanGetPostFromFeed() {
// given
CreatePostRequestDto dto = new CreatePostRequestDto(2L, "user 1 can get this post", PostPublicationState.PUBLIC);
Long createdPostId = requestCreatePost(dto);
// when
List<GetPostContentResponseDto> result = requestFeed(token);
// then
assertEquals(1, result.size());
assertEquals(createdPostId, result.get(0).getId());
}
@Test
void givenUserHasFollower_whenFollowerUserRequestFeedWithInvalidToken_thenFollowerCanNotGetPostFromFeed() {
// when
Integer code = requestFeedCode("invalid-token");
// then
assertEquals(400, code);
}
}
학습 인증샷
학습 인증샷
공부 종료 시각 인증
공부 종료 시각 인증
https://bit.ly/4hTSJNB