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 <noreply@anthropic.com>
This commit is contained in:
@@ -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<UUID> 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<UUID> 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<Tag> found = tagRepository.findByNameContainingIgnoreCase("Krieg");
|
||||||
|
|
||||||
|
assertThat(found).extracting(Tag::getName).containsExactlyInAnyOrder("Krieg", "Weltkrieg");
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user