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