From 2181fe0b50dfcc6aa3e9a8c5a91dce3c7ba6c45f Mon Sep 17 00:00:00 2001 From: Marcel Date: Mon, 13 Apr 2026 23:00:09 +0200 Subject: [PATCH] =?UTF-8?q?test(annotations):=20fix=20AnnotationServiceTes?= =?UTF-8?q?t=20=E2=80=94=20add=20missing=20TranscriptionBlockRepository=20?= =?UTF-8?q?mock?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The cascade-delete commit (5a5a8b6) added blockRepository.deleteByAnnotationId() to AnnotationService.deleteAnnotation(), but the test class was not updated to mock TranscriptionBlockRepository. Mockito injected null, causing deleteAnnotation_succeeds_whenOwner to throw NPE. Adds the mock, verifies the cascade call, and adds an inOrder test asserting the block is deleted before the annotation. Co-Authored-By: Claude Sonnet 4.6 --- .../service/AnnotationServiceTest.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/backend/src/test/java/org/raddatz/familienarchiv/service/AnnotationServiceTest.java b/backend/src/test/java/org/raddatz/familienarchiv/service/AnnotationServiceTest.java index b4813491..cd736005 100644 --- a/backend/src/test/java/org/raddatz/familienarchiv/service/AnnotationServiceTest.java +++ b/backend/src/test/java/org/raddatz/familienarchiv/service/AnnotationServiceTest.java @@ -9,6 +9,7 @@ import org.raddatz.familienarchiv.dto.CreateAnnotationDTO; import org.raddatz.familienarchiv.exception.DomainException; import org.raddatz.familienarchiv.model.DocumentAnnotation; import org.raddatz.familienarchiv.repository.AnnotationRepository; +import org.raddatz.familienarchiv.repository.TranscriptionBlockRepository; import java.util.List; import java.util.Optional; @@ -27,6 +28,7 @@ import static org.springframework.http.HttpStatus.NOT_FOUND; class AnnotationServiceTest { @Mock AnnotationRepository annotationRepository; + @Mock TranscriptionBlockRepository blockRepository; @InjectMocks AnnotationService annotationService; // ─── createAnnotation ───────────────────────────────────────────────────── @@ -163,9 +165,28 @@ class AnnotationServiceTest { annotationService.deleteAnnotation(docId, annotId, ownerId); + verify(blockRepository).deleteByAnnotationId(annotId); verify(annotationRepository).delete(annotation); } + @Test + void deleteAnnotation_deletesLinkedTranscriptionBlock_beforeAnnotation() { + UUID docId = UUID.randomUUID(); + UUID annotId = UUID.randomUUID(); + UUID ownerId = UUID.randomUUID(); + + DocumentAnnotation annotation = DocumentAnnotation.builder() + .id(annotId).documentId(docId).createdBy(ownerId).build(); + when(annotationRepository.findByIdAndDocumentId(annotId, docId)) + .thenReturn(Optional.of(annotation)); + + annotationService.deleteAnnotation(docId, annotId, ownerId); + + var inOrder = org.mockito.Mockito.inOrder(blockRepository, annotationRepository); + inOrder.verify(blockRepository).deleteByAnnotationId(annotId); + inOrder.verify(annotationRepository).delete(annotation); + } + @Test void deleteAnnotation_throwsForbidden_whenUserIdIsNull() { UUID docId = UUID.randomUUID();