diff --git a/.forge/role-developer-reverify-001-attempt-1-run-91dbb119003d.md b/.forge/role-developer-reverify-001-attempt-1-run-91dbb119003d.md new file mode 100644 index 0000000..86eddda --- /dev/null +++ b/.forge/role-developer-reverify-001-attempt-1-run-91dbb119003d.md @@ -0,0 +1,3 @@ +# role-developer-reverify-001-attempt-1-run-91dbb119003d + +Forge 이슈 작업 브랜치 `forge/role-developer-reverify-001-attempt-1-run-91dbb119003d`. diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..35654ff --- /dev/null +++ b/pom.xml @@ -0,0 +1,45 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 3.3.0 + + + + com.example + spring-minimal + 1.0.0 + jar + Spring Minimal Application + Minimum compilable Spring Boot application skeleton + + + 17 + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + \ No newline at end of file diff --git a/src/main/java/com/example/SpringMinimalApplication.java b/src/main/java/com/example/SpringMinimalApplication.java new file mode 100644 index 0000000..92bee90 --- /dev/null +++ b/src/main/java/com/example/SpringMinimalApplication.java @@ -0,0 +1,12 @@ +package com.example; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SpringMinimalApplication { + + public static void main(String[] args) { + SpringApplication.run(SpringMinimalApplication.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..fcdbc96 --- /dev/null +++ b/src/main/java/com/example/controller/HealthController.java @@ -0,0 +1,23 @@ +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; + +@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/test/java/com/example/SpringMinimalApplicationTests.java b/src/test/java/com/example/SpringMinimalApplicationTests.java new file mode 100644 index 0000000..3d8d318 --- /dev/null +++ b/src/test/java/com/example/SpringMinimalApplicationTests.java @@ -0,0 +1,15 @@ +package com.example; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.TestPropertySource; + +@SpringBootTest +@TestPropertySource(properties = {"spring.main.allow-bean-definition-overriding=true"}) +class SpringMinimalApplicationTests { + + @Test + void contextLoads() { + // Verifies that the Spring context loads successfully + } +} 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..efdf474 --- /dev/null +++ b/src/test/java/com/example/controller/HealthControllerTest.java @@ -0,0 +1,31 @@ +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; + +@WebMvcTest(HealthController.class) +class HealthControllerTest { + + @Autowired + private MockMvc mockMvc; + + @Test + void health_returnsUpStatus() throws Exception { + mockMvc.perform(get("/api/health")) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status").value("UP")); + } + + @Test + void ping_returnsPong() throws Exception { + mockMvc.perform(get("/api/ping")) + .andExpect(status().isOk()) + .andExpect(org.hamcrest.Matchers.content().string("pong")); + } +}