From 7e1f4f8b09a1904749bc9b1645c0fa43ad5ac1bc Mon Sep 17 00:00:00 2001 From: Marcel Date: Sat, 9 May 2026 14:42:26 +0200 Subject: [PATCH] test(fts): add overflow guard and UUID-as-String regression tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - searchDocuments_relevance_returns_empty_when_offset_exceeds_maxInt: proves the long→int guard fires and findFtsPageRaw is never called - searchDocuments_relevance_handles_string_uuid_from_jdbc_driver: exercises the toFtsPage String fallback branch for JDBC drivers that return UUID columns as String instead of java.util.UUID Addresses Sara's review concerns on PR #488. Co-Authored-By: Claude Sonnet 4.6 --- .../document/DocumentServiceSortTest.java | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/backend/src/test/java/org/raddatz/familienarchiv/document/DocumentServiceSortTest.java b/backend/src/test/java/org/raddatz/familienarchiv/document/DocumentServiceSortTest.java index c2f703cf..f7c4564f 100644 --- a/backend/src/test/java/org/raddatz/familienarchiv/document/DocumentServiceSortTest.java +++ b/backend/src/test/java/org/raddatz/familienarchiv/document/DocumentServiceSortTest.java @@ -124,6 +124,41 @@ class DocumentServiceSortTest { assertThat(result.items().get(0).document().getId()).isEqualTo(id1); } + // ─── RELEVANCE sort — overflow guard ───────────────────────────────────── + + @Test + void searchDocuments_relevance_returns_empty_when_offset_exceeds_maxInt() { + // offset = pageNumber * pageSize; choose values so offset > Integer.MAX_VALUE + Pageable hugePage = org.springframework.data.domain.PageRequest.of(Integer.MAX_VALUE / 10 + 1, 10); + + DocumentSearchResult result = documentService.searchDocuments( + "Brief", null, null, null, null, null, null, null, + DocumentSort.RELEVANCE, null, null, hugePage); + + assertThat(result.items()).isEmpty(); + verify(documentRepository, never()).findFtsPageRaw(anyString(), anyInt(), anyInt()); + } + + // ─── toFtsPage — UUID-as-String JDBC driver variance ──────────────────── + + @Test + void searchDocuments_relevance_handles_string_uuid_from_jdbc_driver() { + String stringId = "11111111-1111-1111-1111-111111111111"; + UUID uuidId = UUID.fromString(stringId); + // Simulate a JDBC driver that returns the id column as String instead of UUID + List ftsRows = new ArrayList<>(); + ftsRows.add(new Object[]{stringId, 0.5d, 1L}); + when(documentRepository.findFtsPageRaw(anyString(), anyInt(), anyInt())).thenReturn(ftsRows); + when(documentRepository.findAllById(any())).thenReturn(List.of(doc(uuidId))); + + DocumentSearchResult result = documentService.searchDocuments( + "Brief", null, null, null, null, null, null, null, + DocumentSort.RELEVANCE, null, null, PAGE); + + assertThat(result.items()).hasSize(1); + assertThat(result.items().get(0).document().getId()).isEqualTo(uuidId); + } + // ─── RELEVANCE sort — text + active filter ──────────────────────────────── @Test