package com.tcm.training.admin.app.register.service; import com.tcm.training.admin.app.register.entity.SysRegion; import com.tcm.training.admin.app.register.mapper.SysRegionMapper; import com.tcm.training.admin.app.register.vo.AppRegisterRegionDatasetVO; import com.tcm.training.admin.app.register.vo.AppRegisterRegionOptionVO; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import java.util.Arrays; import java.util.Collections; import java.util.List; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; import static org.mockito.Mockito.when; /** * APP 注册行政区划服务测试。 */ @ExtendWith(MockitoExtension.class) class AppRegisterRegionServiceTest { @Mock private SysRegionMapper sysRegionMapper; private AppRegisterRegionService appRegisterRegionService; /** * 每个用例前重建被测服务。 */ @BeforeEach void setUp() { appRegisterRegionService = new AppRegisterRegionService(sysRegionMapper); } /** * 未传父级编码时应返回省级列表。 */ @Test void listRegionsShouldReturnProvinceOptions() { SysRegion province = buildRegion(1L, "浙江省", "330000", 0L); when(sysRegionMapper.selectByParentId(0L)).thenReturn(Collections.singletonList(province)); List options = appRegisterRegionService.listRegions(null); assertEquals(1, options.size()); assertEquals("330000", options.get(0).getCode()); assertEquals("浙江省", options.get(0).getName()); assertEquals(Integer.valueOf(1), options.get(0).getLevel()); } /** * APP 完整地区数据集应过滤区县层级的市辖区占位节点。 */ @Test void buildRegionDatasetShouldHideMunicipalDistrictPlaceholder() { SysRegion province = buildRegion(1L, "江西省", "360000", 0L); SysRegion city = buildRegion(2L, "吉安市", "360800", 1L); SysRegion placeholder = buildRegion(3L, "吉安市市辖区", "360801", 2L); SysRegion district = buildRegion(4L, "吉州区", "360802", 2L); when(sysRegionMapper.selectAllOrdered()).thenReturn( Arrays.asList(province, city, placeholder, district) ); AppRegisterRegionDatasetVO dataset = appRegisterRegionService.buildRegionDataset(); assertEquals(1, dataset.getAreas().size()); assertEquals(1, dataset.getAreas().get(0).size()); assertEquals(1, dataset.getAreas().get(0).get(0).size()); assertEquals("吉州区", dataset.getAreas().get(0).get(0).get(0).getLabel()); assertEquals("360802", dataset.getAreas().get(0).get(0).get(0).getValue()); } /** * 海诊通仅返回地区名称时,应通过 sys_region 解析出完整编码。 */ @Test void resolveRegionSelectionShouldUseNamesWhenCodesMissing() { SysRegion province = buildRegion(10L, "浙江省", "330000", 0L); SysRegion city = buildRegion(11L, "杭州市", "330100", 10L); SysRegion district = buildRegion(12L, "西湖区", "330106", 11L); when(sysRegionMapper.selectByParentIdAndName(0L, "浙江省")).thenReturn(province); when(sysRegionMapper.selectByParentIdAndName(10L, "杭州市")).thenReturn(city); when(sysRegionMapper.selectByParentIdAndName(11L, "西湖区")).thenReturn(district); AppRegisterRegionService.RegionSelection selection = appRegisterRegionService.resolveRegionSelection( null, "浙江省", null, "杭州市", null, "西湖区" ); assertEquals("330000", selection.getProvinceCode()); assertEquals("浙江省", selection.getProvinceName()); assertEquals("330100", selection.getCityCode()); assertEquals("杭州市", selection.getCityName()); assertEquals("330106", selection.getDistrictCode()); assertEquals("西湖区", selection.getDistrictName()); } /** * 海诊通未返回任何地区信息时,应保持空值供前端手动选择。 */ @Test void resolveRegionSelectionShouldReturnEmptyWhenRegionMissing() { AppRegisterRegionService.RegionSelection selection = appRegisterRegionService.resolveRegionSelection( null, null, null, null, null, null ); assertNull(selection.getProvinceCode()); assertNull(selection.getProvinceName()); assertNull(selection.getCityCode()); assertNull(selection.getCityName()); assertNull(selection.getDistrictCode()); assertNull(selection.getDistrictName()); } /** * 使用统一辅助方法构造测试地区节点。 */ private SysRegion buildRegion(Long id, String name, String code, Long parentId) { SysRegion region = new SysRegion(); region.setId(id); region.setName(name); region.setCode(code); region.setParentId(parentId); return region; } }