From 6c5e5273bb781962be977cce3ccd34dcb950c795 Mon Sep 17 00:00:00 2001 From: Marcel Date: Mon, 1 Jun 2026 09:13:59 +0200 Subject: [PATCH] =?UTF-8?q?test(document):=20lock=20in=20accepted=20RANGE?= =?UTF-8?q?=20cases=20=E2=80=94=20equal/after/open/null-start=20(#678)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cover AC2 (end == start), AC3 (open-ended, end null) and AC4 (null start + end set, which must not reject or NPE), plus end-after-start. Guards the guard against future over-rejection that would diverge from the DB CHECK. Co-Authored-By: Claude Opus 4.8 --- .../document/DocumentServiceTest.java | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/backend/src/test/java/org/raddatz/familienarchiv/document/DocumentServiceTest.java b/backend/src/test/java/org/raddatz/familienarchiv/document/DocumentServiceTest.java index 0f05950e..58b64fd4 100644 --- a/backend/src/test/java/org/raddatz/familienarchiv/document/DocumentServiceTest.java +++ b/backend/src/test/java/org/raddatz/familienarchiv/document/DocumentServiceTest.java @@ -256,6 +256,63 @@ class DocumentServiceTest { verify(documentRepository, never()).save(any()); } + @Test + void updateDocument_acceptsRange_whenEndEqualsStart() throws Exception { + // AC2: the DB CHECK is end >= start, so equal dates are valid. + UUID id = UUID.randomUUID(); + Document doc = docForRangeUpdate(id); + when(documentRepository.findById(id)).thenReturn(Optional.of(doc)); + when(documentRepository.save(any())).thenReturn(doc); + + LocalDate same = LocalDate.of(1917, 1, 10); + documentService.updateDocument(id, rangeDto(same, same), null, null); + + assertThat(doc.getMetaDateEnd()).isEqualTo(same); + verify(documentRepository, atLeastOnce()).save(any()); + } + + @Test + void updateDocument_acceptsRange_whenEndAfterStart() throws Exception { + UUID id = UUID.randomUUID(); + Document doc = docForRangeUpdate(id); + when(documentRepository.findById(id)).thenReturn(Optional.of(doc)); + when(documentRepository.save(any())).thenReturn(doc); + + documentService.updateDocument(id, + rangeDto(LocalDate.of(1917, 1, 10), LocalDate.of(1917, 1, 11)), null, null); + + verify(documentRepository, atLeastOnce()).save(any()); + } + + @Test + void updateDocument_acceptsRange_whenEndIsNull_openEnded() throws Exception { + // AC3: an open-ended range (no end) is valid. + UUID id = UUID.randomUUID(); + Document doc = docForRangeUpdate(id); + when(documentRepository.findById(id)).thenReturn(Optional.of(doc)); + when(documentRepository.save(any())).thenReturn(doc); + + documentService.updateDocument(id, + rangeDto(LocalDate.of(1917, 1, 10), null), null, null); + + verify(documentRepository, atLeastOnce()).save(any()); + } + + @Test + void updateDocument_acceptsRange_whenStartNullAndEndSet() throws Exception { + // AC4: mirrors the DB "meta_date IS NULL" escape — must NOT reject (and must not NPE). + UUID id = UUID.randomUUID(); + Document doc = docForRangeUpdate(id); + when(documentRepository.findById(id)).thenReturn(Optional.of(doc)); + when(documentRepository.save(any())).thenReturn(doc); + + documentService.updateDocument(id, + rangeDto(null, LocalDate.of(1917, 1, 11)), null, null); + + assertThat(doc.getMetaDateEnd()).isEqualTo(LocalDate.of(1917, 1, 11)); + verify(documentRepository, atLeastOnce()).save(any()); + } + // ─── deleteTagCascading ─────────────────────────────────────────────────── @Test