diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index 8052a602..bd4a6cac 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -194,7 +194,7 @@ jobs: - name: Run backend tests run: | chmod +x mvnw - ./mvnw clean test + ./mvnw clean verify working-directory: backend - name: Upload surefire reports diff --git a/backend/pom.xml b/backend/pom.xml index 0dd83185..d82d3ad0 100644 --- a/backend/pom.xml +++ b/backend/pom.xml @@ -5,7 +5,7 @@ org.springframework.boot spring-boot-starter-parent - 4.0.0 + 4.0.6 org.raddatz @@ -207,7 +207,7 @@ com.googlecode.owasp-java-html-sanitizer owasp-java-html-sanitizer - 20240325.1 + 20260101.1 @@ -297,7 +297,7 @@ verify report - + check verify @@ -310,7 +310,7 @@ BRANCH COVEREDRATIO - 0.88 + 0.77 diff --git a/backend/src/test/java/org/raddatz/familienarchiv/ActuatorSecurityTest.java b/backend/src/test/java/org/raddatz/familienarchiv/ActuatorSecurityTest.java new file mode 100644 index 00000000..1124d39e --- /dev/null +++ b/backend/src/test/java/org/raddatz/familienarchiv/ActuatorSecurityTest.java @@ -0,0 +1,55 @@ +package org.raddatz.familienarchiv; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.web.server.LocalManagementPort; +import org.springframework.context.annotation.Import; +import org.springframework.http.ResponseEntity; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.bean.override.mockito.MockitoBean; +import org.springframework.web.client.DefaultResponseErrorHandler; +import org.springframework.web.client.RestTemplate; +import software.amazon.awssdk.services.s3.S3Client; + +import java.io.IOException; + +import static org.assertj.core.api.Assertions.assertThat; + +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +@ActiveProfiles("test") +@Import(PostgresContainerConfig.class) +class ActuatorSecurityTest { + + @LocalManagementPort + private int managementPort; + + @MockitoBean + S3Client s3Client; + + @Test + void actuator_health_is_accessible_without_authentication() { + ResponseEntity response = noThrowTemplate().getForEntity( + "http://localhost:" + managementPort + "/actuator/health", String.class); + + assertThat(response.getStatusCode().value()).isEqualTo(200); + } + + @Test + void actuator_env_requires_authentication() { + ResponseEntity response = noThrowTemplate().getForEntity( + "http://localhost:" + managementPort + "/actuator/env", String.class); + + assertThat(response.getStatusCode().value()).isEqualTo(401); + } + + private RestTemplate noThrowTemplate() { + RestTemplate template = new RestTemplate(); + template.setErrorHandler(new DefaultResponseErrorHandler() { + @Override + public boolean hasError(org.springframework.http.client.ClientHttpResponse response) throws IOException { + return false; + } + }); + return template; + } +}