Files
tuanwei-java/src/test/java/com/gxwebsoft/gxmu/module/ModuleRegistryServiceImplTest.java
T
weicw 37cc8ee0d5 fix(gxmu): 注册表补 has_college 与团员管理种子,接口返回 DTO 并支持 all=true
- gxmu_module_registry 增加 has_college(4 张在跑表置 1,含已有库补列与补数据语句)
- 种子补 gxmu_tygl_form / gxmu_tygl(enabled=0,团员管理,sort 11/12),
  同步修正末尾「执行后校验」:12 行未删除、5 行启用、has_college 4 行
- GET /api/gxmu/module-registry/list 支持 all=true(默认只返回启用),
  改为返回 ModuleRegistryDTO,不再外泄 tenantId / userId / 时间戳
- ModuleRegistryService:删掉无生产调用的 titleOf(String)/allModules,
  标题回退收敛成唯一的静态 titleOf(Map, module);getByModule 改由 hasCollege 使用
- listAll 只保留 SQL 排序(sort_number 升序,NULL 排最前,与 MySQL ASC 口径一致),
  删掉内存二次排序
- ModuleRegistryIntegrityChecker 增加反向告警:review_flow_config 里有、注册表里没有的
  module 打 warn,不阻断启动

refs #58
2026-11-03 23:13:29 +08:00

134 lines
5.2 KiB
Java

package com.gxwebsoft.gxmu.module;
import com.gxwebsoft.gxmu.module.entity.ModuleRegistry;
import com.gxwebsoft.gxmu.module.mapper.ModuleRegistryMapper;
import com.gxwebsoft.gxmu.module.service.ModuleRegistryService;
import com.gxwebsoft.gxmu.module.service.impl.ModuleRegistryServiceImpl;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.mockito.junit.jupiter.MockitoSettings;
import org.mockito.quality.Strictness;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.when;
/**
* 模块注册表服务的单元测试(mock 掉 Mapper,不启 Spring、不连库)。
*
* <p>注册表是模块元数据的唯一来源,这里锁住四件对外可观察的事:
* 启用清单只留启用项且保持 SQL 的排序(排序只在 SQL 里做一次)、
* 模块集合包含已停用模块(停用模块的历史数据仍要能撤回/作废)、
* has_college 决定审批人解析是否读学院上下文、标题回退只有一份实现。
*
* @author Codex
* @since 2026-11-10
*/
@ExtendWith(MockitoExtension.class)
@MockitoSettings(strictness = Strictness.LENIENT)
class ModuleRegistryServiceImplTest {
@Mock
private ModuleRegistryMapper moduleRegistryMapper;
@InjectMocks
private ModuleRegistryServiceImpl moduleRegistryService;
@Test
void listEnabledReturnsOnlyEnabledModulesInSqlOrder() {
// SQL 已按 sort_number 升序返回;服务只负责过滤,不再二次排序
when(moduleRegistryMapper.selectList(any())).thenReturn(Arrays.asList(
module("gxmu_sjqn", "十佳青年岗位能手", 1, 1, 1),
module("gxmu_sjtbzbsj", "十佳团支部书记", 0, 2, 0),
module("gxmu_qmgc_form", "青马工程", 1, 8, 1)));
List<ModuleRegistry> enabled = moduleRegistryService.listEnabled();
assertEquals(Arrays.asList("gxmu_sjqn", "gxmu_qmgc_form"),
enabled.stream().map(ModuleRegistry::getModule).collect(Collectors.toList()));
}
@Test
void titleMapCoversDisabledModulesSoHistoricalRowsKeepTitles() {
when(moduleRegistryMapper.selectList(any())).thenReturn(Arrays.asList(
module("gxmu_sjqn", "十佳青年岗位能手", 1, 1, 1),
module("gxmu_yxgqty", "优秀共青团员", 0, 6, 0)));
Map<String, String> titles = moduleRegistryService.titleMap();
assertEquals("十佳青年岗位能手", titles.get("gxmu_sjqn"));
assertEquals("优秀共青团员", titles.get("gxmu_yxgqty"));
assertEquals(2, titles.size());
}
@Test
void moduleSetContainsDisabledModules() {
when(moduleRegistryMapper.selectList(any())).thenReturn(Arrays.asList(
module("gxmu_sjqn", "十佳青年岗位能手", 1, 1, 1),
module("gxmu_yxgqty", "优秀共青团员", 0, 6, 0)));
assertTrue(moduleRegistryService.containsModule("gxmu_yxgqty"));
assertFalse(moduleRegistryService.containsModule("gxmu_unknown"));
assertFalse(moduleRegistryService.containsModule(null));
}
@Test
void hasCollegeFollowsTheRegistryFlag() {
when(moduleRegistryMapper.selectOne(any())).thenReturn(module("gxmu_sjqn", "十佳青年岗位能手", 1, 1, 1));
assertTrue(moduleRegistryService.hasCollege("gxmu_sjqn"));
}
@Test
void hasCollegeIsFalseForDisabledOrMissingFlag() {
when(moduleRegistryMapper.selectOne(any())).thenReturn(module("gxmu_tygl", "团员管理", 0, 12, 0));
assertFalse(moduleRegistryService.hasCollege("gxmu_tygl"));
assertFalse(moduleRegistryService.hasCollege(null));
}
@Test
void titleOfUsesRegistryTitleWhenPresent() {
Map<String, String> titles = new HashMap<>();
titles.put("gxmu_tzbcy_form", "挑战杯");
assertEquals("挑战杯", ModuleRegistryService.titleOf(titles, "gxmu_tzbcy_form"));
}
@Test
void titleOfFallsBackToModuleStringWhenNotRegistered() {
assertEquals("cms_legacy_module", ModuleRegistryService.titleOf(new HashMap<>(), "cms_legacy_module"));
assertEquals("cms_legacy_module", ModuleRegistryService.titleOf(null, "cms_legacy_module"));
}
@Test
void titleOfKeepsNullModuleNull() {
assertNull(ModuleRegistryService.titleOf(new HashMap<>(), null));
}
private ModuleRegistry module(String name, String title, int enabled, int sortNumber, int hasCollege) {
ModuleRegistry item = new ModuleRegistry();
item.setModule(name);
item.setTableName(name);
item.setTitle(title);
item.setDetailKey(name);
item.setEnabled(enabled);
item.setSortNumber(sortNumber);
item.setHasCollege(hasCollege);
item.setDeleted(0);
return item;
}
}