From 548df84219c47653332dc70f1b012edc9a13111f Mon Sep 17 00:00:00 2001 From: Marcel Date: Tue, 5 May 2026 16:25:41 +0200 Subject: [PATCH] test(annotation): wire TranscriptionBlockRepository mock and add cascade test MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit AnnotationService was changed to call transcriptionBlockRepository directly, but the test still mocked TranscriptionService — causing a NPE and leaving the cascade path uncovered. Replace the @Mock TranscriptionService with @Mock TranscriptionBlockRepository, update the two existing delete-test verifications, and add a dedicated deleteAnnotation_cascadesToTranscriptionBlocks test. Co-Authored-By: Claude Sonnet 4.6 --- .../annotation/AnnotationServiceTest.java | 26 +++++++++++++++---- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/backend/src/test/java/org/raddatz/familienarchiv/document/annotation/AnnotationServiceTest.java b/backend/src/test/java/org/raddatz/familienarchiv/document/annotation/AnnotationServiceTest.java index 2b81d67a..474f7f0b 100644 --- a/backend/src/test/java/org/raddatz/familienarchiv/document/annotation/AnnotationServiceTest.java +++ b/backend/src/test/java/org/raddatz/familienarchiv/document/annotation/AnnotationServiceTest.java @@ -8,7 +8,7 @@ import org.mockito.junit.jupiter.MockitoExtension; import org.mockito.ArgumentCaptor; import org.raddatz.familienarchiv.audit.AuditKind; import org.raddatz.familienarchiv.audit.AuditService; -import org.raddatz.familienarchiv.document.transcription.TranscriptionService; +import org.raddatz.familienarchiv.document.transcription.TranscriptionBlockRepository; import org.raddatz.familienarchiv.document.annotation.CreateAnnotationDTO; import org.raddatz.familienarchiv.document.annotation.UpdateAnnotationDTO; import org.raddatz.familienarchiv.exception.DomainException; @@ -36,7 +36,7 @@ import static org.springframework.http.HttpStatus.NOT_FOUND; class AnnotationServiceTest { @Mock AnnotationRepository annotationRepository; - @Mock TranscriptionService transcriptionService; + @Mock TranscriptionBlockRepository transcriptionBlockRepository; @Mock AuditService auditService; @InjectMocks AnnotationService annotationService; @@ -208,7 +208,7 @@ class AnnotationServiceTest { annotationService.deleteAnnotation(docId, annotId, ownerId); - verify(transcriptionService).deleteByAnnotationId(annotId); + verify(transcriptionBlockRepository).deleteByAnnotationId(annotId); verify(annotationRepository).delete(annotation); } @@ -225,11 +225,27 @@ class AnnotationServiceTest { annotationService.deleteAnnotation(docId, annotId, ownerId); - var inOrder = org.mockito.Mockito.inOrder(transcriptionService, annotationRepository); - inOrder.verify(transcriptionService).deleteByAnnotationId(annotId); + var inOrder = org.mockito.Mockito.inOrder(transcriptionBlockRepository, annotationRepository); + inOrder.verify(transcriptionBlockRepository).deleteByAnnotationId(annotId); inOrder.verify(annotationRepository).delete(annotation); } + @Test + void deleteAnnotation_cascadesToTranscriptionBlocks() { + 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); + + verify(transcriptionBlockRepository).deleteByAnnotationId(annotId); + } + @Test void deleteAnnotation_throwsForbidden_whenUserIdIsNull() { UUID docId = UUID.randomUUID();