From 23cff1cdd756153cd4d9720a51a2ff0ce1d0026b Mon Sep 17 00:00:00 2001 From: Marcel Date: Sun, 26 Apr 2026 15:43:07 +0200 Subject: [PATCH] refactor(audit): drop @DirtiesContext, add @BeforeEach, use existsByKind in wait conditions Co-Authored-By: Claude Sonnet 4.6 --- .../familienarchiv/audit/AuditLogRepository.java | 1 + .../audit/UserManagementAuditIntegrationTest.java | 14 +++++++++----- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/backend/src/main/java/org/raddatz/familienarchiv/audit/AuditLogRepository.java b/backend/src/main/java/org/raddatz/familienarchiv/audit/AuditLogRepository.java index 2322c8c9..794d2a29 100644 --- a/backend/src/main/java/org/raddatz/familienarchiv/audit/AuditLogRepository.java +++ b/backend/src/main/java/org/raddatz/familienarchiv/audit/AuditLogRepository.java @@ -5,4 +5,5 @@ import org.springframework.data.jpa.repository.JpaRepository; import java.util.UUID; public interface AuditLogRepository extends JpaRepository { + boolean existsByKind(AuditKind kind); } diff --git a/backend/src/test/java/org/raddatz/familienarchiv/audit/UserManagementAuditIntegrationTest.java b/backend/src/test/java/org/raddatz/familienarchiv/audit/UserManagementAuditIntegrationTest.java index 1437bc83..806b6ff6 100644 --- a/backend/src/test/java/org/raddatz/familienarchiv/audit/UserManagementAuditIntegrationTest.java +++ b/backend/src/test/java/org/raddatz/familienarchiv/audit/UserManagementAuditIntegrationTest.java @@ -1,5 +1,6 @@ package org.raddatz.familienarchiv.audit; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.raddatz.familienarchiv.PostgresContainerConfig; import org.raddatz.familienarchiv.dto.CreateUserRequest; @@ -9,7 +10,6 @@ import org.raddatz.familienarchiv.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Import; -import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.transaction.support.TransactionTemplate; @@ -25,7 +25,6 @@ import static org.awaitility.Awaitility.await; @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE) @ActiveProfiles("test") @Import(PostgresContainerConfig.class) -@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) class UserManagementAuditIntegrationTest { @MockitoBean S3Client s3Client; @@ -35,6 +34,11 @@ class UserManagementAuditIntegrationTest { @Autowired AuditLogQueryService auditLogQueryService; @Autowired TransactionTemplate transactionTemplate; + @BeforeEach + void clearAuditLog() { + transactionTemplate.execute(status -> { auditLogRepository.deleteAll(); return null; }); + } + @Test void createAndDeleteUser_producesOrderedAuditEntries() { // Create the actor (admin) user directly — bypasses audit logging so no FK issue @@ -46,7 +50,7 @@ class UserManagementAuditIntegrationTest { UUID actorId = actor.getId(); // The admin creation is logged with null actorId — clear to start with a clean slate - await().atMost(5, SECONDS).until(() -> auditLogRepository.count() > 0); + await().atMost(5, SECONDS).until(() -> auditLogRepository.existsByKind(AuditKind.USER_CREATED)); transactionTemplate.execute(status -> { auditLogRepository.deleteAll(); return null; }); // Create the target user — should emit USER_CREATED @@ -57,7 +61,7 @@ class UserManagementAuditIntegrationTest { userService.createUserOrUpdate(actorId, req); return null; }); - await().atMost(5, SECONDS).until(() -> auditLogRepository.count() > 0); + await().atMost(5, SECONDS).until(() -> auditLogRepository.existsByKind(AuditKind.USER_CREATED)); // Delete the target user — should emit USER_DELETED AppUser created = userRepository.findByEmail("audit-test@example.com").orElseThrow(); @@ -65,7 +69,7 @@ class UserManagementAuditIntegrationTest { userService.deleteUser(actorId, created.getId()); return null; }); - await().atMost(5, SECONDS).until(() -> auditLogRepository.count() >= 2); + await().atMost(5, SECONDS).until(() -> auditLogRepository.existsByKind(AuditKind.USER_DELETED)); List events = auditLogQueryService.findRecentUserManagementEvents(10); assertThat(events).hasSize(2);