Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Pet 93 test : Unit Test용 애노테이션 및 테스트 환경에서 SecurityContextHolder에 인증 사용자 정보 주입 애노테이션 추가 #43

Merged
merged 9 commits into from
Sep 8, 2023
Merged
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,18 @@

import com.navercorp.fixturemonkey.FixtureMonkey;
import com.pawith.authmodule.application.service.JWTExtractEmailService;
import com.pawith.commonmodule.UnitTestConfig;
import com.pawith.jwt.JWTProvider;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.verify;

@Slf4j
@ExtendWith(MockitoExtension.class)
@UnitTestConfig
@DisplayName("JWTExtractEmailService 테스트")
public class JWTExtractEmailServiceTest {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,15 @@

import com.pawith.authmodule.application.common.exception.InvalidAuthorizationTypeException;
import com.pawith.authmodule.application.service.JWTExtractTokenService;
import lombok.extern.slf4j.Slf4j;
import com.pawith.commonmodule.UnitTestConfig;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.junit.jupiter.MockitoExtension;

import static org.junit.jupiter.api.Assertions.assertEquals;

@Slf4j
@ExtendWith(MockitoExtension.class)
@UnitTestConfig
@DisplayName("JWTExtractTokenService 테스트")
public class JWTExtractTokenServiceTest {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,17 @@

import com.navercorp.fixturemonkey.FixtureMonkey;
import com.pawith.authmodule.application.service.JWTVerifyService;
import com.pawith.commonmodule.UnitTestConfig;
import com.pawith.jwt.JWTProvider;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;

import static org.mockito.BDDMockito.then;
import static org.mockito.Mockito.times;

@Slf4j
@ExtendWith(MockitoExtension.class)
@UnitTestConfig
@DisplayName("JWTVerifyService 테스트")
public class JWTVerifyServiceTest {

Expand Down
Original file line number Diff line number Diff line change
@@ -1,28 +1,20 @@
package com.pawith.auth.application;

import com.navercorp.fixturemonkey.FixtureMonkey;
import com.navercorp.fixturemonkey.api.introspector.ConstructorPropertiesArbitraryIntrospector;
import com.pawith.authmodule.application.dto.OAuthRequest;
import com.pawith.authmodule.application.dto.OAuthResponse;
import com.pawith.authmodule.application.dto.Provider;
import com.pawith.authmodule.application.port.out.command.OAuthInvoker;
import com.pawith.authmodule.application.service.OAuthService;
import lombok.extern.slf4j.Slf4j;
import com.pawith.commonmodule.UnitTestConfig;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.BDDMockito.given;
import static org.mockito.BDDMockito.then;
import static org.mockito.Mockito.*;
import static org.mockito.Mockito.times;

@Slf4j
@ExtendWith(MockitoExtension.class)
@UnitTestConfig
@DisplayName("OAuthService 테스트")
public class OAuthServiceTest {

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.pawith.jwt;

import com.navercorp.fixturemonkey.FixtureMonkey;
import com.pawith.commonmodule.UnitTestConfig;
import com.pawith.commonmodule.cache.ObjectRegistry;
import com.pawith.jwt.exception.ExpiredTokenException;
import com.pawith.jwt.exception.InvalidTokenException;
Expand All @@ -11,21 +12,17 @@
import io.jsonwebtoken.io.Decoders;
import io.jsonwebtoken.security.Keys;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;

import java.util.Optional;

import static org.mockito.BDDMockito.given;

@Slf4j
@ExtendWith(MockitoExtension.class)
@UnitTestConfig
@DisplayName("JWTProvider 테스트")
public class JWTProviderTest {
private final JWTProperties jwtProperties = new JWTProperties(JWTTestConsts.SECRET, JWTTestConsts.ACCESS_TOKEN_EXPIRED_TIME, JWTTestConsts.REFRESH_TOKEN_EXPIRED_TIME);
Expand All @@ -48,7 +45,6 @@ void generateAccessTokenByEmail(){
//when
final Claims body = extractClaimsFromToken(accessToken);
//then
log.info("email: {}",randomEmail);
Assertions.assertThat(body.get(JWTConsts.EMAIL)).isEqualTo(randomEmail);
Assertions.assertThat(body.get(JWTConsts.TOKEN_TYPE)).isEqualTo(TokenType.ACCESS_TOKEN.toString());
}
Expand Down
1 change: 1 addition & 0 deletions Auth-Module/build.gradle
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
subprojects {
dependencies {
implementation project(":Common-Module")
testImplementation(testFixtures(project(':Common-Module')))

// spring security
implementation "org.springframework.boot:spring-boot-starter-security"
Expand Down
1 change: 1 addition & 0 deletions Common-Module/build.gradle
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
dependencies {
// security
implementation 'org.springframework.boot:spring-boot-starter-security'
testFixturesImplementation 'org.springframework.security:spring-security-test'
//restdocs
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,13 @@

import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.springframework.security.core.context.SecurityContextHolder;

@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class SecurityUtils {

public static String getAuthenticationPrincipal() {
final String email = (String) org.springframework.security.core.context.SecurityContextHolder.getContext().getAuthentication().getPrincipal();
final String email = (String)SecurityContextHolder.getContext().getAuthentication().getPrincipal();
return email;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.pawith.commonmodule;


import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@ExtendWith({MockitoExtension.class})
@SpringJUnitConfig // https://stackoverflow.com/questions/69175844/spring-security-test-withmockuser-not-working
public @interface UnitTestConfig {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.pawith.commonmodule.security;

import org.springframework.security.test.context.support.WithSecurityContext;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@WithSecurityContext(factory = WithMockAuthUserSecurityContextFactory.class)
public @interface WithMockAuthUser {
String email() default "email";
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.pawith.commonmodule.security;

import com.navercorp.fixturemonkey.FixtureMonkey;
import org.springframework.security.authentication.AbstractAuthenticationToken;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.test.context.support.WithSecurityContextFactory;

public final class WithMockAuthUserSecurityContextFactory implements WithSecurityContextFactory<WithMockAuthUser> {

@Override
public SecurityContext createSecurityContext(WithMockAuthUser annotation) {
final SecurityContext emptyContext = SecurityContextHolder.createEmptyContext();
emptyContext.setAuthentication(new AbstractAuthenticationToken(null) {
@Override
public Object getCredentials() {
return null;
}

@Override
public Object getPrincipal() {
return annotation.email().equals("email") ? FixtureMonkey.create().giveMeOne(String.class):annotation.email();
}

@Override
public boolean isAuthenticated() {
return true;
}
});
return emptyContext;
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package com.pawith.user.application.handler;
package com.pawith.usermodule.application.handler;

import com.navercorp.fixturemonkey.FixtureMonkey;
import com.navercorp.fixturemonkey.api.introspector.ConstructorPropertiesArbitraryIntrospector;
import com.pawith.commonmodule.UnitTestConfig;
import com.pawith.commonmodule.exception.Error;
import com.pawith.usermodule.application.handler.UserSignUpHandler;
import com.pawith.usermodule.application.handler.event.UserSignUpEvent;
import com.pawith.usermodule.domain.exception.AccountAlreadyExistException;
import com.pawith.usermodule.domain.service.UserAuthoritySaveService;
Expand All @@ -14,19 +14,15 @@
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;


import static org.mockito.ArgumentMatchers.any;
import static org.mockito.BDDMockito.given;
import static org.mockito.BDDMockito.then;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.times;

@Slf4j
@ExtendWith(MockitoExtension.class)
@UnitTestConfig
@DisplayName("UserSignUpHandler 테스트")
public class UserSignUpHandlerTest {

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package com.pawith.usermodule.application.service;

import com.navercorp.fixturemonkey.FixtureMonkey;
import com.navercorp.fixturemonkey.api.introspector.ConstructorPropertiesArbitraryIntrospector;
import com.pawith.commonmodule.UnitTestConfig;
import com.pawith.commonmodule.security.WithMockAuthUser;
import com.pawith.usermodule.application.service.dto.UserAuthorityInfoResponse;
import com.pawith.usermodule.domain.entity.UserAuthority;
import com.pawith.usermodule.domain.service.UserAuthorityQueryService;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.mockito.Mock;

import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.BDDMockito.given;

@UnitTestConfig
@DisplayName("UserAuthorityGetUseCase 테스트")
class UserAuthorityGetUseCaseTest {

@Mock
UserAuthorityQueryService userAuthorityQueryService;

UserAuthorityGetUseCase userAuthorityGetUseCase;

private static final String MOCK_EMAIL = "email";

@BeforeEach
void init() {
userAuthorityGetUseCase = new UserAuthorityGetUseCase(userAuthorityQueryService);
}

@Test
@WithMockAuthUser
@DisplayName("유저 권한을 조회한다.")
void getUserAuthority() {
//given
final UserAuthority userAuthority = FixtureMonkey.builder().objectIntrospector(ConstructorPropertiesArbitraryIntrospector.INSTANCE).defaultNotNull(true).build()
.giveMeBuilder(UserAuthority.class)
.sample();
given(userAuthorityQueryService.findByEmail(anyString())).willReturn(userAuthority);
//when
UserAuthorityInfoResponse result = userAuthorityGetUseCase.getUserAuthority();
//then
Assertions.assertThat(result).usingRecursiveComparison().isEqualTo(new UserAuthorityInfoResponse(userAuthority.getAuthority()));
}

}
Original file line number Diff line number Diff line change
@@ -1,16 +1,13 @@
package com.pawith.usermodule.domain.entity;

import com.pawith.commonmodule.domain.BaseEntity;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.junit.jupiter.api.DisplayName;
import lombok.*;

import javax.persistence.*;

@Entity
@Getter
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class UserAuthority extends BaseEntity {
@Id@GeneratedValue(strategy = GenerationType.IDENTITY)
Expand Down
Loading