package cn.iocoder.yudao.module.mes.service.trace.consumer; import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; import cn.iocoder.yudao.module.mes.dal.dataobject.trace.consumer.MesTraceConsumerScanEventDO; import cn.iocoder.yudao.module.mes.dal.mysql.trace.consumer.MesTraceConsumerScanEventMapper; import jakarta.annotation.Resource; import org.junit.jupiter.api.Test; import org.springframework.context.annotation.Import; import java.util.List; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; /** * {@link MesTraceConsumerScanEventServiceImpl} 的单元测试 * * @author 超级管理员 */ @Import(MesTraceConsumerScanEventServiceImpl.class) public class MesTraceConsumerScanEventServiceImplTest extends BaseDbUnitTest { @Resource private MesTraceConsumerScanEventService eventService; @Resource private MesTraceConsumerScanEventMapper eventMapper; /** * 查询刚插入的第一条事件(id 由序列/雪花算法生成,不固定为 1) */ private MesTraceConsumerScanEventDO getFirstEvent() { List list = eventMapper.selectList(null); return list.isEmpty() ? null : list.get(0); } @Test public void testRecordScan_成功事件落库() { // 无请求上下文时 IP/UA/渠道为空,但事件仍应落库且不抛异常 eventService.recordScan("PC-RAW-CODE", "PC-CODE-001", "BAG", 100L, true, null); MesTraceConsumerScanEventDO event = getFirstEvent(); assertNotNull(event); assertEquals("PC-RAW-CODE", event.getTraceCode()); assertEquals("PC-CODE-001", event.getNormalizedCode()); assertEquals("BAG", event.getSourceType()); assertEquals(100L, event.getBatchId()); assertTrue(Boolean.TRUE.equals(event.getSuccess())); assertNull(event.getErrorCode()); assertNull(event.getIpHash()); // 无请求上下文无明文 IP,也不应保存 assertNull(event.getChannel()); assertNotNull(event.getEventTime()); } @Test public void testRecordScan_失败事件落库() { eventService.recordScan("NOT-EXIST", null, null, null, false, "MES_TRACE_CODE_NOT_FOUND"); MesTraceConsumerScanEventDO event = getFirstEvent(); assertNotNull(event); assertFalse(Boolean.TRUE.equals(event.getSuccess())); assertEquals("MES_TRACE_CODE_NOT_FOUND", event.getErrorCode()); assertNull(event.getSourceType()); assertNull(event.getBatchId()); } @Test public void testRecordScan_超长码截断() { String longCode = "X".repeat(500); eventService.recordScan(longCode, longCode, "BATCH", null, true, null); MesTraceConsumerScanEventDO event = getFirstEvent(); assertNotNull(event); // traceCode 截断到 255、normalizedCode 截断到 128 assertEquals(255, event.getTraceCode().length()); assertEquals(128, event.getNormalizedCode().length()); } @Test public void testRecordScan_记录异常不影响接口() { // recordScan 内部吞掉异常,事件仍应正常落库 eventService.recordScan("CODE", "CODE", "BATCH", null, true, null); assertNotNull(getFirstEvent()); } }