hejianhao
2026-08-28 cc31d303d12f9c7cd2c4574351b67db04069ae0d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
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<AppRegisterRegionOptionVO> 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;
    }
}