From a36479778fa49b77f12c5647bf477d19aa0a3126 Mon Sep 17 00:00:00 2001 From: bjkim Date: Mon, 4 Aug 2025 15:17:35 +0900 Subject: [PATCH] =?UTF-8?q?[ADD]=20TEST=20CODE=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle.kts | 3 +- ...SpringSecurityRefreshTokenApplication.java | 2 +- .../jwt => autoflow}/advice/ErrorMessage.java | 2 +- .../advice/TokenControllerAdvice.java | 4 +- .../controllers/AuthController.java | 30 +-- .../controllers/ProjectController.java | 10 +- .../controllers/TestController.java | 2 +- .../entity/ProjectEntity.java | 2 +- .../exception/TokenRefreshException.java | 2 +- .../jwt => autoflow}/models/ERole.java | 2 +- .../jwt => autoflow}/models/RefreshToken.java | 2 +- .../jwt => autoflow}/models/Role.java | 2 +- .../jwt => autoflow}/models/User.java | 2 +- .../payload/request/BaseSearchRequest.java | 2 +- .../payload/request/LoginRequest.java | 2 +- .../payload/request/ProjectRequest.java | 2 +- .../payload/request/SignupRequest.java | 2 +- .../payload/response/MessageResponse.java | 2 +- .../payload/response/UserInfoResponse.java | 2 +- .../repository/ProjectRepository.java | 4 +- .../repository/RefreshTokenRepository.java | 6 +- .../repository/RoleRepository.java | 6 +- .../repository/UserRepository.java | 4 +- .../security/WebSecurityConfig.java | 8 +- .../security/jwt/AuthEntryPointJwt.java | 2 +- .../security/jwt/AuthTokenFilter.java | 6 +- .../security/jwt/JwtUtils.java | 6 +- .../services/RefreshTokenService.java | 10 +- .../security/services/UserDetailsImpl.java | 4 +- .../services/UserDetailsServiceImpl.java | 6 +- .../service/ProjectService.java | 12 +- .../specification/ProjectSpecification.java | 4 +- .../swagger/OpenAPIConfig.java | 2 +- .../re/etri/autoflow/AuthControllerTest.java | 142 +++++++++++++ .../etri/autoflow/ProjectControllerTest.java | 190 ++++++++++++++++++ ...gSecurityRefreshTokenApplicationTests.java | 2 +- 36 files changed, 410 insertions(+), 81 deletions(-) rename src/main/java/kr/re/etri/{security/jwt => autoflow}/SpringSecurityRefreshTokenApplication.java (90%) rename src/main/java/kr/re/etri/{security/jwt => autoflow}/advice/ErrorMessage.java (86%) rename src/main/java/kr/re/etri/{security/jwt => autoflow}/advice/TokenControllerAdvice.java (87%) rename src/main/java/kr/re/etri/{security/jwt => autoflow}/controllers/AuthController.java (89%) rename src/main/java/kr/re/etri/{security/jwt => autoflow}/controllers/ProjectController.java (91%) rename src/main/java/kr/re/etri/{security/jwt => autoflow}/controllers/TestController.java (95%) rename src/main/java/kr/re/etri/{security/jwt => autoflow}/entity/ProjectEntity.java (98%) rename src/main/java/kr/re/etri/{security/jwt => autoflow}/exception/TokenRefreshException.java (90%) rename src/main/java/kr/re/etri/{security/jwt => autoflow}/models/ERole.java (62%) rename src/main/java/kr/re/etri/{security/jwt => autoflow}/models/RefreshToken.java (93%) rename src/main/java/kr/re/etri/{security/jwt => autoflow}/models/Role.java (93%) rename src/main/java/kr/re/etri/{security/jwt => autoflow}/models/User.java (96%) rename src/main/java/kr/re/etri/{security/jwt => autoflow}/payload/request/BaseSearchRequest.java (95%) rename src/main/java/kr/re/etri/{security/jwt => autoflow}/payload/request/LoginRequest.java (81%) rename src/main/java/kr/re/etri/{security/jwt => autoflow}/payload/request/ProjectRequest.java (88%) rename src/main/java/kr/re/etri/{security/jwt => autoflow}/payload/request/SignupRequest.java (91%) rename src/main/java/kr/re/etri/{security/jwt => autoflow}/payload/response/MessageResponse.java (77%) rename src/main/java/kr/re/etri/{security/jwt => autoflow}/payload/response/UserInfoResponse.java (84%) rename src/main/java/kr/re/etri/{security/jwt => autoflow}/repository/ProjectRepository.java (83%) rename src/main/java/kr/re/etri/{security/jwt => autoflow}/repository/RefreshTokenRepository.java (73%) rename src/main/java/kr/re/etri/{security/jwt => autoflow}/repository/RoleRepository.java (66%) rename src/main/java/kr/re/etri/{security/jwt => autoflow}/repository/UserRepository.java (80%) rename src/main/java/kr/re/etri/{security/jwt => autoflow}/security/WebSecurityConfig.java (95%) rename src/main/java/kr/re/etri/{security/jwt => autoflow}/security/jwt/AuthEntryPointJwt.java (96%) rename src/main/java/kr/re/etri/{security/jwt => autoflow}/security/jwt/AuthTokenFilter.java (92%) rename src/main/java/kr/re/etri/{security/jwt => autoflow}/security/jwt/JwtUtils.java (95%) rename src/main/java/kr/re/etri/{security/jwt => autoflow}/security/services/RefreshTokenService.java (84%) rename src/main/java/kr/re/etri/{security/jwt => autoflow}/security/services/UserDetailsImpl.java (95%) rename src/main/java/kr/re/etri/{security/jwt => autoflow}/security/services/UserDetailsServiceImpl.java (84%) rename src/main/java/kr/re/etri/{security/jwt => autoflow}/service/ProjectService.java (89%) rename src/main/java/kr/re/etri/{security/jwt => autoflow}/specification/ProjectSpecification.java (96%) rename src/main/java/kr/re/etri/{security/jwt => autoflow}/swagger/OpenAPIConfig.java (96%) create mode 100644 src/test/java/kr/re/etri/autoflow/AuthControllerTest.java create mode 100644 src/test/java/kr/re/etri/autoflow/ProjectControllerTest.java rename src/test/java/kr/re/etri/{security/jwt => autoflow}/SpringSecurityRefreshTokenApplicationTests.java (85%) diff --git a/build.gradle.kts b/build.gradle.kts index 76a0a9e..1d5b58c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -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() { tasks.withType() { options.encoding = "UTF-8" -} +} \ No newline at end of file diff --git a/src/main/java/kr/re/etri/security/jwt/SpringSecurityRefreshTokenApplication.java b/src/main/java/kr/re/etri/autoflow/SpringSecurityRefreshTokenApplication.java similarity index 90% rename from src/main/java/kr/re/etri/security/jwt/SpringSecurityRefreshTokenApplication.java rename to src/main/java/kr/re/etri/autoflow/SpringSecurityRefreshTokenApplication.java index f913a40..5d00b1d 100644 --- a/src/main/java/kr/re/etri/security/jwt/SpringSecurityRefreshTokenApplication.java +++ b/src/main/java/kr/re/etri/autoflow/SpringSecurityRefreshTokenApplication.java @@ -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; diff --git a/src/main/java/kr/re/etri/security/jwt/advice/ErrorMessage.java b/src/main/java/kr/re/etri/autoflow/advice/ErrorMessage.java similarity index 86% rename from src/main/java/kr/re/etri/security/jwt/advice/ErrorMessage.java rename to src/main/java/kr/re/etri/autoflow/advice/ErrorMessage.java index ec40f26..15dfb2e 100644 --- a/src/main/java/kr/re/etri/security/jwt/advice/ErrorMessage.java +++ b/src/main/java/kr/re/etri/autoflow/advice/ErrorMessage.java @@ -1,4 +1,4 @@ -package kr.re.etri.security.jwt.advice; +package kr.re.etri.autoflow.advice; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/src/main/java/kr/re/etri/security/jwt/advice/TokenControllerAdvice.java b/src/main/java/kr/re/etri/autoflow/advice/TokenControllerAdvice.java similarity index 87% rename from src/main/java/kr/re/etri/security/jwt/advice/TokenControllerAdvice.java rename to src/main/java/kr/re/etri/autoflow/advice/TokenControllerAdvice.java index 954fd8b..50cc14c 100644 --- a/src/main/java/kr/re/etri/security/jwt/advice/TokenControllerAdvice.java +++ b/src/main/java/kr/re/etri/autoflow/advice/TokenControllerAdvice.java @@ -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 { diff --git a/src/main/java/kr/re/etri/security/jwt/controllers/AuthController.java b/src/main/java/kr/re/etri/autoflow/controllers/AuthController.java similarity index 89% rename from src/main/java/kr/re/etri/security/jwt/controllers/AuthController.java rename to src/main/java/kr/re/etri/autoflow/controllers/AuthController.java index 782ae4e..2de8477 100644 --- a/src/main/java/kr/re/etri/security/jwt/controllers/AuthController.java +++ b/src/main/java/kr/re/etri/autoflow/controllers/AuthController.java @@ -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; diff --git a/src/main/java/kr/re/etri/security/jwt/controllers/ProjectController.java b/src/main/java/kr/re/etri/autoflow/controllers/ProjectController.java similarity index 91% rename from src/main/java/kr/re/etri/security/jwt/controllers/ProjectController.java rename to src/main/java/kr/re/etri/autoflow/controllers/ProjectController.java index 5c232b3..7ba6145 100644 --- a/src/main/java/kr/re/etri/security/jwt/controllers/ProjectController.java +++ b/src/main/java/kr/re/etri/autoflow/controllers/ProjectController.java @@ -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.*; diff --git a/src/main/java/kr/re/etri/security/jwt/controllers/TestController.java b/src/main/java/kr/re/etri/autoflow/controllers/TestController.java similarity index 95% rename from src/main/java/kr/re/etri/security/jwt/controllers/TestController.java rename to src/main/java/kr/re/etri/autoflow/controllers/TestController.java index d903a77..2d3a38d 100644 --- a/src/main/java/kr/re/etri/security/jwt/controllers/TestController.java +++ b/src/main/java/kr/re/etri/autoflow/controllers/TestController.java @@ -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; diff --git a/src/main/java/kr/re/etri/security/jwt/entity/ProjectEntity.java b/src/main/java/kr/re/etri/autoflow/entity/ProjectEntity.java similarity index 98% rename from src/main/java/kr/re/etri/security/jwt/entity/ProjectEntity.java rename to src/main/java/kr/re/etri/autoflow/entity/ProjectEntity.java index d9d18a7..1abcaf0 100644 --- a/src/main/java/kr/re/etri/security/jwt/entity/ProjectEntity.java +++ b/src/main/java/kr/re/etri/autoflow/entity/ProjectEntity.java @@ -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.*; diff --git a/src/main/java/kr/re/etri/security/jwt/exception/TokenRefreshException.java b/src/main/java/kr/re/etri/autoflow/exception/TokenRefreshException.java similarity index 90% rename from src/main/java/kr/re/etri/security/jwt/exception/TokenRefreshException.java rename to src/main/java/kr/re/etri/autoflow/exception/TokenRefreshException.java index e15fc5e..30c4da9 100644 --- a/src/main/java/kr/re/etri/security/jwt/exception/TokenRefreshException.java +++ b/src/main/java/kr/re/etri/autoflow/exception/TokenRefreshException.java @@ -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; diff --git a/src/main/java/kr/re/etri/security/jwt/models/ERole.java b/src/main/java/kr/re/etri/autoflow/models/ERole.java similarity index 62% rename from src/main/java/kr/re/etri/security/jwt/models/ERole.java rename to src/main/java/kr/re/etri/autoflow/models/ERole.java index 53ee098..b7b38d4 100644 --- a/src/main/java/kr/re/etri/security/jwt/models/ERole.java +++ b/src/main/java/kr/re/etri/autoflow/models/ERole.java @@ -1,4 +1,4 @@ -package kr.re.etri.security.jwt.models; +package kr.re.etri.autoflow.models; public enum ERole { ROLE_USER, diff --git a/src/main/java/kr/re/etri/security/jwt/models/RefreshToken.java b/src/main/java/kr/re/etri/autoflow/models/RefreshToken.java similarity index 93% rename from src/main/java/kr/re/etri/security/jwt/models/RefreshToken.java rename to src/main/java/kr/re/etri/autoflow/models/RefreshToken.java index 751c28b..68e237f 100644 --- a/src/main/java/kr/re/etri/security/jwt/models/RefreshToken.java +++ b/src/main/java/kr/re/etri/autoflow/models/RefreshToken.java @@ -1,4 +1,4 @@ -package kr.re.etri.security.jwt.models; +package kr.re.etri.autoflow.models; import java.time.Instant; diff --git a/src/main/java/kr/re/etri/security/jwt/models/Role.java b/src/main/java/kr/re/etri/autoflow/models/Role.java similarity index 93% rename from src/main/java/kr/re/etri/security/jwt/models/Role.java rename to src/main/java/kr/re/etri/autoflow/models/Role.java index 08d2428..c4ddfc0 100644 --- a/src/main/java/kr/re/etri/security/jwt/models/Role.java +++ b/src/main/java/kr/re/etri/autoflow/models/Role.java @@ -1,4 +1,4 @@ -package kr.re.etri.security.jwt.models; +package kr.re.etri.autoflow.models; import jakarta.persistence.*; import lombok.Getter; diff --git a/src/main/java/kr/re/etri/security/jwt/models/User.java b/src/main/java/kr/re/etri/autoflow/models/User.java similarity index 96% rename from src/main/java/kr/re/etri/security/jwt/models/User.java rename to src/main/java/kr/re/etri/autoflow/models/User.java index 47f1aa5..438b09b 100644 --- a/src/main/java/kr/re/etri/security/jwt/models/User.java +++ b/src/main/java/kr/re/etri/autoflow/models/User.java @@ -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; diff --git a/src/main/java/kr/re/etri/security/jwt/payload/request/BaseSearchRequest.java b/src/main/java/kr/re/etri/autoflow/payload/request/BaseSearchRequest.java similarity index 95% rename from src/main/java/kr/re/etri/security/jwt/payload/request/BaseSearchRequest.java rename to src/main/java/kr/re/etri/autoflow/payload/request/BaseSearchRequest.java index 6e235b6..ff452bd 100644 --- a/src/main/java/kr/re/etri/security/jwt/payload/request/BaseSearchRequest.java +++ b/src/main/java/kr/re/etri/autoflow/payload/request/BaseSearchRequest.java @@ -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; diff --git a/src/main/java/kr/re/etri/security/jwt/payload/request/LoginRequest.java b/src/main/java/kr/re/etri/autoflow/payload/request/LoginRequest.java similarity index 81% rename from src/main/java/kr/re/etri/security/jwt/payload/request/LoginRequest.java rename to src/main/java/kr/re/etri/autoflow/payload/request/LoginRequest.java index 5144c88..185d8cd 100644 --- a/src/main/java/kr/re/etri/security/jwt/payload/request/LoginRequest.java +++ b/src/main/java/kr/re/etri/autoflow/payload/request/LoginRequest.java @@ -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; diff --git a/src/main/java/kr/re/etri/security/jwt/payload/request/ProjectRequest.java b/src/main/java/kr/re/etri/autoflow/payload/request/ProjectRequest.java similarity index 88% rename from src/main/java/kr/re/etri/security/jwt/payload/request/ProjectRequest.java rename to src/main/java/kr/re/etri/autoflow/payload/request/ProjectRequest.java index 55ea289..c0f5a60 100644 --- a/src/main/java/kr/re/etri/security/jwt/payload/request/ProjectRequest.java +++ b/src/main/java/kr/re/etri/autoflow/payload/request/ProjectRequest.java @@ -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; diff --git a/src/main/java/kr/re/etri/security/jwt/payload/request/SignupRequest.java b/src/main/java/kr/re/etri/autoflow/payload/request/SignupRequest.java similarity index 91% rename from src/main/java/kr/re/etri/security/jwt/payload/request/SignupRequest.java rename to src/main/java/kr/re/etri/autoflow/payload/request/SignupRequest.java index 8f2abba..e1f1a2f 100644 --- a/src/main/java/kr/re/etri/security/jwt/payload/request/SignupRequest.java +++ b/src/main/java/kr/re/etri/autoflow/payload/request/SignupRequest.java @@ -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; diff --git a/src/main/java/kr/re/etri/security/jwt/payload/response/MessageResponse.java b/src/main/java/kr/re/etri/autoflow/payload/response/MessageResponse.java similarity index 77% rename from src/main/java/kr/re/etri/security/jwt/payload/response/MessageResponse.java rename to src/main/java/kr/re/etri/autoflow/payload/response/MessageResponse.java index 843399b..21a1439 100644 --- a/src/main/java/kr/re/etri/security/jwt/payload/response/MessageResponse.java +++ b/src/main/java/kr/re/etri/autoflow/payload/response/MessageResponse.java @@ -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; diff --git a/src/main/java/kr/re/etri/security/jwt/payload/response/UserInfoResponse.java b/src/main/java/kr/re/etri/autoflow/payload/response/UserInfoResponse.java similarity index 84% rename from src/main/java/kr/re/etri/security/jwt/payload/response/UserInfoResponse.java rename to src/main/java/kr/re/etri/autoflow/payload/response/UserInfoResponse.java index 06a6147..3cd01ff 100644 --- a/src/main/java/kr/re/etri/security/jwt/payload/response/UserInfoResponse.java +++ b/src/main/java/kr/re/etri/autoflow/payload/response/UserInfoResponse.java @@ -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; diff --git a/src/main/java/kr/re/etri/security/jwt/repository/ProjectRepository.java b/src/main/java/kr/re/etri/autoflow/repository/ProjectRepository.java similarity index 83% rename from src/main/java/kr/re/etri/security/jwt/repository/ProjectRepository.java rename to src/main/java/kr/re/etri/autoflow/repository/ProjectRepository.java index ac1e7d5..4b4d45b 100644 --- a/src/main/java/kr/re/etri/security/jwt/repository/ProjectRepository.java +++ b/src/main/java/kr/re/etri/autoflow/repository/ProjectRepository.java @@ -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; diff --git a/src/main/java/kr/re/etri/security/jwt/repository/RefreshTokenRepository.java b/src/main/java/kr/re/etri/autoflow/repository/RefreshTokenRepository.java similarity index 73% rename from src/main/java/kr/re/etri/security/jwt/repository/RefreshTokenRepository.java rename to src/main/java/kr/re/etri/autoflow/repository/RefreshTokenRepository.java index ba3bd58..4e06cd7 100644 --- a/src/main/java/kr/re/etri/security/jwt/repository/RefreshTokenRepository.java +++ b/src/main/java/kr/re/etri/autoflow/repository/RefreshTokenRepository.java @@ -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 { diff --git a/src/main/java/kr/re/etri/security/jwt/repository/RoleRepository.java b/src/main/java/kr/re/etri/autoflow/repository/RoleRepository.java similarity index 66% rename from src/main/java/kr/re/etri/security/jwt/repository/RoleRepository.java rename to src/main/java/kr/re/etri/autoflow/repository/RoleRepository.java index 3352200..cf32415 100644 --- a/src/main/java/kr/re/etri/security/jwt/repository/RoleRepository.java +++ b/src/main/java/kr/re/etri/autoflow/repository/RoleRepository.java @@ -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 { diff --git a/src/main/java/kr/re/etri/security/jwt/repository/UserRepository.java b/src/main/java/kr/re/etri/autoflow/repository/UserRepository.java similarity index 80% rename from src/main/java/kr/re/etri/security/jwt/repository/UserRepository.java rename to src/main/java/kr/re/etri/autoflow/repository/UserRepository.java index 2e4fd7d..70fb693 100644 --- a/src/main/java/kr/re/etri/security/jwt/repository/UserRepository.java +++ b/src/main/java/kr/re/etri/autoflow/repository/UserRepository.java @@ -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 { diff --git a/src/main/java/kr/re/etri/security/jwt/security/WebSecurityConfig.java b/src/main/java/kr/re/etri/autoflow/security/WebSecurityConfig.java similarity index 95% rename from src/main/java/kr/re/etri/security/jwt/security/WebSecurityConfig.java rename to src/main/java/kr/re/etri/autoflow/security/WebSecurityConfig.java index 3aa8e06..41acf36 100644 --- a/src/main/java/kr/re/etri/security/jwt/security/WebSecurityConfig.java +++ b/src/main/java/kr/re/etri/autoflow/security/WebSecurityConfig.java @@ -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 diff --git a/src/main/java/kr/re/etri/security/jwt/security/jwt/AuthEntryPointJwt.java b/src/main/java/kr/re/etri/autoflow/security/jwt/AuthEntryPointJwt.java similarity index 96% rename from src/main/java/kr/re/etri/security/jwt/security/jwt/AuthEntryPointJwt.java rename to src/main/java/kr/re/etri/autoflow/security/jwt/AuthEntryPointJwt.java index 19b1349..2cc49ea 100644 --- a/src/main/java/kr/re/etri/security/jwt/security/jwt/AuthEntryPointJwt.java +++ b/src/main/java/kr/re/etri/autoflow/security/jwt/AuthEntryPointJwt.java @@ -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; diff --git a/src/main/java/kr/re/etri/security/jwt/security/jwt/AuthTokenFilter.java b/src/main/java/kr/re/etri/autoflow/security/jwt/AuthTokenFilter.java similarity index 92% rename from src/main/java/kr/re/etri/security/jwt/security/jwt/AuthTokenFilter.java rename to src/main/java/kr/re/etri/autoflow/security/jwt/AuthTokenFilter.java index 8e9b5ca..ad764f7 100644 --- a/src/main/java/kr/re/etri/security/jwt/security/jwt/AuthTokenFilter.java +++ b/src/main/java/kr/re/etri/autoflow/security/jwt/AuthTokenFilter.java @@ -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 { diff --git a/src/main/java/kr/re/etri/security/jwt/security/jwt/JwtUtils.java b/src/main/java/kr/re/etri/autoflow/security/jwt/JwtUtils.java similarity index 95% rename from src/main/java/kr/re/etri/security/jwt/security/jwt/JwtUtils.java rename to src/main/java/kr/re/etri/autoflow/security/jwt/JwtUtils.java index 632d110..c05311c 100644 --- a/src/main/java/kr/re/etri/security/jwt/security/jwt/JwtUtils.java +++ b/src/main/java/kr/re/etri/autoflow/security/jwt/JwtUtils.java @@ -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; diff --git a/src/main/java/kr/re/etri/security/jwt/security/services/RefreshTokenService.java b/src/main/java/kr/re/etri/autoflow/security/services/RefreshTokenService.java similarity index 84% rename from src/main/java/kr/re/etri/security/jwt/security/services/RefreshTokenService.java rename to src/main/java/kr/re/etri/autoflow/security/services/RefreshTokenService.java index f9b355a..2642c90 100644 --- a/src/main/java/kr/re/etri/security/jwt/security/services/RefreshTokenService.java +++ b/src/main/java/kr/re/etri/autoflow/security/services/RefreshTokenService.java @@ -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 { diff --git a/src/main/java/kr/re/etri/security/jwt/security/services/UserDetailsImpl.java b/src/main/java/kr/re/etri/autoflow/security/services/UserDetailsImpl.java similarity index 95% rename from src/main/java/kr/re/etri/security/jwt/security/services/UserDetailsImpl.java rename to src/main/java/kr/re/etri/autoflow/security/services/UserDetailsImpl.java index cd10c11..5683294 100644 --- a/src/main/java/kr/re/etri/security/jwt/security/services/UserDetailsImpl.java +++ b/src/main/java/kr/re/etri/autoflow/security/services/UserDetailsImpl.java @@ -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 { diff --git a/src/main/java/kr/re/etri/security/jwt/security/services/UserDetailsServiceImpl.java b/src/main/java/kr/re/etri/autoflow/security/services/UserDetailsServiceImpl.java similarity index 84% rename from src/main/java/kr/re/etri/security/jwt/security/services/UserDetailsServiceImpl.java rename to src/main/java/kr/re/etri/autoflow/security/services/UserDetailsServiceImpl.java index d3c8c80..cf8a24d 100644 --- a/src/main/java/kr/re/etri/security/jwt/security/services/UserDetailsServiceImpl.java +++ b/src/main/java/kr/re/etri/autoflow/security/services/UserDetailsServiceImpl.java @@ -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 { diff --git a/src/main/java/kr/re/etri/security/jwt/service/ProjectService.java b/src/main/java/kr/re/etri/autoflow/service/ProjectService.java similarity index 89% rename from src/main/java/kr/re/etri/security/jwt/service/ProjectService.java rename to src/main/java/kr/re/etri/autoflow/service/ProjectService.java index b458063..11ec0a9 100644 --- a/src/main/java/kr/re/etri/security/jwt/service/ProjectService.java +++ b/src/main/java/kr/re/etri/autoflow/service/ProjectService.java @@ -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.*; diff --git a/src/main/java/kr/re/etri/security/jwt/specification/ProjectSpecification.java b/src/main/java/kr/re/etri/autoflow/specification/ProjectSpecification.java similarity index 96% rename from src/main/java/kr/re/etri/security/jwt/specification/ProjectSpecification.java rename to src/main/java/kr/re/etri/autoflow/specification/ProjectSpecification.java index 2186bcd..f2ed377 100644 --- a/src/main/java/kr/re/etri/security/jwt/specification/ProjectSpecification.java +++ b/src/main/java/kr/re/etri/autoflow/specification/ProjectSpecification.java @@ -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; diff --git a/src/main/java/kr/re/etri/security/jwt/swagger/OpenAPIConfig.java b/src/main/java/kr/re/etri/autoflow/swagger/OpenAPIConfig.java similarity index 96% rename from src/main/java/kr/re/etri/security/jwt/swagger/OpenAPIConfig.java rename to src/main/java/kr/re/etri/autoflow/swagger/OpenAPIConfig.java index f491254..910f624 100644 --- a/src/main/java/kr/re/etri/security/jwt/swagger/OpenAPIConfig.java +++ b/src/main/java/kr/re/etri/autoflow/swagger/OpenAPIConfig.java @@ -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; diff --git a/src/test/java/kr/re/etri/autoflow/AuthControllerTest.java b/src/test/java/kr/re/etri/autoflow/AuthControllerTest.java new file mode 100644 index 0000000..922e5aa --- /dev/null +++ b/src/test/java/kr/re/etri/autoflow/AuthControllerTest.java @@ -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에 존재하지 않습니다."); + } + } +} diff --git a/src/test/java/kr/re/etri/autoflow/ProjectControllerTest.java b/src/test/java/kr/re/etri/autoflow/ProjectControllerTest.java new file mode 100644 index 0000000..d73645e --- /dev/null +++ b/src/test/java/kr/re/etri/autoflow/ProjectControllerTest.java @@ -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()); + } + } +} diff --git a/src/test/java/kr/re/etri/security/jwt/SpringSecurityRefreshTokenApplicationTests.java b/src/test/java/kr/re/etri/autoflow/SpringSecurityRefreshTokenApplicationTests.java similarity index 85% rename from src/test/java/kr/re/etri/security/jwt/SpringSecurityRefreshTokenApplicationTests.java rename to src/test/java/kr/re/etri/autoflow/SpringSecurityRefreshTokenApplicationTests.java index b41aea8..04c7504 100644 --- a/src/test/java/kr/re/etri/security/jwt/SpringSecurityRefreshTokenApplicationTests.java +++ b/src/test/java/kr/re/etri/autoflow/SpringSecurityRefreshTokenApplicationTests.java @@ -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;