yeg
2026-09-05 2e75fb72c1ba5d3d055362b44e7b85c0ad3f5416
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
142
143
package com.battery.business.mapper;
 
import static org.junit.jupiter.api.Assertions.*;
 
import java.util.List;
import java.util.UUID;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.github.pagehelper.PageInterceptor;
import org.apache.ibatis.builder.xml.XMLMapperBuilder;
import org.apache.ibatis.datasource.unpooled.UnpooledDataSource;
import org.apache.ibatis.mapping.Environment;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import com.battery.business.domain.TCollector;
import com.battery.business.domain.TDetectionCabinet;
import com.battery.business.domain.vo.DeviceRelatedTestVo;
 
/** 使用真实映射和内存数据库验证绑定查询,不连接共享开发库。 */
class DeviceRelatedTestMapperTest
{
    private SqlSession session;
 
    @BeforeEach
    void setUp() throws Exception
    {
        var source = new UnpooledDataSource("org.h2.Driver", "jdbc:h2:mem:" + UUID.randomUUID() + ";MODE=MySQL", "sa", "");
        var configuration = new Configuration(new Environment("test", new JdbcTransactionFactory(), source));
        var pagination = new PageInterceptor();
        var properties = new java.util.Properties();
        properties.setProperty("helperDialect", "mysql");
        pagination.setProperties(properties);
        configuration.addInterceptor(pagination);
        configuration.getTypeAliasRegistry().registerAliases("com.battery.business.domain");
        for (String name : List.of("DeviceRelatedTestMapper", "TDetectionCabinetMapper", "TCollectorMapper"))
        {
            String resource = "mapper/battery/" + name + ".xml";
            try (var input = getClass().getClassLoader().getResourceAsStream(resource))
            {
                new XMLMapperBuilder(input, configuration, resource, configuration.getSqlFragments()).parse();
            }
        }
        session = new SqlSessionFactoryBuilder().build(configuration).openSession();
        try (var sql = session.getConnection().createStatement())
        {
            sql.execute("create table t_test(test_id bigint primary key, test_name varchar(100), test_status varchar(30), del_flag int)");
            sql.execute("insert into t_test values (1,'Waiting','WAITING',0),(2,'Running','RUNNING',0),(3,'Paused','PAUSED',0),(4,'Completed','COMPLETED',0),(5,'Deleted','RUNNING',1),(6,'Other device','WAITING',0)");
            sql.execute("create table t_detection_channel(channel_id bigint primary key, cabinet_id bigint, subdevid int, chlid int, del_flag int)");
            sql.execute("insert into t_detection_channel values (11,1,1,1,0),(12,1,1,2,0),(13,1,2,1,0),(21,2,1,1,0)");
            sql.execute("create table t_test_channel_binding(test_id bigint, channel_id bigint)");
            sql.execute("insert into t_test_channel_binding values (1,11),(1,12),(1,13),(2,11),(3,12),(4,11),(5,11),(6,21),(1,21)");
            sql.execute("create table t_test_collector_channel(test_id bigint, collector_id bigint, channel_code varchar(100))");
            sql.execute("insert into t_test_collector_channel values (1,1,'S-01'),(1,1,'S-02'),(2,1,'S-01'),(3,1,'S-02'),(4,1,'S-01'),(5,1,'S-01'),(6,2,'S-03'),(1,2,'S-03')");
            String common = "adapter_id bigint, ip_address varchar(45), mac_address varchar(20), manufacturer varchar(100), model varchar(100), channel_count int, online_status varchar(10), status varchar(1), create_by varchar(64), create_time timestamp, update_by varchar(64), update_time timestamp, remark varchar(200), del_flag int default 0";
            sql.execute("create table t_detection_cabinet(cabinet_id bigint primary key, adapter_code varchar(64), cabinet_code varchar(64), cabinet_name varchar(100), capacity decimal, registration_status varchar(20) default 'REGISTERED', " + common + ")");
            sql.execute("insert into t_detection_cabinet(cabinet_id,cabinet_name,online_status) values (1,'Cabinet','OFFLINE'),(3,'Unused','ONLINE')");
            sql.execute("create table t_collector(collector_id bigint primary key, collector_code varchar(64), collector_name varchar(100), last_seen_at_utc timestamp, " + common + ")");
            sql.execute("insert into t_collector(collector_id,collector_name,online_status) values (1,'Collector','ONLINE'),(3,'Unused','OFFLINE')");
        }
    }
 
    @AfterEach
    void tearDown()
    {
        PageHelper.clearPage();
        if (session != null) session.close();
    }
 
    @Test
    void cabinetIncludesAllTestStatesOnceAndOnlyItsOwnChannels()
    {
        var tests = session.getMapper(DeviceRelatedTestMapper.class).selectCabinetRelatedTests(1L);
        assertStates(tests);
        assertEquals(List.of("1-1", "1-2", "2-1"), tests.get(3).getChannels());
        assertEquals("Waiting", tests.get(3).getTestName());
        assertTrue(session.getMapper(DeviceRelatedTestMapper.class).selectCabinetRelatedTests(3L).isEmpty());
    }
 
    @Test
    void collectorIncludesAllTestStatesOnceAndOnlyItsOwnChannels()
    {
        var tests = session.getMapper(DeviceRelatedTestMapper.class).selectCollectorRelatedTests(1L);
        assertStates(tests);
        assertEquals(List.of("S-01", "S-02"), tests.get(3).getChannels());
        assertTrue(session.getMapper(DeviceRelatedTestMapper.class).selectCollectorRelatedTests(3L).isEmpty());
    }
 
    @Test
    void deviceListAndDetailAttachTheSameRelationsWithoutMultiplyingDeviceRows()
    {
        var cabinets = session.getMapper(TDetectionCabinetMapper.class);
        assertEquals(2, cabinets.selectDetectionCabinetList(new TDetectionCabinet()).size());
        assertStates(cabinets.selectDetectionCabinetById(1L).getRelatedTests());
        assertTrue(cabinets.selectDetectionCabinetById(3L).getRelatedTests().isEmpty());
        var collectors = session.getMapper(TCollectorMapper.class);
        assertEquals(2, collectors.selectCollectorList(new TCollector()).size());
        assertStates(collectors.selectCollectorById(1L).getRelatedTests());
        assertTrue(collectors.selectCollectorById(3L).getRelatedTests().isEmpty());
    }
 
    @Test
    void devicePaginationKeepsTotalsAndCompleteRelatedTestCollections()
    {
        PageHelper.startPage(2, 1);
        var cabinets = session.getMapper(TDetectionCabinetMapper.class).selectDetectionCabinetList(new TDetectionCabinet());
        assertEquals(2, new PageInfo<>(cabinets).getTotal());
        assertEquals(1, cabinets.size());
        assertEquals(1L, cabinets.get(0).getCabinetId());
        assertStates(cabinets.get(0).getRelatedTests());
        assertEquals(List.of("1-1", "1-2", "2-1"), cabinets.get(0).getRelatedTests().get(3).getChannels());
 
        PageHelper.startPage(2, 1);
        var collectors = session.getMapper(TCollectorMapper.class).selectCollectorList(new TCollector());
        assertEquals(2, new PageInfo<>(collectors).getTotal());
        assertEquals(1, collectors.size());
        assertEquals(1L, collectors.get(0).getCollectorId());
        assertStates(collectors.get(0).getRelatedTests());
        assertEquals(List.of("S-01", "S-02"), collectors.get(0).getRelatedTests().get(3).getChannels());
    }
 
    @Test
    void erasedTestDisappearsFromBothDevices() throws Exception
    {
        try (var sql = session.getConnection().createStatement())
        {
            sql.execute("delete from t_test where test_id = 1");
        }
        var mapper = session.getMapper(DeviceRelatedTestMapper.class);
        assertEquals(List.of(4L, 3L, 2L), mapper.selectCabinetRelatedTests(1L).stream().map(DeviceRelatedTestVo::getTestId).toList());
        assertEquals(List.of(4L, 3L, 2L), mapper.selectCollectorRelatedTests(1L).stream().map(DeviceRelatedTestVo::getTestId).toList());
    }
 
    private void assertStates(List<DeviceRelatedTestVo> tests)
    {
        assertEquals(List.of(4L, 3L, 2L, 1L), tests.stream().map(DeviceRelatedTestVo::getTestId).toList());
        assertEquals(List.of("COMPLETED", "PAUSED", "RUNNING", "WAITING"), tests.stream().map(DeviceRelatedTestVo::getTestStatus).toList());
    }
}