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 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()); } }