fix: 修复插件分类查询并保留返回状态

- 统一按插件名称进行模糊查询并支持分类筛选

- 恢复插件列表与工具编辑的页码、分类和搜索条件
This commit is contained in:
2026-07-31 09:54:45 +08:00
parent c2ed5a24a3
commit 1cbee6b018
13 changed files with 717 additions and 30 deletions

View File

@@ -0,0 +1,83 @@
package tech.easyflow.ai.service.impl;
import com.mybatisflex.core.query.QueryWrapper;
import org.junit.Assert;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import tech.easyflow.ai.entity.Plugin;
import tech.easyflow.ai.mapper.PluginCategoryMappingMapper;
import tech.easyflow.ai.mapper.PluginMapper;
import tech.easyflow.system.entity.vo.RoleCategoryAccessSnapshot;
import tech.easyflow.system.service.CategoryPermissionService;
import java.math.BigInteger;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
/**
* 插件分类分页查询测试。
*/
public class PluginServicePageQueryTest {
/**
* 验证具体分类下仍会按插件名称过滤。
*/
@Test
public void shouldFilterCategorizedPluginsByName() {
PluginMapper pluginMapper = mock(PluginMapper.class);
PluginCategoryMappingMapper mappingMapper = mock(PluginCategoryMappingMapper.class);
CategoryPermissionService categoryPermissionService = mock(CategoryPermissionService.class);
RoleCategoryAccessSnapshot access = mock(RoleCategoryAccessSnapshot.class);
PluginServiceImpl service = new PluginServiceImpl();
service.pluginMapper = pluginMapper;
service.pluginCategoryMappingMapper = mappingMapper;
setField(service, "categoryPermissionService", categoryPermissionService);
when(categoryPermissionService.getCurrentAccess("PLUGIN")).thenReturn(access);
when(access.isRestricted()).thenReturn(false);
when(mappingMapper.selectListByQueryAs(any(QueryWrapper.class), eq(BigInteger.class)))
.thenReturn(List.of(BigInteger.ONE));
when(pluginMapper.selectListWithRelationsByQuery(any(QueryWrapper.class)))
.thenReturn(Collections.emptyList());
service.pageByCategory(1L, 12L, 7, " 1213 ");
ArgumentCaptor<QueryWrapper> queryCaptor = ArgumentCaptor.forClass(QueryWrapper.class);
verify(pluginMapper).selectListWithRelationsByQuery(queryCaptor.capture());
String sql = queryCaptor.getValue().toSQL().toLowerCase(Locale.ROOT);
Assert.assertTrue(sql.contains("name"));
Assert.assertTrue(sql.contains("like"));
Assert.assertTrue(sql.contains("1213"));
}
/**
* 通过反射设置私有依赖。
*
* @param target 目标对象
* @param fieldName 字段名称
* @param value 字段值
*/
private static void setField(Object target, String fieldName, Object value) {
Class<?> current = target.getClass();
while (current != null) {
try {
java.lang.reflect.Field field = current.getDeclaredField(fieldName);
field.setAccessible(true);
field.set(target, value);
return;
} catch (NoSuchFieldException ignored) {
current = current.getSuperclass();
} catch (IllegalAccessException e) {
throw new IllegalStateException("设置测试字段失败: " + fieldName, e);
}
}
throw new IllegalArgumentException("未找到字段: " + fieldName);
}
}