diff --git a/.forge/role-developer-reverify-550-001-attempt-1-run-41adeb6fc379.md b/.forge/role-developer-reverify-550-001-attempt-1-run-41adeb6fc379.md new file mode 100644 index 0000000..4d96a47 --- /dev/null +++ b/.forge/role-developer-reverify-550-001-attempt-1-run-41adeb6fc379.md @@ -0,0 +1,3 @@ +# role-developer-reverify-550-001-attempt-1-run-41adeb6fc379 + +Forge 이슈 작업 브랜치 `forge/role-developer-reverify-550-001-attempt-1-run-41adeb6fc379`. diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..f54ffa9 --- /dev/null +++ b/pom.xml @@ -0,0 +1,53 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 3.2.5 + + + + com.example + spring-boot-minimal + 1.0.0 + jar + Spring Boot Minimal Application + Minimum compilable Spring Boot application for reviewer verification + + + 17 + 17 + 17 + UTF-8 + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + org.apache.maven.plugins + maven-surefire-plugin + 3.2.5 + + + + \ No newline at end of file diff --git a/src/main/java/com/example/SpringBootMinimalApplication.java b/src/main/java/com/example/SpringBootMinimalApplication.java new file mode 100644 index 0000000..7962d79 --- /dev/null +++ b/src/main/java/com/example/SpringBootMinimalApplication.java @@ -0,0 +1,16 @@ +package com.example; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * Main Spring Boot application entry point. + * This is the minimum required class to bootstrap a Spring application. + */ +@SpringBootApplication +public class SpringBootMinimalApplication { + + public static void main(String[] args) { + SpringApplication.run(SpringBootMinimalApplication.class, args); + } +} diff --git a/src/main/java/com/example/controller/HealthController.java b/src/main/java/com/example/controller/HealthController.java new file mode 100644 index 0000000..7a9047c --- /dev/null +++ b/src/main/java/com/example/controller/HealthController.java @@ -0,0 +1,26 @@ +package com.example.controller; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Map; + +/** + * Simple REST controller for health check endpoint. + */ +@RestController +@RequestMapping("/api") +public class HealthController { + + @GetMapping("/health") + public ResponseEntity> health() { + return ResponseEntity.ok(Map.of("status", "UP")); + } + + @GetMapping("/ping") + public ResponseEntity ping() { + return ResponseEntity.ok("pong"); + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 0000000..71fe516 --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1,8 @@ +# Spring Boot minimal configuration +spring.application.name=spring-boot-minimal + +# Disable banner for cleaner test output +spring.main.banner-mode=off + +# Test profile settings +spring.test.mockmvc.print=none diff --git a/src/test/java/com/example/SpringBootMinimalApplicationTests.java b/src/test/java/com/example/SpringBootMinimalApplicationTests.java new file mode 100644 index 0000000..3ed26f7 --- /dev/null +++ b/src/test/java/com/example/SpringBootMinimalApplicationTests.java @@ -0,0 +1,20 @@ +package com.example; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.TestPropertySource; + +/** + * Integration test to verify Spring Boot context loads successfully. + */ +@SpringBootTest +@TestPropertySource(properties = { + "spring.main.allow-bean-definition-overriding=true" +}) +class SpringBootMinimalApplicationTests { + + @Test + void contextLoads() { + // Verifies that the Spring application context loads without errors + } +} diff --git a/src/test/java/com/example/controller/HealthControllerTest.java b/src/test/java/com/example/controller/HealthControllerTest.java new file mode 100644 index 0000000..2c00fa8 --- /dev/null +++ b/src/test/java/com/example/controller/HealthControllerTest.java @@ -0,0 +1,35 @@ +package com.example.controller; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.test.web.servlet.MockMvc; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +/** + * Focused unit tests for HealthController. + * Uses @WebMvcTest for slice testing without full context. + */ +@WebMvcTest(HealthController.class) +class HealthControllerTest { + + @Autowired + private MockMvc mockMvc; + + @Test + void health_shouldReturnUpStatus() throws Exception { + mockMvc.perform(get("/api/health")) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status").value("UP")); + } + + @Test + void ping_shouldReturnPong() throws Exception { + mockMvc.perform(get("/api/ping")) + .andExpect(status().isOk()) + .andExpect(org.springframework.test.web.servlet.result.MockMvcResultMatchers.content().string("pong")); + } +}