From aa8f7afc8bcb285aae336e098e0e16fc24286e3e Mon Sep 17 00:00:00 2001 From: vsxd Date: Thu, 19 Mar 2026 17:37:11 +0800 Subject: [PATCH] test(search): cover latest-version reindex flow --- .../event/SearchIndexEventListenerTest.java | 36 +++++++++++++ .../PostgresSearchRebuildServiceTest.java | 54 +++++++++++++++++++ 2 files changed, 90 insertions(+) create mode 100644 server/skillhub-search/src/test/java/com/iflytek/skillhub/search/event/SearchIndexEventListenerTest.java diff --git a/server/skillhub-search/src/test/java/com/iflytek/skillhub/search/event/SearchIndexEventListenerTest.java b/server/skillhub-search/src/test/java/com/iflytek/skillhub/search/event/SearchIndexEventListenerTest.java new file mode 100644 index 00000000..84a2b295 --- /dev/null +++ b/server/skillhub-search/src/test/java/com/iflytek/skillhub/search/event/SearchIndexEventListenerTest.java @@ -0,0 +1,36 @@ +package com.iflytek.skillhub.search.event; + +import com.iflytek.skillhub.domain.event.SkillPublishedEvent; +import com.iflytek.skillhub.domain.event.SkillStatusChangedEvent; +import com.iflytek.skillhub.domain.skill.SkillStatus; +import com.iflytek.skillhub.search.SearchIndexService; +import com.iflytek.skillhub.search.SearchRebuildService; +import org.junit.jupiter.api.Test; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; + +class SearchIndexEventListenerTest { + + @Test + void skillPublishedEventShouldTriggerSkillRebuild() { + SearchRebuildService searchRebuildService = mock(SearchRebuildService.class); + SearchIndexService searchIndexService = mock(SearchIndexService.class); + SearchIndexEventListener listener = new SearchIndexEventListener(searchRebuildService, searchIndexService); + + listener.onSkillPublished(new SkillPublishedEvent(42L, 100L, "reviewer-1")); + + verify(searchRebuildService).rebuildBySkill(42L); + } + + @Test + void archivedStatusShouldRemoveSearchDocument() { + SearchRebuildService searchRebuildService = mock(SearchRebuildService.class); + SearchIndexService searchIndexService = mock(SearchIndexService.class); + SearchIndexEventListener listener = new SearchIndexEventListener(searchRebuildService, searchIndexService); + + listener.onSkillStatusChanged(new SkillStatusChangedEvent(42L, SkillStatus.ACTIVE, SkillStatus.ARCHIVED)); + + verify(searchIndexService).remove(42L); + } +} diff --git a/server/skillhub-search/src/test/java/com/iflytek/skillhub/search/postgres/PostgresSearchRebuildServiceTest.java b/server/skillhub-search/src/test/java/com/iflytek/skillhub/search/postgres/PostgresSearchRebuildServiceTest.java index 68432022..f57adc29 100644 --- a/server/skillhub-search/src/test/java/com/iflytek/skillhub/search/postgres/PostgresSearchRebuildServiceTest.java +++ b/server/skillhub-search/src/test/java/com/iflytek/skillhub/search/postgres/PostgresSearchRebuildServiceTest.java @@ -91,4 +91,58 @@ class PostgresSearchRebuildServiceTest { assertThat(document.searchText()).contains("openai"); assertThat(document.searchText()).doesNotContain("# ignored"); } + + @Test + void rebuildBySkill_shouldUseLatestVersionMetadataWhenPublishedVersionAdvances() { + SkillRepository skillRepository = mock(SkillRepository.class); + NamespaceRepository namespaceRepository = mock(NamespaceRepository.class); + SkillVersionRepository skillVersionRepository = mock(SkillVersionRepository.class); + SearchIndexService searchIndexService = mock(SearchIndexService.class); + + Skill skill = new Skill(7L, "smart-agent", "owner-1", SkillVisibility.PUBLIC); + skill.setDisplayName("Smart Agent"); + skill.setSummary("Builds workflows"); + skill.setLatestVersionId(100L); + + Namespace namespace = new Namespace("team-ai", "Team AI", "owner-1"); + + SkillVersion latestVersion = new SkillVersion(1L, "1.3.0", "owner-1"); + latestVersion.setParsedMetadataJson(""" + { + "name": "Smart Agent", + "description": "Builds workflows", + "version": "1.3.0", + "frontmatter": { + "tags": ["中文搜索"], + "keywords": ["智能体"], + "maintainer": "新版维护者" + } + } + """); + + when(skillRepository.findById(1L)).thenReturn(Optional.of(skill)); + when(namespaceRepository.findById(7L)).thenReturn(Optional.of(namespace)); + when(skillVersionRepository.findById(100L)).thenReturn(Optional.of(latestVersion)); + + PostgresSearchRebuildService service = new PostgresSearchRebuildService( + skillRepository, + namespaceRepository, + skillVersionRepository, + searchIndexService, + new SearchTextTokenizer() + ); + + service.rebuildBySkill(1L); + + ArgumentCaptor captor = ArgumentCaptor.forClass(SkillSearchDocument.class); + verify(searchIndexService).index(captor.capture()); + + SkillSearchDocument document = captor.getValue(); + assertThat(document.keywords()).contains("中文搜索"); + assertThat(document.keywords()).contains("中文"); + assertThat(document.keywords()).contains("搜索"); + assertThat(document.keywords()).contains("智能体"); + assertThat(document.searchText()).contains("maintainer"); + assertThat(document.searchText()).contains("新版维护者"); + } }