package cn.iocoder.yudao.module.mes.dal.mysql.wm.productsales;
import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productsales.MesWmProductSalesDetailDO;
import jakarta.annotation.Resource;
import org.junit.jupiter.api.Test;
import java.math.BigDecimal;
import java.util.List;
import java.util.function.Consumer;
import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId;
import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
import static org.junit.jupiter.api.Assertions.*;
/**
* {@link MesWmProductSalesDetailMapper} 的单元测试
*
* 覆盖:selectListByLineId、selectListBySalesId、deleteByLineId、deleteBySalesId
*/
public class MesWmProductSalesDetailMapperTest extends BaseDbUnitTest {
@Resource
private MesWmProductSalesDetailMapper detailMapper;
// ==================== 辅助方法 ====================
/**
* 创建明细 DO,固定 BigDecimal 精度为 2 位,避免 H2 decimal(14,2) 精度不匹配
*/
private MesWmProductSalesDetailDO createDetailPojo(Consumer consumer) {
return randomPojo(MesWmProductSalesDetailDO.class, o -> {
o.setQuantity(new BigDecimal("10.00"));
consumer.accept(o);
});
}
// ==================== selectListByLineId ====================
@Test
public void testSelectListByLineId_match() {
Long lineId = 100L;
MesWmProductSalesDetailDO match = createDetailPojo(o -> {
o.setLineId(lineId);
o.setSalesId(1L);
});
detailMapper.insert(match);
// 插入另一条不同 lineId 的记录,不应被返回
detailMapper.insert(cloneIgnoreId(match, o -> o.setLineId(999L)));
List result = detailMapper.selectListByLineId(lineId);
assertEquals(1, result.size());
assertPojoEquals(match, result.get(0));
}
@Test
public void testSelectListByLineId_multipleRows() {
Long lineId = 200L;
MesWmProductSalesDetailDO detail1 = createDetailPojo(o -> {
o.setLineId(lineId);
o.setSalesId(2L);
});
MesWmProductSalesDetailDO detail2 = createDetailPojo(o -> {
o.setLineId(lineId);
o.setSalesId(2L);
});
detailMapper.insert(detail1);
detailMapper.insert(detail2);
List result = detailMapper.selectListByLineId(lineId);
assertEquals(2, result.size());
}
@Test
public void testSelectListByLineId_noMatch() {
MesWmProductSalesDetailDO detail = createDetailPojo(o -> {
o.setLineId(300L);
o.setSalesId(3L);
});
detailMapper.insert(detail);
List result = detailMapper.selectListByLineId(999L);
assertTrue(result.isEmpty());
}
// ==================== selectListBySalesId ====================
@Test
public void testSelectListBySalesId_match() {
Long salesId = 10L;
MesWmProductSalesDetailDO match = createDetailPojo(o -> {
o.setSalesId(salesId);
o.setLineId(1L);
});
detailMapper.insert(match);
// 插入另一条不同 salesId 的记录
detailMapper.insert(cloneIgnoreId(match, o -> o.setSalesId(888L)));
List result = detailMapper.selectListBySalesId(salesId);
assertEquals(1, result.size());
assertPojoEquals(match, result.get(0));
}
@Test
public void testSelectListBySalesId_multipleRows() {
Long salesId = 20L;
MesWmProductSalesDetailDO detail1 = createDetailPojo(o -> {
o.setSalesId(salesId);
o.setLineId(11L);
});
MesWmProductSalesDetailDO detail2 = createDetailPojo(o -> {
o.setSalesId(salesId);
o.setLineId(12L);
});
detailMapper.insert(detail1);
detailMapper.insert(detail2);
List result = detailMapper.selectListBySalesId(salesId);
assertEquals(2, result.size());
}
@Test
public void testSelectListBySalesId_noMatch() {
MesWmProductSalesDetailDO detail = createDetailPojo(o -> {
o.setSalesId(30L);
o.setLineId(2L);
});
detailMapper.insert(detail);
List result = detailMapper.selectListBySalesId(9999L);
assertTrue(result.isEmpty());
}
// ==================== deleteByLineId ====================
@Test
public void testDeleteByLineId_deletesOnlyTargetLine() {
Long lineId = 400L;
MesWmProductSalesDetailDO toDelete = createDetailPojo(o -> {
o.setLineId(lineId);
o.setSalesId(4L);
});
MesWmProductSalesDetailDO toKeep = createDetailPojo(o -> {
o.setLineId(500L);
o.setSalesId(4L);
});
detailMapper.insert(toDelete);
detailMapper.insert(toKeep);
detailMapper.deleteByLineId(lineId);
// lineId=400 的记录已被逻辑删除
List deletedResult = detailMapper.selectListByLineId(lineId);
assertTrue(deletedResult.isEmpty(), "lineId=400 的记录应被删除");
// lineId=500 的记录保留
List keptResult = detailMapper.selectListByLineId(500L);
assertEquals(1, keptResult.size());
}
@Test
public void testDeleteByLineId_multipleRows() {
Long lineId = 600L;
detailMapper.insert(createDetailPojo(o -> { o.setLineId(lineId); o.setSalesId(5L); }));
detailMapper.insert(createDetailPojo(o -> { o.setLineId(lineId); o.setSalesId(5L); }));
detailMapper.deleteByLineId(lineId);
List result = detailMapper.selectListByLineId(lineId);
assertTrue(result.isEmpty(), "同 lineId 下的所有记录均应被删除");
}
// ==================== deleteBySalesId ====================
@Test
public void testDeleteBySalesId_deletesOnlyTargetSales() {
Long salesId = 700L;
MesWmProductSalesDetailDO toDelete = createDetailPojo(o -> {
o.setSalesId(salesId);
o.setLineId(6L);
});
MesWmProductSalesDetailDO toKeep = createDetailPojo(o -> {
o.setSalesId(800L);
o.setLineId(7L);
});
detailMapper.insert(toDelete);
detailMapper.insert(toKeep);
detailMapper.deleteBySalesId(salesId);
// salesId=700 的记录已被逻辑删除
List deletedResult = detailMapper.selectListBySalesId(salesId);
assertTrue(deletedResult.isEmpty(), "salesId=700 的记录应被删除");
// salesId=800 的记录保留
List keptResult = detailMapper.selectListBySalesId(800L);
assertEquals(1, keptResult.size());
}
@Test
public void testDeleteBySalesId_multipleRows() {
Long salesId = 900L;
detailMapper.insert(createDetailPojo(o -> { o.setSalesId(salesId); o.setLineId(8L); }));
detailMapper.insert(createDetailPojo(o -> { o.setSalesId(salesId); o.setLineId(9L); }));
detailMapper.insert(createDetailPojo(o -> { o.setSalesId(salesId); o.setLineId(10L); }));
detailMapper.deleteBySalesId(salesId);
List result = detailMapper.selectListBySalesId(salesId);
assertTrue(result.isEmpty(), "同 salesId 下的所有记录均应被删除");
}
}