chore: erweitere Resilience4j-Bundle um Kotlin-Support, aktualisiere PingController um Fallback-Logik, füge Fehlerhandler hinzu, verbessere PingControllerTest, synchronisiere .env und dc-infra.yaml

This commit is contained in:
2026-04-19 21:50:27 +02:00
parent 54f91c7309
commit 83adb4ae07
9 changed files with 338 additions and 23 deletions
@@ -40,12 +40,17 @@ import kotlin.uuid.ExperimentalUuidApi
controllers = [PingController::class],
properties = ["spring.aop.proxy-target-class=true"]
)
@Import(
PingControllerTest.PingControllerTestConfig::class,
io.github.resilience4j.springboot3.circuitbreaker.autoconfigure.CircuitBreakerAutoConfiguration::class,
io.github.resilience4j.springboot3.circuitbreaker.autoconfigure.CircuitBreakerMetricsAutoConfiguration::class,
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration::class
)
@ContextConfiguration(classes = [TestPingServiceApplication::class])
@ActiveProfiles("test")
@Import(PingControllerTest.PingControllerTestConfig::class)
@AutoConfigureMockMvc(addFilters = false)
@OptIn(ExperimentalUuidApi::class)
class PingControllerTest {
open class PingControllerTest {
@Autowired
private lateinit var mockMvc: MockMvc
@@ -125,11 +130,24 @@ class PingControllerTest {
// Then
val json = objectMapper.readTree(result.response.contentAsString)
assertThat(json["status"].asText()).isEqualTo("pong")
assertThat(json["service"].asText()).isEqualTo(properties.serviceName)
verify { pingUseCase.executePing("Enhanced Ping") }
}
@Test
fun `should return fallback when simulation failure occurs`() {
// Given
val controller = PingController(pingUseCase, properties)
// When
val response = controller.fallbackPing(simulate = true, ex = PingController.SimulatedException("test"))
// Then
assertThat(response.status).isEqualTo("fallback")
assertThat(response.service).isEqualTo(properties.serviceNameFallback)
assertThat(response.circuitBreakerState).isEqualTo("OPEN")
}
@Test
fun `should return health check response with status up`() {
// When
@@ -159,7 +177,7 @@ class PingControllerTest {
)
// When
val mvcResult: MvcResult = mockMvc.perform(get("/ping/sync").param("since", timestamp.toString()))
val mvcResult: MvcResult = mockMvc.perform(get("/ping/sync").param("lastSyncTimestamp", timestamp.toString()))
.andExpect(request().asyncStarted())
.andReturn()
@@ -183,7 +201,7 @@ class PingControllerTest {
every { pingUseCase.getPingsSince(timestamp) } returns emptyList()
// When
val mvcResult: MvcResult = mockMvc.perform(get("/ping/sync").param("since", timestamp.toString()))
val mvcResult: MvcResult = mockMvc.perform(get("/ping/sync").param("lastSyncTimestamp", timestamp.toString()))
.andExpect(request().asyncStarted())
.andReturn()