package cn.iocoder.yudao.module.promotion.service.reward; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.test.core.ut.BaseMockitoUnitTest; import cn.iocoder.yudao.module.product.api.category.ProductCategoryApi; import cn.iocoder.yudao.module.product.api.spu.ProductSpuApi; import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityCreateReqVO; import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityPageReqVO; import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityUpdateReqVO; import cn.iocoder.yudao.module.promotion.dal.dataobject.reward.RewardActivityDO; import cn.iocoder.yudao.module.promotion.dal.mysql.reward.RewardActivityMapper; import cn.iocoder.yudao.module.promotion.enums.common.PromotionConditionTypeEnum; import cn.iocoder.yudao.module.promotion.enums.common.PromotionProductScopeEnum; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Mock; import java.time.Duration; import static cn.hutool.core.util.RandomUtil.randomEle; import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.addTime; 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.AssertUtils.assertServiceException; import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId; import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.REWARD_ACTIVITY_NOT_EXISTS; import static org.junit.jupiter.api.Assertions.*; /** * {@link RewardActivityServiceImpl} 的单元测试类 * * @author 芋道源码 */ @Disabled // TODO 芋艿:后续 fix 补充的单测 public class RewardActivityServiceImplTest extends BaseMockitoUnitTest { @InjectMocks private RewardActivityServiceImpl rewardActivityServiceImpl; @Mock private RewardActivityMapper rewardActivityMapper; @Mock private ProductCategoryApi productCategoryApi; @Mock private ProductSpuApi productSpuApi; @Test public void testCreateRewardActivity_success() { // 准备参数 RewardActivityCreateReqVO reqVO = randomPojo(RewardActivityCreateReqVO.class, o -> { o.setConditionType(randomEle(PromotionConditionTypeEnum.values()).getType()); o.setProductScope(randomEle(PromotionProductScopeEnum.values()).getScope()); // 用于触发进行中的状态 o.setStartTime(addTime(Duration.ofDays(1))).setEndTime(addTime(Duration.ofDays(2))); }); // 调用 Long rewardActivityId = rewardActivityServiceImpl.createRewardActivity(reqVO); // 断言 assertNotNull(rewardActivityId); // 校验记录的属性是否正确 RewardActivityDO rewardActivity = rewardActivityMapper.selectById(rewardActivityId); assertPojoEquals(reqVO, rewardActivity, "rules"); assertEquals(rewardActivity.getStatus(), CommonStatusEnum.DISABLE.getStatus()); for (int i = 0; i < reqVO.getRules().size(); i++) { assertPojoEquals(reqVO.getRules().get(i), rewardActivity.getRules().get(i)); } } @Test public void testUpdateRewardActivity_success() { // mock 数据 RewardActivityDO dbRewardActivity = randomPojo(RewardActivityDO.class, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus())); rewardActivityMapper.insert(dbRewardActivity);// @Sql: 先插入出一条存在的数据 // 准备参数 RewardActivityUpdateReqVO reqVO = randomPojo(RewardActivityUpdateReqVO.class, o -> { o.setId(dbRewardActivity.getId()); // 设置更新的 ID o.setConditionType(randomEle(PromotionConditionTypeEnum.values()).getType()); o.setProductScope(randomEle(PromotionProductScopeEnum.values()).getScope()); // 用于触发进行中的状态 o.setStartTime(addTime(Duration.ofDays(1))).setEndTime(addTime(Duration.ofDays(2))); }); // 调用 rewardActivityServiceImpl.updateRewardActivity(reqVO); // 校验是否更新正确 RewardActivityDO rewardActivity = rewardActivityMapper.selectById(reqVO.getId()); // 获取最新的 assertPojoEquals(reqVO, rewardActivity, "rules"); assertEquals(rewardActivity.getStatus(), CommonStatusEnum.DISABLE.getStatus()); for (int i = 0; i < reqVO.getRules().size(); i++) { assertPojoEquals(reqVO.getRules().get(i), rewardActivity.getRules().get(i)); } } @Test public void testCloseRewardActivity() { // mock 数据 RewardActivityDO dbRewardActivity = randomPojo(RewardActivityDO.class, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus())); rewardActivityMapper.insert(dbRewardActivity);// @Sql: 先插入出一条存在的数据 // 准备参数 Long id = dbRewardActivity.getId(); // 调用 rewardActivityServiceImpl.closeRewardActivity(id); // 校验状态 RewardActivityDO rewardActivity = rewardActivityMapper.selectById(id); assertEquals(rewardActivity.getStatus(), CommonStatusEnum.DISABLE.getStatus()); } @Test public void testUpdateRewardActivity_notExists() { // 准备参数 RewardActivityUpdateReqVO reqVO = randomPojo(RewardActivityUpdateReqVO.class); // 调用, 并断言异常 assertServiceException(() -> rewardActivityServiceImpl.updateRewardActivity(reqVO), REWARD_ACTIVITY_NOT_EXISTS); } @Test public void testDeleteRewardActivity_success() { // mock 数据 RewardActivityDO dbRewardActivity = randomPojo(RewardActivityDO.class, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus())); rewardActivityMapper.insert(dbRewardActivity);// @Sql: 先插入出一条存在的数据 // 准备参数 Long id = dbRewardActivity.getId(); // 调用 rewardActivityServiceImpl.deleteRewardActivity(id); // 校验数据不存在了 assertNull(rewardActivityMapper.selectById(id)); } @Test public void testDeleteRewardActivity_notExists() { // 准备参数 Long id = randomLongId(); // 调用, 并断言异常 assertServiceException(() -> rewardActivityServiceImpl.deleteRewardActivity(id), REWARD_ACTIVITY_NOT_EXISTS); } @Test public void testGetRewardActivityPage() { // mock 数据 RewardActivityDO dbRewardActivity = randomPojo(RewardActivityDO.class, o -> { // 等会查询到 o.setName("芋艿"); o.setStatus(CommonStatusEnum.DISABLE.getStatus()); }); rewardActivityMapper.insert(dbRewardActivity); // 测试 name 不匹配 rewardActivityMapper.insert(cloneIgnoreId(dbRewardActivity, o -> o.setName("土豆"))); // 测试 status 不匹配 rewardActivityMapper.insert(cloneIgnoreId(dbRewardActivity, o -> o.setStatus(CommonStatusEnum.ENABLE.getStatus()))); // 准备参数 RewardActivityPageReqVO reqVO = new RewardActivityPageReqVO(); reqVO.setName("芋艿"); reqVO.setStatus(CommonStatusEnum.DISABLE.getStatus()); // 调用 PageResult pageResult = rewardActivityServiceImpl.getRewardActivityPage(reqVO); // 断言 assertEquals(1, pageResult.getTotal()); assertEquals(1, pageResult.getList().size()); assertPojoEquals(dbRewardActivity, pageResult.getList().get(0), "rules"); } // TODO 芋艿:后续完善单测 // @Test // public void testGetRewardActivities_all() { // LocalDateTime now = LocalDateTime.now(); // // mock 数据 // RewardActivityDO allActivity = randomPojo(RewardActivityDO.class, o -> o.setStatus(CommonStatusEnum.ENABLE.getStatus()) // .setProductScope(PromotionProductScopeEnum.ALL.getScope()).setStartTime(now.minusDays(1)).setEndTime(now.plusDays(1))); // rewardActivityMapper.insert(allActivity); // RewardActivityDO productActivity = randomPojo(RewardActivityDO.class, o -> o.setStatus(CommonStatusEnum.ENABLE.getStatus()) // .setProductScope(PromotionProductScopeEnum.SPU.getScope()).setProductScopeValues(asList(1L, 2L)) // .setStartTime(now.minusDays(1)).setEndTime(now.plusDays(1))); // rewardActivityMapper.insert(productActivity); // // 准备参数 // Set spuIds = asSet(1L, 2L); // // // 调用 // List activityList = rewardActivityServiceImpl.getRewardActivityListByStatusAndDateTimeLt( // CommonStatusEnum.ENABLE.getStatus(), now); // List matchRewardActivityList = filterMatchActivity(spuIds, activityList); // // 断言 // assertEquals(matchRewardActivityList.size(), 1); // matchRewardActivityList.forEach((activity) -> { // if (activity.getId().equals(productActivity.getId())) { // assertPojoEquals(activity, productActivity); // assertEquals(activity.getProductScopeValues(), asList(1L, 2L)); // } else { // fail(); // } // }); // } // // @Test // public void testGetRewardActivities_product() { // LocalDateTime now = LocalDateTime.now(); // // mock 数据 // RewardActivityDO productActivity01 = randomPojo(RewardActivityDO.class, o -> o.setStatus(CommonStatusEnum.ENABLE.getStatus()) // .setProductScope(PromotionProductScopeEnum.SPU.getScope()).setProductScopeValues(asList(1L, 2L)) // .setStartTime(now.minusDays(1)).setEndTime(now.plusDays(1))); // rewardActivityMapper.insert(productActivity01); // RewardActivityDO productActivity02 = randomPojo(RewardActivityDO.class, o -> o.setStatus(CommonStatusEnum.ENABLE.getStatus()) // .setProductScope(PromotionProductScopeEnum.SPU.getScope()).setProductScopeValues(singletonList(3L)) // .setStartTime(now.minusDays(1)).setEndTime(now.plusDays(1))); // rewardActivityMapper.insert(productActivity02); // // 准备参数 // Set spuIds = asSet(1L, 2L, 3L); // // List activityList = rewardActivityServiceImpl.getRewardActivityListByStatusAndDateTimeLt( // CommonStatusEnum.ENABLE.getStatus(), now); // List matchRewardActivityList = filterMatchActivity(spuIds, activityList); // // 断言 // assertEquals(matchRewardActivityList.size(), 2); // matchRewardActivityList.forEach((activity) -> { // if (activity.getId().equals(productActivity01.getId())) { // assertPojoEquals(activity, productActivity01); // assertEquals(activity.getProductScopeValues(), asList(1L, 2L)); // } else if (activity.getId().equals(productActivity02.getId())) { // assertPojoEquals(activity, productActivity02); // assertEquals(activity.getProductScopeValues(), singletonList(3L)); // } else { // fail(); // } // }); // } // // /** // * 获得满减送的订单项(商品)列表 // * // * @param spuIds 商品编号 // * @param activityList 活动列表 // * @return 订单项(商品)列表 // */ // private List filterMatchActivity(Collection spuIds, List activityList) { // List resultActivityList = new ArrayList<>(); // for (RewardActivityDO activity : activityList) { // // 情况一:全部商品都可以参与 // if (PromotionProductScopeEnum.isAll(activity.getProductScope())) { // resultActivityList.add(activity); // } // // 情况二:指定商品参与 // if (PromotionProductScopeEnum.isSpu(activity.getProductScope()) && // !intersectionDistinct(activity.getProductScopeValues(), spuIds).isEmpty()) { // resultActivityList.add(activity); // } // } // return resultActivityList; // } }