Skip to content

Commit

Permalink
Test | #157 | @lcomment | 유닛 테스트 추가 작성
Browse files Browse the repository at this point in the history
  • Loading branch information
lcomment committed Jul 12, 2024
1 parent 72ae5b2 commit 2e0e528
Show file tree
Hide file tree
Showing 5 changed files with 327 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
package com.cakk.api.controller;

import static org.mockito.Mockito.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;

import org.springframework.http.MediaType;

import com.cakk.api.common.annotation.TestWithDisplayName;
import com.cakk.api.common.base.MockMvcTest;
import com.cakk.api.dto.request.user.GenerateCodeRequest;
import com.cakk.api.dto.request.user.UserSignInRequest;
import com.cakk.api.dto.request.user.UserSignUpRequest;
import com.cakk.api.dto.request.user.VerifyEmailRequest;
import com.cakk.api.dto.response.user.JwtResponse;

class SignControllerTest extends MockMvcTest {

@TestWithDisplayName("")
void signUp() throws Exception {
// given
UserSignUpRequest dto = getConstructorMonkey().giveMeOne(UserSignUpRequest.class);
JwtResponse jwt = getConstructorMonkey().giveMeBuilder(JwtResponse.class)
.setNotNull("accessToken")
.setNotNull("refreshToken")
.setNotNull("grantType")
.sample();

doReturn(jwt).when(signService).signUp(dto);

// when & then
mockMvc.perform(post("/sign-up")
.content(objectMapper.writeValueAsString(dto))
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(jsonPath("$.data.accessToken").exists())
.andExpect(jsonPath("$.data.refreshToken").exists());
}

@TestWithDisplayName("")
void signIn() throws Exception {
// given
UserSignInRequest dto = getConstructorMonkey().giveMeOne(UserSignInRequest.class);
JwtResponse jwt = getConstructorMonkey().giveMeBuilder(JwtResponse.class)
.setNotNull("accessToken")
.setNotNull("refreshToken")
.setNotNull("grantType")
.sample();

doReturn(jwt).when(signService).signIn(dto);

// when & then
mockMvc.perform(post("/sign-in")
.content(objectMapper.writeValueAsString(dto))
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(jsonPath("$.data.accessToken").exists())
.andExpect(jsonPath("$.data.refreshToken").exists());
}

@TestWithDisplayName("")
void sendEmailForVerification() throws Exception {
// given
GenerateCodeRequest dto = getConstructorMonkey().giveMeOne(GenerateCodeRequest.class);

// when & then
mockMvc.perform(post("/email/request-code")
.content(objectMapper.writeValueAsString(dto))
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(jsonPath("$.data").doesNotExist());
}

@TestWithDisplayName("")
void verifyEmail() throws Exception {
// given
VerifyEmailRequest dto = getConstructorMonkey().giveMeOne(VerifyEmailRequest.class);

// when & then
mockMvc.perform(post("/email/verify-email")
.content(objectMapper.writeValueAsString(dto))
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(jsonPath("$.data").doesNotExist());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
package com.cakk.api.factory;

import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.*;

import org.mockito.InjectMocks;
import org.mockito.Mock;

import com.cakk.api.common.annotation.TestWithDisplayName;
import com.cakk.api.common.base.MockitoTest;
import com.cakk.api.provider.oauth.impl.AppleAuthProvider;
import com.cakk.api.provider.oauth.impl.GoogleAuthProvider;
import com.cakk.api.provider.oauth.impl.KakaoAuthProvider;
import com.cakk.common.enums.Provider;
import com.cakk.common.enums.ReturnCode;
import com.cakk.common.exception.CakkException;

public class OidcProviderFactoryTest extends MockitoTest {

@InjectMocks
private OidcProviderFactory oidcProviderFactory;

@Mock
private AppleAuthProvider appleAuthProvider;

@Mock
private KakaoAuthProvider kakaoAuthProvider;

@Mock
private GoogleAuthProvider googleAuthProvider;

@TestWithDisplayName("애플 제공자와 idToken을 받아 제공자의 id를 반환한다")
void getProviderId1() {
// given
final Provider provider = Provider.APPLE;
final String idToken = "id";
final String providerId = "providerId";

doReturn(providerId).when(appleAuthProvider).getProviderId(idToken);

// when
String result = oidcProviderFactory.getProviderId(provider, idToken);

// then
assertEquals(providerId, result);

verify(appleAuthProvider, times(1)).getProviderId(idToken);
}

@TestWithDisplayName("구글 제공자와 idToken을 받아 제공자의 id를 반환한다")
void getProviderId2() {
// given
final Provider provider = Provider.GOOGLE;
final String idToken = "id";
final String providerId = "providerId";

doReturn(providerId).when(googleAuthProvider).getProviderId(idToken);

// when
String result = oidcProviderFactory.getProviderId(provider, idToken);

// then
assertEquals(providerId, result);

verify(googleAuthProvider, times(1)).getProviderId(idToken);
}

@TestWithDisplayName("카카오 제공자와 idToken을 받아 제공자의 id를 반환한다")
void getProviderId3() {
// given
final Provider provider = Provider.KAKAO;
final String idToken = "id";
final String providerId = "providerId";

doReturn(providerId).when(kakaoAuthProvider).getProviderId(idToken);

// when
String result = oidcProviderFactory.getProviderId(provider, idToken);

// then
assertEquals(providerId, result);

verify(kakaoAuthProvider, times(1)).getProviderId(idToken);
}

@TestWithDisplayName("제공자가 null 이라면 예외를 던진다")
void getProviderId4() {
// given
final Provider provider = null;
final String idToken = "id";

// when & then
assertThrows(
CakkException.class,
() -> oidcProviderFactory.getProviderId(provider, idToken),
ReturnCode.WRONG_PROVIDER.getMessage()
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package com.cakk.api.resolver;

import static org.assertj.core.api.Assertions.*;
import static org.mockito.Mockito.*;

import org.mockito.InjectMocks;
import org.springframework.core.MethodParameter;

import com.cakk.api.annotation.AccessToken;
import com.cakk.api.common.annotation.TestWithDisplayName;
import com.cakk.api.common.base.MockitoTest;

class AccessTokenResolverTest extends MockitoTest {

@InjectMocks
private AccessTokenResolver accessTokenResolver;

@TestWithDisplayName("supportsParameter 메서드는 RefreshToken 어노테이션이 붙은 String 타입의 파라미터를 지원한다.")
void supportsParameter() {
// given
MethodParameter parameter = mock(MethodParameter.class);

doReturn(true).when(parameter).hasParameterAnnotation(AccessToken.class);
doReturn(String.class).when(parameter).getParameterType();

// when
boolean result = accessTokenResolver.supportsParameter(parameter);

// then
assertThat(result).isTrue();
}

@TestWithDisplayName("String 타입이 아닌 경우, false를 반환한다.")
void supportsParameter2() {
// given
MethodParameter parameter = mock(MethodParameter.class);

doReturn(true).when(parameter).hasParameterAnnotation(AccessToken.class);
doReturn(Integer.class).when(parameter).getParameterType();

// when
boolean result = accessTokenResolver.supportsParameter(parameter);

// then
assertThat(result).isFalse();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package com.cakk.api.resolver;

import static org.assertj.core.api.Assertions.*;
import static org.mockito.Mockito.*;

import org.mockito.InjectMocks;
import org.springframework.core.MethodParameter;

import com.cakk.api.annotation.SignInUser;
import com.cakk.api.common.annotation.TestWithDisplayName;
import com.cakk.api.common.base.MockitoTest;
import com.cakk.domain.mysql.entity.user.User;

class AuthorizedUserResolverTest extends MockitoTest {

@InjectMocks
private AuthorizedUserResolver authorizedUserResolver;

@TestWithDisplayName("supportsParameter 메서드는 RefreshToken 어노테이션이 붙은 String 타입의 파라미터를 지원한다.")
void supportsParameter() {
// given
MethodParameter parameter = mock(MethodParameter.class);

doReturn(true).when(parameter).hasParameterAnnotation(SignInUser.class);
doReturn(User.class).when(parameter).getParameterType();

// when
boolean result = authorizedUserResolver.supportsParameter(parameter);

// then
assertThat(result).isTrue();
}

@TestWithDisplayName("String 타입이 아닌 경우, false를 반환한다.")
void supportsParameter2() {
// given
MethodParameter parameter = mock(MethodParameter.class);

doReturn(true).when(parameter).hasParameterAnnotation(SignInUser.class);
doReturn(Integer.class).when(parameter).getParameterType();

// when
boolean result = authorizedUserResolver.supportsParameter(parameter);

// then
assertThat(result).isFalse();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package com.cakk.api.resolver;

import static org.assertj.core.api.Assertions.*;
import static org.mockito.Mockito.*;

import org.mockito.InjectMocks;
import org.springframework.core.MethodParameter;

import com.cakk.api.annotation.RefreshToken;
import com.cakk.api.common.annotation.TestWithDisplayName;
import com.cakk.api.common.base.MockitoTest;

class RefreshTokenResolverTest extends MockitoTest {

@InjectMocks
private RefreshTokenResolver refreshTokenResolver;

@TestWithDisplayName("supportsParameter 메서드는 RefreshToken 어노테이션이 붙은 String 타입의 파라미터를 지원한다.")
void supportsParameter() {
// given
MethodParameter parameter = mock(MethodParameter.class);

doReturn(true).when(parameter).hasParameterAnnotation(RefreshToken.class);
doReturn(String.class).when(parameter).getParameterType();

// when
boolean result = refreshTokenResolver.supportsParameter(parameter);

// then
assertThat(result).isTrue();
}

@TestWithDisplayName("String 타입이 아닌 경우, false를 반환한다.")
void supportsParameter2() {
// given
MethodParameter parameter = mock(MethodParameter.class);

doReturn(true).when(parameter).hasParameterAnnotation(RefreshToken.class);
doReturn(Integer.class).when(parameter).getParameterType();

// when
boolean result = refreshTokenResolver.supportsParameter(parameter);

// then
assertThat(result).isFalse();
}
}

0 comments on commit 2e0e528

Please sign in to comment.