From b825076733cde19995f3c19b1de5c5fc56041123 Mon Sep 17 00:00:00 2001 From: Marcel Date: Sat, 6 Jun 2026 22:59:07 +0200 Subject: [PATCH] test(search): DataJpaTest for descendant-expansion via TagRepository Verifies the recursive CTE in findDescendantIdsByName expands a parent tag to include all child IDs, and that findByNameContainingIgnoreCase matches both parent and child names when the fragment appears in both. Co-Authored-By: Claude Sonnet 4.6 --- .../NlSearchTagResolutionIntegrationTest.java | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 backend/src/test/java/org/raddatz/familienarchiv/search/NlSearchTagResolutionIntegrationTest.java diff --git a/backend/src/test/java/org/raddatz/familienarchiv/search/NlSearchTagResolutionIntegrationTest.java b/backend/src/test/java/org/raddatz/familienarchiv/search/NlSearchTagResolutionIntegrationTest.java new file mode 100644 index 00000000..bbe0a88b --- /dev/null +++ b/backend/src/test/java/org/raddatz/familienarchiv/search/NlSearchTagResolutionIntegrationTest.java @@ -0,0 +1,56 @@ +package org.raddatz.familienarchiv.search; + +import org.junit.jupiter.api.Test; +import org.raddatz.familienarchiv.PostgresContainerConfig; +import org.raddatz.familienarchiv.config.FlywayConfig; +import org.raddatz.familienarchiv.tag.Tag; +import org.raddatz.familienarchiv.tag.TagRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.jdbc.test.autoconfigure.AutoConfigureTestDatabase; +import org.springframework.boot.data.jpa.test.autoconfigure.DataJpaTest; +import org.springframework.context.annotation.Import; + +import java.util.List; +import java.util.UUID; + +import static org.assertj.core.api.Assertions.assertThat; + +@DataJpaTest +@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) +@Import({PostgresContainerConfig.class, FlywayConfig.class}) +class NlSearchTagResolutionIntegrationTest { + + @Autowired + private TagRepository tagRepository; + + @Test + void findDescendantIdsByName_parentName_includesChildId() { + Tag parent = tagRepository.save(Tag.builder().name("Krieg").build()); + Tag child = tagRepository.save(Tag.builder().name("Weltkrieg").parentId(parent.getId()).build()); + + List ids = tagRepository.findDescendantIdsByName("Krieg"); + + assertThat(ids).containsExactlyInAnyOrder(parent.getId(), child.getId()); + } + + @Test + void findDescendantIdsByName_childName_returnsOnlyChild() { + Tag parent = tagRepository.save(Tag.builder().name("Krieg").build()); + Tag child = tagRepository.save(Tag.builder().name("Weltkrieg").parentId(parent.getId()).build()); + + List ids = tagRepository.findDescendantIdsByName("Weltkrieg"); + + assertThat(ids).containsExactly(child.getId()); + assertThat(ids).doesNotContain(parent.getId()); + } + + @Test + void findByNameContainingIgnoreCase_parentSubstring_matchesParentOnly() { + Tag parent = tagRepository.save(Tag.builder().name("Krieg").build()); + tagRepository.save(Tag.builder().name("Weltkrieg").parentId(parent.getId()).build()); + + List found = tagRepository.findByNameContainingIgnoreCase("Krieg"); + + assertThat(found).extracting(Tag::getName).containsExactlyInAnyOrder("Krieg", "Weltkrieg"); + } +}