[ADD] TEST CODE 추가

main
bjkim 11 months ago
parent a7e807cba5
commit a36479778f

@ -27,7 +27,6 @@ dependencies {
testImplementation(libs.org.springframework.boot.spring.boot.starter.test)
testImplementation(libs.org.springframework.security.spring.security.test)
compileOnly("org.projectlombok:lombok:1.18.38")
annotationProcessor("org.projectlombok:lombok:1.18.38")
testCompileOnly("org.projectlombok:lombok:1.18.38")
@ -50,4 +49,4 @@ tasks.withType<JavaCompile>() {
tasks.withType<Javadoc>() {
options.encoding = "UTF-8"
}
}

@ -1,4 +1,4 @@
package kr.re.etri.security.jwt;
package kr.re.etri.autoflow;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@ -1,4 +1,4 @@
package kr.re.etri.security.jwt.advice;
package kr.re.etri.autoflow.advice;
import lombok.AllArgsConstructor;
import lombok.Getter;

@ -1,4 +1,4 @@
package kr.re.etri.security.jwt.advice;
package kr.re.etri.autoflow.advice;
import java.util.Date;
@ -8,7 +8,7 @@ import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.context.request.WebRequest;
import kr.re.etri.security.jwt.exception.TokenRefreshException;
import kr.re.etri.autoflow.exception.TokenRefreshException;
@RestControllerAdvice
public class TokenControllerAdvice {

@ -1,4 +1,4 @@
package kr.re.etri.security.jwt.controllers;
package kr.re.etri.autoflow.controllers;
import java.util.HashSet;
import java.util.List;
@ -20,20 +20,20 @@ import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.web.bind.annotation.*;
import kr.re.etri.security.jwt.exception.TokenRefreshException;
import kr.re.etri.security.jwt.models.ERole;
import kr.re.etri.security.jwt.models.RefreshToken;
import kr.re.etri.security.jwt.models.Role;
import kr.re.etri.security.jwt.models.User;
import kr.re.etri.security.jwt.payload.request.LoginRequest;
import kr.re.etri.security.jwt.payload.request.SignupRequest;
import kr.re.etri.security.jwt.payload.response.UserInfoResponse;
import kr.re.etri.security.jwt.payload.response.MessageResponse;
import kr.re.etri.security.jwt.repository.RoleRepository;
import kr.re.etri.security.jwt.repository.UserRepository;
import kr.re.etri.security.jwt.security.jwt.JwtUtils;
import kr.re.etri.security.jwt.security.services.RefreshTokenService;
import kr.re.etri.security.jwt.security.services.UserDetailsImpl;
import kr.re.etri.autoflow.exception.TokenRefreshException;
import kr.re.etri.autoflow.models.ERole;
import kr.re.etri.autoflow.models.RefreshToken;
import kr.re.etri.autoflow.models.Role;
import kr.re.etri.autoflow.models.User;
import kr.re.etri.autoflow.payload.request.LoginRequest;
import kr.re.etri.autoflow.payload.request.SignupRequest;
import kr.re.etri.autoflow.payload.response.UserInfoResponse;
import kr.re.etri.autoflow.payload.response.MessageResponse;
import kr.re.etri.autoflow.repository.RoleRepository;
import kr.re.etri.autoflow.repository.UserRepository;
import kr.re.etri.autoflow.security.jwt.JwtUtils;
import kr.re.etri.autoflow.security.services.RefreshTokenService;
import kr.re.etri.autoflow.security.services.UserDetailsImpl;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;

@ -1,13 +1,13 @@
package kr.re.etri.security.jwt.controllers;
package kr.re.etri.autoflow.controllers;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.tags.Tag;
import kr.re.etri.security.jwt.entity.ProjectEntity;
import kr.re.etri.security.jwt.payload.request.BaseSearchRequest;
import kr.re.etri.security.jwt.payload.request.ProjectRequest;
import kr.re.etri.security.jwt.service.ProjectService;
import kr.re.etri.autoflow.entity.ProjectEntity;
import kr.re.etri.autoflow.payload.request.BaseSearchRequest;
import kr.re.etri.autoflow.payload.request.ProjectRequest;
import kr.re.etri.autoflow.service.ProjectService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

@ -1,4 +1,4 @@
package kr.re.etri.security.jwt.controllers;
package kr.re.etri.autoflow.controllers;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.CrossOrigin;

@ -1,4 +1,4 @@
package kr.re.etri.security.jwt.entity;
package kr.re.etri.autoflow.entity;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.persistence.*;

@ -1,4 +1,4 @@
package kr.re.etri.security.jwt.exception;
package kr.re.etri.autoflow.exception;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;

@ -1,4 +1,4 @@
package kr.re.etri.security.jwt.models;
package kr.re.etri.autoflow.models;
public enum ERole {
ROLE_USER,

@ -1,4 +1,4 @@
package kr.re.etri.security.jwt.models;
package kr.re.etri.autoflow.models;
import java.time.Instant;

@ -1,4 +1,4 @@
package kr.re.etri.security.jwt.models;
package kr.re.etri.autoflow.models;
import jakarta.persistence.*;
import lombok.Getter;

@ -1,4 +1,4 @@
package kr.re.etri.security.jwt.models;
package kr.re.etri.autoflow.models;
import java.util.HashSet;
import java.util.Set;

@ -1,4 +1,4 @@
package kr.re.etri.security.jwt.payload.request;
package kr.re.etri.autoflow.payload.request;
import lombok.Getter;
import lombok.Setter;

@ -1,4 +1,4 @@
package kr.re.etri.security.jwt.payload.request;
package kr.re.etri.autoflow.payload.request;
import jakarta.validation.constraints.NotBlank;
import lombok.Getter;

@ -1,4 +1,4 @@
package kr.re.etri.security.jwt.payload.request;
package kr.re.etri.autoflow.payload.request;
import lombok.Getter;
import lombok.Setter;

@ -1,4 +1,4 @@
package kr.re.etri.security.jwt.payload.request;
package kr.re.etri.autoflow.payload.request;
import jakarta.validation.constraints.*;
import lombok.Getter;

@ -1,4 +1,4 @@
package kr.re.etri.security.jwt.payload.response;
package kr.re.etri.autoflow.payload.response;
import lombok.AllArgsConstructor;
import lombok.Getter;

@ -1,4 +1,4 @@
package kr.re.etri.security.jwt.payload.response;
package kr.re.etri.autoflow.payload.response;
import lombok.AllArgsConstructor;
import lombok.Getter;

@ -1,6 +1,6 @@
package kr.re.etri.security.jwt.repository;
package kr.re.etri.autoflow.repository;
import kr.re.etri.security.jwt.entity.ProjectEntity;
import kr.re.etri.autoflow.entity.ProjectEntity;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;

@ -1,12 +1,12 @@
package kr.re.etri.security.jwt.repository;
package kr.re.etri.autoflow.repository;
import java.util.Optional;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.stereotype.Repository;
import kr.re.etri.security.jwt.models.RefreshToken;
import kr.re.etri.security.jwt.models.User;
import kr.re.etri.autoflow.models.RefreshToken;
import kr.re.etri.autoflow.models.User;
@Repository
public interface RefreshTokenRepository extends JpaRepository<RefreshToken, Long> {

@ -1,12 +1,12 @@
package kr.re.etri.security.jwt.repository;
package kr.re.etri.autoflow.repository;
import java.util.Optional;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import kr.re.etri.security.jwt.models.ERole;
import kr.re.etri.security.jwt.models.Role;
import kr.re.etri.autoflow.models.ERole;
import kr.re.etri.autoflow.models.Role;
@Repository
public interface RoleRepository extends JpaRepository<Role, Long> {

@ -1,11 +1,11 @@
package kr.re.etri.security.jwt.repository;
package kr.re.etri.autoflow.repository;
import java.util.Optional;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import kr.re.etri.security.jwt.models.User;
import kr.re.etri.autoflow.models.User;
@Repository
public interface UserRepository extends JpaRepository<User, Long> {

@ -1,4 +1,4 @@
package kr.re.etri.security.jwt.security;
package kr.re.etri.autoflow.security;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
@ -18,9 +18,9 @@ import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import kr.re.etri.security.jwt.security.jwt.AuthEntryPointJwt;
import kr.re.etri.security.jwt.security.jwt.AuthTokenFilter;
import kr.re.etri.security.jwt.security.services.UserDetailsServiceImpl;
import kr.re.etri.autoflow.security.jwt.AuthEntryPointJwt;
import kr.re.etri.autoflow.security.jwt.AuthTokenFilter;
import kr.re.etri.autoflow.security.services.UserDetailsServiceImpl;
@Configuration
//@EnableWebSecurity

@ -1,4 +1,4 @@
package kr.re.etri.security.jwt.security.jwt;
package kr.re.etri.autoflow.security.jwt;
import java.io.IOException;
import java.util.HashMap;

@ -1,4 +1,4 @@
package kr.re.etri.security.jwt.security.jwt;
package kr.re.etri.autoflow.security.jwt;
import java.io.IOException;
@ -8,8 +8,6 @@ import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
@ -17,7 +15,7 @@ import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
import org.springframework.web.filter.OncePerRequestFilter;
import kr.re.etri.security.jwt.security.services.UserDetailsServiceImpl;
import kr.re.etri.autoflow.security.services.UserDetailsServiceImpl;
@Slf4j
public class AuthTokenFilter extends OncePerRequestFilter {

@ -1,4 +1,4 @@
package kr.re.etri.security.jwt.security.jwt;
package kr.re.etri.autoflow.security.jwt;
import java.security.Key;
import java.util.Date;
@ -13,8 +13,8 @@ import org.springframework.http.ResponseCookie;
import org.springframework.stereotype.Component;
import org.springframework.web.util.WebUtils;
import kr.re.etri.security.jwt.models.User;
import kr.re.etri.security.jwt.security.services.UserDetailsImpl;
import kr.re.etri.autoflow.models.User;
import kr.re.etri.autoflow.security.services.UserDetailsImpl;
import io.jsonwebtoken.*;
import io.jsonwebtoken.io.Decoders;

@ -1,4 +1,4 @@
package kr.re.etri.security.jwt.security.services;
package kr.re.etri.autoflow.security.services;
import java.time.Instant;
import java.util.Optional;
@ -9,10 +9,10 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import kr.re.etri.security.jwt.exception.TokenRefreshException;
import kr.re.etri.security.jwt.models.RefreshToken;
import kr.re.etri.security.jwt.repository.RefreshTokenRepository;
import kr.re.etri.security.jwt.repository.UserRepository;
import kr.re.etri.autoflow.exception.TokenRefreshException;
import kr.re.etri.autoflow.models.RefreshToken;
import kr.re.etri.autoflow.repository.RefreshTokenRepository;
import kr.re.etri.autoflow.repository.UserRepository;
@Service
public class RefreshTokenService {

@ -1,4 +1,4 @@
package kr.re.etri.security.jwt.security.services;
package kr.re.etri.autoflow.security.services;
import java.util.Collection;
import java.util.List;
@ -9,7 +9,7 @@ import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import kr.re.etri.security.jwt.models.User;
import kr.re.etri.autoflow.models.User;
import com.fasterxml.jackson.annotation.JsonIgnore;
public class UserDetailsImpl implements UserDetails {

@ -1,4 +1,4 @@
package kr.re.etri.security.jwt.security.services;
package kr.re.etri.autoflow.security.services;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
@ -7,8 +7,8 @@ import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import kr.re.etri.security.jwt.models.User;
import kr.re.etri.security.jwt.repository.UserRepository;
import kr.re.etri.autoflow.models.User;
import kr.re.etri.autoflow.repository.UserRepository;
@Service
public class UserDetailsServiceImpl implements UserDetailsService {

@ -1,10 +1,10 @@
package kr.re.etri.security.jwt.service;
package kr.re.etri.autoflow.service;
import kr.re.etri.security.jwt.entity.ProjectEntity;
import kr.re.etri.security.jwt.payload.request.BaseSearchRequest;
import kr.re.etri.security.jwt.payload.request.ProjectRequest;
import kr.re.etri.security.jwt.repository.ProjectRepository;
import kr.re.etri.security.jwt.specification.ProjectSpecification;
import kr.re.etri.autoflow.entity.ProjectEntity;
import kr.re.etri.autoflow.payload.request.BaseSearchRequest;
import kr.re.etri.autoflow.payload.request.ProjectRequest;
import kr.re.etri.autoflow.repository.ProjectRepository;
import kr.re.etri.autoflow.specification.ProjectSpecification;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.data.domain.*;

@ -1,11 +1,11 @@
package kr.re.etri.security.jwt.specification;
package kr.re.etri.autoflow.specification;
import jakarta.annotation.PostConstruct;
import jakarta.persistence.EntityManager;
import jakarta.persistence.metamodel.Attribute;
import jakarta.persistence.metamodel.EntityType;
import jakarta.persistence.metamodel.Metamodel;
import kr.re.etri.security.jwt.entity.ProjectEntity;
import kr.re.etri.autoflow.entity.ProjectEntity;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Component;

@ -1,4 +1,4 @@
package kr.re.etri.security.jwt.swagger;
package kr.re.etri.autoflow.swagger;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;

@ -0,0 +1,142 @@
package kr.re.etri.autoflow.controllers;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.times;
import java.util.Optional;
import java.util.Set;
import kr.re.etri.autoflow.models.ERole;
import kr.re.etri.autoflow.models.Role;
import kr.re.etri.autoflow.models.User;
import kr.re.etri.autoflow.payload.request.SignupRequest;
import kr.re.etri.autoflow.payload.response.MessageResponse;
import kr.re.etri.autoflow.repository.RoleRepository;
import kr.re.etri.autoflow.repository.UserRepository;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.*;
import org.springframework.http.ResponseEntity;
import org.springframework.security.crypto.password.PasswordEncoder;
class AuthControllerTest {
@InjectMocks
private AuthController authController;
@Mock
private UserRepository userRepository;
@Mock
private RoleRepository roleRepository;
@Mock
private PasswordEncoder encoder;
@BeforeEach
void setup() {
MockitoAnnotations.openMocks(this);
}
@Test
void testRegisterUser_Success() {
SignupRequest request = new SignupRequest();
request.setUsername("testuser");
request.setEmail("test@example.com");
request.setPassword("password");
request.setRole(Set.of("ROLE_USER"));
when(userRepository.existsByUsername("testuser")).thenReturn(false);
when(userRepository.existsByEmail("test@example.com")).thenReturn(false);
when(encoder.encode("password")).thenReturn("encodedPassword");
Role roleUser = new Role();
roleUser.setName(ERole.ROLE_USER);
when(roleRepository.findByName(ERole.ROLE_USER)).thenReturn(Optional.of(roleUser));
when(userRepository.save(any(User.class))).thenAnswer(i -> i.getArguments()[0]);
ResponseEntity<?> response = authController.registerUser(request);
assert response.getStatusCode().is2xxSuccessful();
assert response.getBody() instanceof MessageResponse;
assert ((MessageResponse)response.getBody()).getMessage().equals("사용자 등록이 완료되었습니다.");
verify(userRepository, times(1)).save(any(User.class));
}
@Test
void testRegisterUser_UsernameExists() {
SignupRequest request = new SignupRequest();
request.setUsername("testuser");
request.setEmail("test@example.com");
when(userRepository.existsByUsername("testuser")).thenReturn(true);
ResponseEntity<?> response = authController.registerUser(request);
assert response.getStatusCode().is4xxClientError();
assert response.getBody() instanceof MessageResponse;
assert ((MessageResponse)response.getBody()).getMessage().contains("이미 사용 중인 사용자 이름입니다.");
}
@Test
void testRegisterUser_EmailExists() {
SignupRequest request = new SignupRequest();
request.setUsername("testuser");
request.setEmail("test@example.com");
when(userRepository.existsByUsername("testuser")).thenReturn(false);
when(userRepository.existsByEmail("test@example.com")).thenReturn(true);
ResponseEntity<?> response = authController.registerUser(request);
assert response.getStatusCode().is4xxClientError();
assert response.getBody() instanceof MessageResponse;
assert ((MessageResponse)response.getBody()).getMessage().contains("이미 사용 중인 이메일입니다.");
}
@Test
void testRegisterUser_InvalidRole() {
SignupRequest request = new SignupRequest();
request.setUsername("testuser");
request.setEmail("test@example.com");
request.setPassword("password");
request.setRole(Set.of("INVALID_ROLE"));
when(userRepository.existsByUsername("testuser")).thenReturn(false);
when(userRepository.existsByEmail("test@example.com")).thenReturn(false);
when(encoder.encode("password")).thenReturn("encodedPassword");
ResponseEntity<?> response = authController.registerUser(request);
assert response.getStatusCode().is4xxClientError();
assert response.getBody() instanceof MessageResponse;
assert ((MessageResponse)response.getBody()).getMessage().contains("역할은 유효하지 않습니다.");
}
@Test
void testRegisterUser_RoleNotFoundInDb() {
SignupRequest request = new SignupRequest();
request.setUsername("testuser");
request.setEmail("test@example.com");
request.setPassword("password");
request.setRole(Set.of("ROLE_ADMIN"));
when(userRepository.existsByUsername("testuser")).thenReturn(false);
when(userRepository.existsByEmail("test@example.com")).thenReturn(false);
when(encoder.encode("password")).thenReturn("encodedPassword");
when(roleRepository.findByName(ERole.ROLE_ADMIN)).thenReturn(Optional.empty());
ResponseEntity<?> response;
try {
response = authController.registerUser(request);
assert false; // 예외가 발생해야 함
} catch (RuntimeException e) {
assert e.getMessage().contains("역할이 DB에 존재하지 않습니다.");
}
}
}

@ -0,0 +1,190 @@
package kr.re.etri.autoflow.controllers;
import com.fasterxml.jackson.databind.ObjectMapper;
import kr.re.etri.autoflow.entity.ProjectEntity;
import kr.re.etri.autoflow.payload.request.ProjectRequest;
import kr.re.etri.autoflow.service.ProjectService;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Import;
import org.springframework.http.MediaType;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityCustomizer;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.test.web.servlet.MockMvc;
import java.time.LocalDate;
import java.util.List;
import java.util.Optional;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.when;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
import org.springframework.beans.factory.annotation.Autowired;
@WebMvcTest(ProjectController.class)
@Import(ProjectControllerTest.MockConfig.class)
class ProjectControllerTest {
@Autowired
private MockMvc mockMvc;
@Autowired
private ProjectService projectService;
@Autowired
private ObjectMapper objectMapper;
@TestConfiguration
static class MockConfig {
@Bean
public ProjectService projectService() {
return Mockito.mock(ProjectService.class);
}
// 테스트 시 Security 완전 무시
@Bean
public SecurityFilterChain testSecurityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(authz -> authz.anyRequest().permitAll())
.csrf(csrf -> csrf.disable());
return http.build();
}
}
private ProjectEntity sampleProject(Long id, String code, String name) {
return ProjectEntity.builder()
.id(id)
.prjCd(code)
.prjNm(name)
.prjStartDt(LocalDate.of(2025, 8, 1))
.prjEndDt(LocalDate.of(2025, 12, 31))
.build();
}
@Test
@DisplayName("모든 프로젝트 조회")
void getAllProjects() throws Exception {
ProjectEntity entity = sampleProject(1L, "PRJ001", "AI 프로젝트");
when(projectService.findAll()).thenReturn(List.of(entity));
mockMvc.perform(get("/api/projects"))
.andExpect(status().isOk())
.andExpect(jsonPath("$[0].prjCd").value("PRJ001"));
}
@Nested
class GetProjectByIdTests {
@Test
@DisplayName("ID로 프로젝트 조회 - 성공")
void success() throws Exception {
ProjectEntity entity = sampleProject(1L, "PRJ001", "AI 프로젝트");
when(projectService.findById(1L)).thenReturn(Optional.of(entity));
mockMvc.perform(get("/api/projects/1"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.prjCd").value("PRJ001"));
}
@Test
@DisplayName("ID로 프로젝트 조회 - 실패")
void notFound() throws Exception {
when(projectService.findById(999L)).thenReturn(Optional.empty());
mockMvc.perform(get("/api/projects/999"))
.andExpect(status().isNotFound());
}
}
@Nested
class CreateProjectTests {
@Test
@DisplayName("프로젝트 생성 - 성공")
void success() throws Exception {
ProjectEntity input = sampleProject(null, "PRJ002", "새 프로젝트");
when(projectService.create(any())).thenReturn(input);
mockMvc.perform(post("/api/projects")
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(input)))
.andExpect(status().isOk())
.andExpect(jsonPath("$.prjCd").value("PRJ002"));
}
@Test
@DisplayName("프로젝트 생성 - 실패(중복 등)")
void failure() throws Exception {
ProjectEntity input = ProjectEntity.builder().prjCd("PRJ_DUP").build();
when(projectService.create(any())).thenThrow(new IllegalArgumentException("중복된 프로젝트 코드입니다."));
mockMvc.perform(post("/api/projects")
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(input)))
.andExpect(status().isBadRequest())
.andExpect(content().string("중복된 프로젝트 코드입니다."));
}
}
@Nested
class UpdateProjectTests {
@Test
@DisplayName("프로젝트 수정 - 성공")
void success() throws Exception {
ProjectRequest request = new ProjectRequest();
request.setPrjNm("수정된 이름");
ProjectEntity updated = sampleProject(1L, "PRJ001", "수정된 이름");
when(projectService.update(Mockito.eq(1L), any())).thenReturn(Optional.of(updated));
mockMvc.perform(put("/api/projects/1")
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(request)))
.andExpect(status().isOk())
.andExpect(jsonPath("$.prjNm").value("수정된 이름"));
}
@Test
@DisplayName("프로젝트 수정 - 실패")
void notFound() throws Exception {
ProjectRequest request = new ProjectRequest();
request.setPrjNm("수정된 이름");
when(projectService.update(Mockito.eq(999L), any())).thenReturn(Optional.empty());
mockMvc.perform(put("/api/projects/999")
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(request)))
.andExpect(status().isNotFound());
}
}
@Nested
class DeleteProjectTests {
@Test
@DisplayName("프로젝트 삭제 - 성공")
void success() throws Exception {
when(projectService.delete(1L)).thenReturn(true);
mockMvc.perform(delete("/api/projects/1"))
.andExpect(status().isNoContent());
}
@Test
@DisplayName("프로젝트 삭제 - 실패")
void notFound() throws Exception {
when(projectService.delete(999L)).thenReturn(false);
mockMvc.perform(delete("/api/projects/999"))
.andExpect(status().isNotFound());
}
}
}

@ -1,4 +1,4 @@
package kr.re.etri.security.jwt;
package kr.re.etri.autoflow;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
Loading…
Cancel
Save