diff --git a/spring-boot-project/spring-boot-actuator/build.gradle b/spring-boot-project/spring-boot-actuator/build.gradle index 1b89ee5f06e9..858962df4b4e 100644 --- a/spring-boot-project/spring-boot-actuator/build.gradle +++ b/spring-boot-project/spring-boot-actuator/build.gradle @@ -98,6 +98,8 @@ dependencies { testImplementation("org.springframework:spring-test") testImplementation("com.squareup.okhttp3:mockwebserver") testImplementation("org.testcontainers:junit-jupiter") + testImplementation("org.testcontainers:neo4j") + testImplementation("org.testcontainers:testcontainers") testRuntimeOnly("ch.qos.logback:logback-classic") testRuntimeOnly("io.projectreactor.netty:reactor-netty-http") diff --git a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/neo4j/Neo4jReactiveHealthIndicator.java b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/neo4j/Neo4jReactiveHealthIndicator.java index 319fec43609c..99b6c0801dbb 100644 --- a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/neo4j/Neo4jReactiveHealthIndicator.java +++ b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/neo4j/Neo4jReactiveHealthIndicator.java @@ -55,7 +55,7 @@ public Neo4jReactiveHealthIndicator(Driver driver) { protected Mono doHealthCheck(Health.Builder builder) { return runHealthCheckQuery() .doOnError(SessionExpiredException.class, - (e) -> logger.warn(Neo4jHealthIndicator.MESSAGE_SESSION_EXPIRED)) + (ex) -> logger.warn(Neo4jHealthIndicator.MESSAGE_SESSION_EXPIRED)) .retryWhen(Retry.max(1).filter(SessionExpiredException.class::isInstance)).map((healthDetails) -> { this.healthDetailsHandler.addHealthDetails(builder, healthDetails); return builder.build(); diff --git a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/neo4j/Neo4jReactiveHealthIndicatorIntegrationTests.java b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/neo4j/Neo4jReactiveHealthIndicatorIntegrationTests.java new file mode 100644 index 000000000000..44e66cc10c90 --- /dev/null +++ b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/neo4j/Neo4jReactiveHealthIndicatorIntegrationTests.java @@ -0,0 +1,79 @@ +/* + * Copyright 2012-2022 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.actuate.neo4j; + +import java.time.Duration; + +import org.junit.jupiter.api.Test; +import org.testcontainers.containers.Neo4jContainer; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.actuate.health.Health; +import org.springframework.boot.actuate.health.Status; +import org.springframework.boot.autoconfigure.ImportAutoConfiguration; +import org.springframework.boot.autoconfigure.neo4j.Neo4jAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.testsupport.testcontainers.DockerImageNames; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.test.context.DynamicPropertyRegistry; +import org.springframework.test.context.DynamicPropertySource; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Integration tests for {@link Neo4jReactiveHealthIndicator}. + * + * @author Phillip Webb + */ +@SpringBootTest +@Testcontainers(disabledWithoutDocker = true) +public class Neo4jReactiveHealthIndicatorIntegrationTests { + + // gh-33428 + + @Container + private static final Neo4jContainer neo4jServer = new Neo4jContainer<>(DockerImageNames.neo4j()) + .withStartupAttempts(5).withStartupTimeout(Duration.ofMinutes(10)); + + @DynamicPropertySource + static void neo4jProperties(DynamicPropertyRegistry registry) { + registry.add("spring.neo4j.uri", neo4jServer::getBoltUrl); + registry.add("spring.neo4j.authentication.username", () -> "neo4j"); + registry.add("spring.neo4j.authentication.password", neo4jServer::getAdminPassword); + } + + @Autowired + private Neo4jReactiveHealthIndicator healthIndicator; + + @Test + void health() { + Health health = this.healthIndicator.getHealth(true).block(Duration.ofSeconds(5)); + assertThat(health.getStatus()).isEqualTo(Status.UP); + assertThat(health.getDetails()).containsEntry("edition", "community"); + } + + @Configuration(proxyBeanMethods = false) + @ImportAutoConfiguration(Neo4jAutoConfiguration.class) + @Import(Neo4jReactiveHealthIndicator.class) + static class TestConfiguration { + + } + +}