package com.openisle.service; import static org.junit.jupiter.api.Assertions.*; import com.openisle.model.Post; import com.openisle.model.PostStatus; import com.openisle.repository.CategoryRepository; import com.openisle.repository.CommentRepository; import com.openisle.repository.PostRepository; import com.openisle.repository.TagRepository; import com.openisle.repository.UserRepository; import com.openisle.search.OpenSearchProperties; import java.util.List; import java.util.Optional; import org.junit.jupiter.api.Test; import org.mockito.Mockito; class SearchServiceTest { @Test void globalSearchDeduplicatesPosts() { UserRepository userRepo = Mockito.mock(UserRepository.class); PostRepository postRepo = Mockito.mock(PostRepository.class); CommentRepository commentRepo = Mockito.mock(CommentRepository.class); CategoryRepository categoryRepo = Mockito.mock(CategoryRepository.class); TagRepository tagRepo = Mockito.mock(TagRepository.class); SearchService service = new SearchService( userRepo, postRepo, commentRepo, categoryRepo, tagRepo, Optional.empty(), new OpenSearchProperties() ); Post post1 = new Post(); post1.setId(1L); post1.setTitle("hello"); Post post2 = new Post(); post2.setId(2L); post2.setTitle("world"); Mockito.when( postRepo.findByTitleContainingIgnoreCaseOrContentContainingIgnoreCaseAndStatus( Mockito.anyString(), Mockito.anyString(), Mockito.eq(PostStatus.PUBLISHED) ) ).thenReturn(List.of(post1)); Mockito.when( postRepo.findByTitleContainingIgnoreCaseAndStatus( Mockito.anyString(), Mockito.eq(PostStatus.PUBLISHED) ) ).thenReturn(List.of(post1, post2)); Mockito.when(commentRepo.findByContentContainingIgnoreCase(Mockito.anyString())).thenReturn( List.of() ); Mockito.when(userRepo.findByUsernameContainingIgnoreCase(Mockito.anyString())).thenReturn( List.of() ); List results = service.globalSearch("h"); assertEquals(2, results.size()); assertEquals(1L, results.get(0).id()); assertEquals(2L, results.get(1).id()); } }