Commit 73a781cbbe42373184d82503aeac8767225d8d0e
1 parent
0d08c814
mall + trade:增加 TradeRewardActivityPriceCalculatorTest 的单元测试
Showing
3 changed files
with
234 additions
and
178 deletions
yudao-module-mall/yudao-module-promotion-biz/src/test/java/cn/iocoder/yudao/module/promotion/service/price/PriceServiceTest.java
| 1 | package cn.iocoder.yudao.module.promotion.service.price; | 1 | package cn.iocoder.yudao.module.promotion.service.price; |
| 2 | 2 | ||
| 3 | -import cn.hutool.core.map.MapUtil; | ||
| 4 | import cn.iocoder.yudao.framework.common.exception.ServiceException; | 3 | import cn.iocoder.yudao.framework.common.exception.ServiceException; |
| 5 | import cn.iocoder.yudao.framework.test.core.ut.BaseMockitoUnitTest; | 4 | import cn.iocoder.yudao.framework.test.core.ut.BaseMockitoUnitTest; |
| 6 | import cn.iocoder.yudao.module.product.api.sku.ProductSkuApi; | 5 | import cn.iocoder.yudao.module.product.api.sku.ProductSkuApi; |
| 7 | import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuRespDTO; | 6 | import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuRespDTO; |
| 8 | import cn.iocoder.yudao.module.promotion.api.price.dto.CouponMeetRespDTO; | 7 | import cn.iocoder.yudao.module.promotion.api.price.dto.CouponMeetRespDTO; |
| 9 | import cn.iocoder.yudao.module.promotion.api.price.dto.PriceCalculateReqDTO; | 8 | import cn.iocoder.yudao.module.promotion.api.price.dto.PriceCalculateReqDTO; |
| 10 | -import cn.iocoder.yudao.module.promotion.api.price.dto.PriceCalculateRespDTO; | ||
| 11 | import cn.iocoder.yudao.module.promotion.dal.dataobject.coupon.CouponDO; | 9 | import cn.iocoder.yudao.module.promotion.dal.dataobject.coupon.CouponDO; |
| 12 | -import cn.iocoder.yudao.module.promotion.dal.dataobject.reward.RewardActivityDO; | ||
| 13 | -import cn.iocoder.yudao.module.promotion.enums.common.*; | 10 | +import cn.iocoder.yudao.module.promotion.enums.common.PromotionProductScopeEnum; |
| 14 | import cn.iocoder.yudao.module.promotion.enums.coupon.CouponStatusEnum; | 11 | import cn.iocoder.yudao.module.promotion.enums.coupon.CouponStatusEnum; |
| 15 | import cn.iocoder.yudao.module.promotion.service.coupon.CouponService; | 12 | import cn.iocoder.yudao.module.promotion.service.coupon.CouponService; |
| 16 | -import cn.iocoder.yudao.module.promotion.service.discount.DiscountActivityService; | ||
| 17 | -import cn.iocoder.yudao.module.promotion.service.discount.bo.DiscountProductDetailBO; | ||
| 18 | import cn.iocoder.yudao.module.promotion.service.reward.RewardActivityService; | 13 | import cn.iocoder.yudao.module.promotion.service.reward.RewardActivityService; |
| 19 | import org.junit.jupiter.api.Test; | 14 | import org.junit.jupiter.api.Test; |
| 20 | import org.mockito.InjectMocks; | 15 | import org.mockito.InjectMocks; |
| 21 | import org.mockito.Mock; | 16 | import org.mockito.Mock; |
| 22 | 17 | ||
| 23 | -import java.util.LinkedHashMap; | ||
| 24 | import java.util.List; | 18 | import java.util.List; |
| 25 | -import java.util.Map; | ||
| 26 | -import java.util.Set; | ||
| 27 | 19 | ||
| 28 | import static cn.iocoder.yudao.framework.common.util.collection.SetUtils.asSet; | 20 | import static cn.iocoder.yudao.framework.common.util.collection.SetUtils.asSet; |
| 29 | import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; | 21 | import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; |
| 30 | -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId; | ||
| 31 | import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; | 22 | import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; |
| 32 | import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.COUPON_VALID_TIME_NOT_NOW; | 23 | import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.COUPON_VALID_TIME_NOT_NOW; |
| 33 | import static java.util.Arrays.asList; | 24 | import static java.util.Arrays.asList; |
| @@ -55,178 +46,11 @@ public class PriceServiceTest extends BaseMockitoUnitTest { | @@ -55,178 +46,11 @@ public class PriceServiceTest extends BaseMockitoUnitTest { | ||
| 55 | private ProductSkuApi productSkuApi; | 46 | private ProductSkuApi productSkuApi; |
| 56 | 47 | ||
| 57 | /** | 48 | /** |
| 58 | - * 测试满减送活动,匹配的情况 | ||
| 59 | - */ | ||
| 60 | - @Test | ||
| 61 | - public void testCalculatePrice_rewardActivity() { | ||
| 62 | - // 准备参数 | ||
| 63 | - PriceCalculateReqDTO calculateReqDTO = new PriceCalculateReqDTO().setUserId(randomLongId()) | ||
| 64 | - .setItems(asList(new PriceCalculateReqDTO.Item().setSkuId(10L).setCount(2), | ||
| 65 | - new PriceCalculateReqDTO.Item().setSkuId(20L).setCount(3), | ||
| 66 | - new PriceCalculateReqDTO.Item().setSkuId(30L).setCount(4))); | ||
| 67 | - // mock 方法(商品 SKU 信息) | ||
| 68 | - ProductSkuRespDTO productSku01 = randomPojo(ProductSkuRespDTO.class, o -> o.setId(10L).setPrice(100).setSpuId(1L)); | ||
| 69 | - ProductSkuRespDTO productSku02 = randomPojo(ProductSkuRespDTO.class, o -> o.setId(20L).setPrice(50).setSpuId(2L)); | ||
| 70 | - ProductSkuRespDTO productSku03 = randomPojo(ProductSkuRespDTO.class, o -> o.setId(30L).setPrice(30).setSpuId(3L)); | ||
| 71 | - when(productSkuApi.getSkuList(eq(asSet(10L, 20L, 30L)))).thenReturn(asList(productSku01, productSku02, productSku03)); | ||
| 72 | - // mock 方法(限时折扣 DiscountActivity 信息) | ||
| 73 | - RewardActivityDO rewardActivity01 = randomPojo(RewardActivityDO.class, o -> o.setId(1000L).setName("活动 1000 号") | ||
| 74 | - .setProductSpuIds(asList(10L, 20L)).setConditionType(PromotionConditionTypeEnum.PRICE.getType()) | ||
| 75 | - .setRules(singletonList(new RewardActivityDO.Rule().setLimit(200).setDiscountPrice(70)))); | ||
| 76 | - RewardActivityDO rewardActivity02 = randomPojo(RewardActivityDO.class, o -> o.setId(2000L).setName("活动 2000 号") | ||
| 77 | - .setProductSpuIds(singletonList(30L)).setConditionType(PromotionConditionTypeEnum.COUNT.getType()) | ||
| 78 | - .setRules(asList(new RewardActivityDO.Rule().setLimit(1).setDiscountPrice(10), | ||
| 79 | - new RewardActivityDO.Rule().setLimit(2).setDiscountPrice(60), // 最大可满足,因为是 4 个 | ||
| 80 | - new RewardActivityDO.Rule().setLimit(10).setDiscountPrice(100)))); | ||
| 81 | - Map<RewardActivityDO, Set<Long>> matchRewardActivities = new LinkedHashMap<>(); | ||
| 82 | - matchRewardActivities.put(rewardActivity01, asSet(1L, 2L)); | ||
| 83 | - matchRewardActivities.put(rewardActivity02, asSet(3L)); | ||
| 84 | - when(rewardActivityService.getMatchRewardActivities(eq(asSet(1L, 2L, 3L)))).thenReturn(matchRewardActivities); | ||
| 85 | - | ||
| 86 | - // 调用 | ||
| 87 | - PriceCalculateRespDTO priceCalculate = priceService.calculatePrice(calculateReqDTO); | ||
| 88 | - // 断言 Order 部分 | ||
| 89 | - PriceCalculateRespDTO.Order order = priceCalculate.getOrder(); | ||
| 90 | - assertEquals(order.getTotalPrice(), 470); | ||
| 91 | - assertEquals(order.getDiscountPrice(), 130); | ||
| 92 | - assertEquals(order.getPointPrice(), 0); | ||
| 93 | - assertEquals(order.getDeliveryPrice(), 0); | ||
| 94 | - assertEquals(order.getPayPrice(), 340); | ||
| 95 | - assertNull(order.getCouponId()); | ||
| 96 | - // 断言 OrderItem 部分 | ||
| 97 | - assertEquals(order.getItems().size(), 3); | ||
| 98 | - PriceCalculateRespDTO.OrderItem orderItem01 = order.getItems().get(0); | ||
| 99 | - assertEquals(orderItem01.getSkuId(), 10L); | ||
| 100 | - assertEquals(orderItem01.getCount(), 2); | ||
| 101 | - assertEquals(orderItem01.getOriginalPrice(), 200); | ||
| 102 | - assertEquals(orderItem01.getOriginalUnitPrice(), 100); | ||
| 103 | - assertEquals(orderItem01.getDiscountPrice(), 0); | ||
| 104 | - assertEquals(orderItem01.getPayPrice(), 200); | ||
| 105 | - assertEquals(orderItem01.getOrderPartPrice(), 40); | ||
| 106 | - assertEquals(orderItem01.getOrderDividePrice(), 160); | ||
| 107 | - PriceCalculateRespDTO.OrderItem orderItem02 = order.getItems().get(1); | ||
| 108 | - assertEquals(orderItem02.getSkuId(), 20L); | ||
| 109 | - assertEquals(orderItem02.getCount(), 3); | ||
| 110 | - assertEquals(orderItem02.getOriginalPrice(), 150); | ||
| 111 | - assertEquals(orderItem02.getOriginalUnitPrice(), 50); | ||
| 112 | - assertEquals(orderItem02.getDiscountPrice(), 0); | ||
| 113 | - assertEquals(orderItem02.getPayPrice(), 150); | ||
| 114 | - assertEquals(orderItem02.getOrderPartPrice(), 30); | ||
| 115 | - assertEquals(orderItem02.getOrderDividePrice(), 120); | ||
| 116 | - PriceCalculateRespDTO.OrderItem orderItem03 = order.getItems().get(2); | ||
| 117 | - assertEquals(orderItem03.getSkuId(), 30L); | ||
| 118 | - assertEquals(orderItem03.getCount(), 4); | ||
| 119 | - assertEquals(orderItem03.getOriginalPrice(), 120); | ||
| 120 | - assertEquals(orderItem03.getOriginalUnitPrice(), 30); | ||
| 121 | - assertEquals(orderItem03.getDiscountPrice(), 0); | ||
| 122 | - assertEquals(orderItem03.getPayPrice(), 120); | ||
| 123 | - assertEquals(orderItem03.getOrderPartPrice(), 60); | ||
| 124 | - assertEquals(orderItem03.getOrderDividePrice(), 60); | ||
| 125 | - // 断言 Promotion 部分(第一个) | ||
| 126 | - assertEquals(priceCalculate.getPromotions().size(), 2); | ||
| 127 | - PriceCalculateRespDTO.Promotion promotion01 = priceCalculate.getPromotions().get(0); | ||
| 128 | - assertEquals(promotion01.getId(), 1000L); | ||
| 129 | - assertEquals(promotion01.getName(), "活动 1000 号"); | ||
| 130 | - assertEquals(promotion01.getType(), PromotionTypeEnum.REWARD_ACTIVITY.getType()); | ||
| 131 | - assertEquals(promotion01.getTotalPrice(), 350); | ||
| 132 | - assertEquals(promotion01.getDiscountPrice(), 70); | ||
| 133 | - assertTrue(promotion01.getMatch()); | ||
| 134 | - assertEquals(promotion01.getDescription(), "满减送:省 0.70 元"); | ||
| 135 | - assertEquals(promotion01.getItems().size(), 2); | ||
| 136 | - PriceCalculateRespDTO.PromotionItem promotionItem011 = promotion01.getItems().get(0); | ||
| 137 | - assertEquals(promotionItem011.getSkuId(), 10L); | ||
| 138 | - assertEquals(promotionItem011.getOriginalPrice(), 200); | ||
| 139 | - assertEquals(promotionItem011.getDiscountPrice(), 40); | ||
| 140 | - PriceCalculateRespDTO.PromotionItem promotionItem012 = promotion01.getItems().get(1); | ||
| 141 | - assertEquals(promotionItem012.getSkuId(), 20L); | ||
| 142 | - assertEquals(promotionItem012.getOriginalPrice(), 150); | ||
| 143 | - assertEquals(promotionItem012.getDiscountPrice(), 30); | ||
| 144 | - // 断言 Promotion 部分(第二个) | ||
| 145 | - PriceCalculateRespDTO.Promotion promotion02 = priceCalculate.getPromotions().get(1); | ||
| 146 | - assertEquals(promotion02.getId(), 2000L); | ||
| 147 | - assertEquals(promotion02.getName(), "活动 2000 号"); | ||
| 148 | - assertEquals(promotion02.getType(), PromotionTypeEnum.REWARD_ACTIVITY.getType()); | ||
| 149 | - assertEquals(promotion02.getTotalPrice(), 120); | ||
| 150 | - assertEquals(promotion02.getDiscountPrice(), 60); | ||
| 151 | - assertTrue(promotion02.getMatch()); | ||
| 152 | - assertEquals(promotion02.getDescription(), "满减送:省 0.60 元"); | ||
| 153 | - PriceCalculateRespDTO.PromotionItem promotionItem02 = promotion02.getItems().get(0); | ||
| 154 | - assertEquals(promotion02.getItems().size(), 1); | ||
| 155 | - assertEquals(promotionItem02.getSkuId(), 30L); | ||
| 156 | - assertEquals(promotionItem02.getOriginalPrice(), 120); | ||
| 157 | - assertEquals(promotionItem02.getDiscountPrice(), 60); | ||
| 158 | - } | ||
| 159 | - | ||
| 160 | - /** | ||
| 161 | * 测试满减送活动,不匹配的情况 | 49 | * 测试满减送活动,不匹配的情况 |
| 162 | */ | 50 | */ |
| 163 | @Test | 51 | @Test |
| 164 | public void testCalculatePrice_rewardActivityNotMeet() { | 52 | public void testCalculatePrice_rewardActivityNotMeet() { |
| 165 | - // 准备参数 | ||
| 166 | - PriceCalculateReqDTO calculateReqDTO = new PriceCalculateReqDTO().setUserId(randomLongId()) | ||
| 167 | - .setItems(asList(new PriceCalculateReqDTO.Item().setSkuId(10L).setCount(2), | ||
| 168 | - new PriceCalculateReqDTO.Item().setSkuId(20L).setCount(3))); | ||
| 169 | - // mock 方法(商品 SKU 信息) | ||
| 170 | - ProductSkuRespDTO productSku01 = randomPojo(ProductSkuRespDTO.class, o -> o.setId(10L).setPrice(100).setSpuId(1L)); | ||
| 171 | - ProductSkuRespDTO productSku02 = randomPojo(ProductSkuRespDTO.class, o -> o.setId(20L).setPrice(50).setSpuId(2L)); | ||
| 172 | - when(productSkuApi.getSkuList(eq(asSet(10L, 20L)))).thenReturn(asList(productSku01, productSku02)); | ||
| 173 | - // mock 方法(限时折扣 DiscountActivity 信息) | ||
| 174 | - RewardActivityDO rewardActivity01 = randomPojo(RewardActivityDO.class, o -> o.setId(1000L).setName("活动 1000 号") | ||
| 175 | - .setProductSpuIds(asList(10L, 20L)).setConditionType(PromotionConditionTypeEnum.PRICE.getType()) | ||
| 176 | - .setRules(singletonList(new RewardActivityDO.Rule().setLimit(351).setDiscountPrice(70)))); | ||
| 177 | - Map<RewardActivityDO, Set<Long>> matchRewardActivities = new LinkedHashMap<>(); | ||
| 178 | - matchRewardActivities.put(rewardActivity01, asSet(1L, 2L)); | ||
| 179 | - when(rewardActivityService.getMatchRewardActivities(eq(asSet(1L, 2L)))).thenReturn(matchRewardActivities); | ||
| 180 | 53 | ||
| 181 | - // 调用 | ||
| 182 | - PriceCalculateRespDTO priceCalculate = priceService.calculatePrice(calculateReqDTO); | ||
| 183 | - // 断言 Order 部分 | ||
| 184 | - PriceCalculateRespDTO.Order order = priceCalculate.getOrder(); | ||
| 185 | - assertEquals(order.getTotalPrice(), 350); | ||
| 186 | - assertEquals(order.getDiscountPrice(), 0); | ||
| 187 | - assertEquals(order.getPointPrice(), 0); | ||
| 188 | - assertEquals(order.getDeliveryPrice(), 0); | ||
| 189 | - assertEquals(order.getPayPrice(), 350); | ||
| 190 | - assertNull(order.getCouponId()); | ||
| 191 | - // 断言 OrderItem 部分 | ||
| 192 | - assertEquals(order.getItems().size(), 2); | ||
| 193 | - PriceCalculateRespDTO.OrderItem orderItem01 = order.getItems().get(0); | ||
| 194 | - assertEquals(orderItem01.getSkuId(), 10L); | ||
| 195 | - assertEquals(orderItem01.getCount(), 2); | ||
| 196 | - assertEquals(orderItem01.getOriginalPrice(), 200); | ||
| 197 | - assertEquals(orderItem01.getOriginalUnitPrice(), 100); | ||
| 198 | - assertEquals(orderItem01.getDiscountPrice(), 0); | ||
| 199 | - assertEquals(orderItem01.getPayPrice(), 200); | ||
| 200 | - assertEquals(orderItem01.getOrderPartPrice(), 0); | ||
| 201 | - assertEquals(orderItem01.getOrderDividePrice(), 200); | ||
| 202 | - PriceCalculateRespDTO.OrderItem orderItem02 = order.getItems().get(1); | ||
| 203 | - assertEquals(orderItem02.getSkuId(), 20L); | ||
| 204 | - assertEquals(orderItem02.getCount(), 3); | ||
| 205 | - assertEquals(orderItem02.getOriginalPrice(), 150); | ||
| 206 | - assertEquals(orderItem02.getOriginalUnitPrice(), 50); | ||
| 207 | - assertEquals(orderItem02.getDiscountPrice(), 0); | ||
| 208 | - assertEquals(orderItem02.getPayPrice(), 150); | ||
| 209 | - assertEquals(orderItem02.getOrderPartPrice(), 0); | ||
| 210 | - assertEquals(orderItem02.getOrderDividePrice(), 150); | ||
| 211 | - // 断言 Promotion 部分 | ||
| 212 | - assertEquals(priceCalculate.getPromotions().size(), 1); | ||
| 213 | - PriceCalculateRespDTO.Promotion promotion01 = priceCalculate.getPromotions().get(0); | ||
| 214 | - assertEquals(promotion01.getId(), 1000L); | ||
| 215 | - assertEquals(promotion01.getName(), "活动 1000 号"); | ||
| 216 | - assertEquals(promotion01.getType(), PromotionTypeEnum.REWARD_ACTIVITY.getType()); | ||
| 217 | - assertEquals(promotion01.getTotalPrice(), 350); | ||
| 218 | - assertEquals(promotion01.getDiscountPrice(), 0); | ||
| 219 | - assertFalse(promotion01.getMatch()); | ||
| 220 | - assertEquals(promotion01.getDescription(), "TODO"); // TODO 芋艿:后面再想想 | ||
| 221 | - assertEquals(promotion01.getItems().size(), 2); | ||
| 222 | - PriceCalculateRespDTO.PromotionItem promotionItem011 = promotion01.getItems().get(0); | ||
| 223 | - assertEquals(promotionItem011.getSkuId(), 10L); | ||
| 224 | - assertEquals(promotionItem011.getOriginalPrice(), 200); | ||
| 225 | - assertEquals(promotionItem011.getDiscountPrice(), 0); | ||
| 226 | - PriceCalculateRespDTO.PromotionItem promotionItem012 = promotion01.getItems().get(1); | ||
| 227 | - assertEquals(promotionItem012.getSkuId(), 20L); | ||
| 228 | - assertEquals(promotionItem012.getOriginalPrice(), 150); | ||
| 229 | - assertEquals(promotionItem012.getDiscountPrice(), 0); | ||
| 230 | } | 54 | } |
| 231 | 55 | ||
| 232 | @Test | 56 | @Test |
yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeCouponPriceCalculatorTest.java
| @@ -27,7 +27,7 @@ import static org.mockito.Mockito.when; | @@ -27,7 +27,7 @@ import static org.mockito.Mockito.when; | ||
| 27 | * | 27 | * |
| 28 | * @author 芋道源码 | 28 | * @author 芋道源码 |
| 29 | */ | 29 | */ |
| 30 | -class TradeCouponPriceCalculatorTest extends BaseMockitoUnitTest { | 30 | +public class TradeCouponPriceCalculatorTest extends BaseMockitoUnitTest { |
| 31 | 31 | ||
| 32 | @InjectMocks | 32 | @InjectMocks |
| 33 | private TradeCouponPriceCalculator tradeCouponPriceCalculator; | 33 | private TradeCouponPriceCalculator tradeCouponPriceCalculator; |
yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeRewardActivityPriceCalculatorTest.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.trade.service.price.calculator; | ||
| 2 | + | ||
| 3 | +import cn.iocoder.yudao.framework.test.core.ut.BaseMockitoUnitTest; | ||
| 4 | +import cn.iocoder.yudao.module.promotion.api.reward.RewardActivityApi; | ||
| 5 | +import cn.iocoder.yudao.module.promotion.api.reward.dto.RewardActivityMatchRespDTO; | ||
| 6 | +import cn.iocoder.yudao.module.promotion.enums.common.PromotionConditionTypeEnum; | ||
| 7 | +import cn.iocoder.yudao.module.promotion.enums.common.PromotionTypeEnum; | ||
| 8 | +import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO; | ||
| 9 | +import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO; | ||
| 10 | +import org.junit.jupiter.api.Test; | ||
| 11 | +import org.mockito.InjectMocks; | ||
| 12 | +import org.mockito.Mock; | ||
| 13 | + | ||
| 14 | +import java.util.ArrayList; | ||
| 15 | + | ||
| 16 | +import static cn.iocoder.yudao.framework.common.util.collection.SetUtils.asSet; | ||
| 17 | +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; | ||
| 18 | +import static java.util.Arrays.asList; | ||
| 19 | +import static java.util.Collections.singletonList; | ||
| 20 | +import static org.junit.jupiter.api.Assertions.*; | ||
| 21 | +import static org.mockito.ArgumentMatchers.eq; | ||
| 22 | +import static org.mockito.Mockito.when; | ||
| 23 | + | ||
| 24 | +/** | ||
| 25 | + * {@link TradeRewardActivityPriceCalculator} 的单元测试类 | ||
| 26 | + * | ||
| 27 | + * @author 芋道源码 | ||
| 28 | + */ | ||
| 29 | +public class TradeRewardActivityPriceCalculatorTest extends BaseMockitoUnitTest { | ||
| 30 | + | ||
| 31 | + @InjectMocks | ||
| 32 | + private TradeRewardActivityPriceCalculator tradeRewardActivityPriceCalculator; | ||
| 33 | + | ||
| 34 | + @Mock | ||
| 35 | + private RewardActivityApi rewardActivityApi; | ||
| 36 | + | ||
| 37 | + @Test | ||
| 38 | + public void testCalculate_match() { | ||
| 39 | + // 准备参数 | ||
| 40 | + TradePriceCalculateReqBO param = new TradePriceCalculateReqBO() | ||
| 41 | + .setItems(asList( | ||
| 42 | + new TradePriceCalculateReqBO.Item().setSkuId(10L).setCount(2).setSelected(true), // 匹配活动 1 | ||
| 43 | + new TradePriceCalculateReqBO.Item().setSkuId(20L).setCount(3).setSelected(true), // 匹配活动 1 | ||
| 44 | + new TradePriceCalculateReqBO.Item().setSkuId(30L).setCount(4).setSelected(true) // 匹配活动 2 | ||
| 45 | + )); | ||
| 46 | + TradePriceCalculateRespBO result = new TradePriceCalculateRespBO() | ||
| 47 | + .setPrice(new TradePriceCalculateRespBO.Price()) | ||
| 48 | + .setPromotions(new ArrayList<>()) | ||
| 49 | + .setItems(asList( | ||
| 50 | + new TradePriceCalculateRespBO.OrderItem().setSkuId(10L).setCount(2).setSelected(true) | ||
| 51 | + .setPrice(100).setSpuId(1L), | ||
| 52 | + new TradePriceCalculateRespBO.OrderItem().setSkuId(20L).setCount(3).setSelected(true) | ||
| 53 | + .setPrice(50).setSpuId(2L), | ||
| 54 | + new TradePriceCalculateRespBO.OrderItem().setSkuId(30L).setCount(4).setSelected(true) | ||
| 55 | + .setPrice(30).setSpuId(3L) | ||
| 56 | + )); | ||
| 57 | + // 保证价格被初始化上 | ||
| 58 | + TradePriceCalculatorHelper.recountPayPrice(result.getItems()); | ||
| 59 | + TradePriceCalculatorHelper.recountAllPrice(result); | ||
| 60 | + | ||
| 61 | + // mock 方法(限时折扣 DiscountActivity 信息) | ||
| 62 | + when(rewardActivityApi.getMatchRewardActivityList(eq(asSet(1L, 2L, 3L)))).thenReturn(asList( | ||
| 63 | + randomPojo(RewardActivityMatchRespDTO.class, o -> o.setId(1000L).setName("活动 1000 号") | ||
| 64 | + .setSpuIds(asList(1L, 2L)).setConditionType(PromotionConditionTypeEnum.PRICE.getType()) | ||
| 65 | + .setRules(singletonList(new RewardActivityMatchRespDTO.Rule().setLimit(200).setDiscountPrice(70)))), | ||
| 66 | + randomPojo(RewardActivityMatchRespDTO.class, o -> o.setId(2000L).setName("活动 2000 号") | ||
| 67 | + .setSpuIds(singletonList(3L)).setConditionType(PromotionConditionTypeEnum.COUNT.getType()) | ||
| 68 | + .setRules(asList(new RewardActivityMatchRespDTO.Rule().setLimit(1).setDiscountPrice(10), | ||
| 69 | + new RewardActivityMatchRespDTO.Rule().setLimit(2).setDiscountPrice(60), // 最大可满足,因为是 4 个 | ||
| 70 | + new RewardActivityMatchRespDTO.Rule().setLimit(10).setDiscountPrice(100)))) | ||
| 71 | + )); | ||
| 72 | + | ||
| 73 | + // 调用 | ||
| 74 | + tradeRewardActivityPriceCalculator.calculate(param, result); | ||
| 75 | + // 断言 Order 部分 | ||
| 76 | + TradePriceCalculateRespBO.Price price = result.getPrice(); | ||
| 77 | + assertEquals(price.getTotalPrice(), 470); | ||
| 78 | + assertEquals(price.getDiscountPrice(), 130); | ||
| 79 | + assertEquals(price.getPointPrice(), 0); | ||
| 80 | + assertEquals(price.getDeliveryPrice(), 0); | ||
| 81 | + assertEquals(price.getCouponPrice(), 0); | ||
| 82 | + assertEquals(price.getPayPrice(), 340); | ||
| 83 | + assertNull(result.getCouponId()); | ||
| 84 | + // 断言:SKU 1 | ||
| 85 | + assertEquals(result.getItems().size(), 3); | ||
| 86 | + TradePriceCalculateRespBO.OrderItem orderItem01 = result.getItems().get(0); | ||
| 87 | + assertEquals(orderItem01.getSkuId(), 10L); | ||
| 88 | + assertEquals(orderItem01.getCount(), 2); | ||
| 89 | + assertEquals(orderItem01.getPrice(), 100); | ||
| 90 | + assertEquals(orderItem01.getDiscountPrice(), 40); | ||
| 91 | + assertEquals(orderItem01.getDeliveryPrice(), 0); | ||
| 92 | + assertEquals(orderItem01.getCouponPrice(), 0); | ||
| 93 | + assertEquals(orderItem01.getPointPrice(), 0); | ||
| 94 | + assertEquals(orderItem01.getPayPrice(), 160); | ||
| 95 | + // 断言:SKU 2 | ||
| 96 | + TradePriceCalculateRespBO.OrderItem orderItem02 = result.getItems().get(1); | ||
| 97 | + assertEquals(orderItem02.getSkuId(), 20L); | ||
| 98 | + assertEquals(orderItem02.getCount(), 3); | ||
| 99 | + assertEquals(orderItem02.getPrice(), 50); | ||
| 100 | + assertEquals(orderItem02.getDiscountPrice(), 30); | ||
| 101 | + assertEquals(orderItem02.getDeliveryPrice(), 0); | ||
| 102 | + assertEquals(orderItem02.getCouponPrice(), 0); | ||
| 103 | + assertEquals(orderItem02.getPointPrice(), 0); | ||
| 104 | + assertEquals(orderItem02.getPayPrice(), 120); | ||
| 105 | + // 断言:SKU 3 | ||
| 106 | + TradePriceCalculateRespBO.OrderItem orderItem03 = result.getItems().get(2); | ||
| 107 | + assertEquals(orderItem03.getSkuId(), 30L); | ||
| 108 | + assertEquals(orderItem03.getCount(), 4); | ||
| 109 | + assertEquals(orderItem03.getPrice(), 30); | ||
| 110 | + assertEquals(orderItem03.getDiscountPrice(), 60); | ||
| 111 | + assertEquals(orderItem03.getDeliveryPrice(), 0); | ||
| 112 | + assertEquals(orderItem03.getCouponPrice(), 0); | ||
| 113 | + assertEquals(orderItem03.getPointPrice(), 0); | ||
| 114 | + assertEquals(orderItem03.getPayPrice(), 60); | ||
| 115 | + // 断言:Promotion 部分(第一个) | ||
| 116 | + assertEquals(result.getPromotions().size(), 2); | ||
| 117 | + TradePriceCalculateRespBO.Promotion promotion01 = result.getPromotions().get(0); | ||
| 118 | + assertEquals(promotion01.getId(), 1000L); | ||
| 119 | + assertEquals(promotion01.getName(), "活动 1000 号"); | ||
| 120 | + assertEquals(promotion01.getType(), PromotionTypeEnum.REWARD_ACTIVITY.getType()); | ||
| 121 | + assertEquals(promotion01.getTotalPrice(), 350); | ||
| 122 | + assertEquals(promotion01.getDiscountPrice(), 70); | ||
| 123 | + assertTrue(promotion01.getMatch()); | ||
| 124 | + assertEquals(promotion01.getDescription(), "满减送:省 0.70 元"); | ||
| 125 | + assertEquals(promotion01.getItems().size(), 2); | ||
| 126 | + TradePriceCalculateRespBO.PromotionItem promotionItem011 = promotion01.getItems().get(0); | ||
| 127 | + assertEquals(promotionItem011.getSkuId(), 10L); | ||
| 128 | + assertEquals(promotionItem011.getTotalPrice(), 200); | ||
| 129 | + assertEquals(promotionItem011.getDiscountPrice(), 40); | ||
| 130 | + TradePriceCalculateRespBO.PromotionItem promotionItem012 = promotion01.getItems().get(1); | ||
| 131 | + assertEquals(promotionItem012.getSkuId(), 20L); | ||
| 132 | + assertEquals(promotionItem012.getTotalPrice(), 150); | ||
| 133 | + assertEquals(promotionItem012.getDiscountPrice(), 30); | ||
| 134 | + // 断言:Promotion 部分(第二个) | ||
| 135 | + TradePriceCalculateRespBO.Promotion promotion02 = result.getPromotions().get(1); | ||
| 136 | + assertEquals(promotion02.getId(), 2000L); | ||
| 137 | + assertEquals(promotion02.getName(), "活动 2000 号"); | ||
| 138 | + assertEquals(promotion02.getType(), PromotionTypeEnum.REWARD_ACTIVITY.getType()); | ||
| 139 | + assertEquals(promotion02.getTotalPrice(), 120); | ||
| 140 | + assertEquals(promotion02.getDiscountPrice(), 60); | ||
| 141 | + assertTrue(promotion02.getMatch()); | ||
| 142 | + assertEquals(promotion02.getDescription(), "满减送:省 0.60 元"); | ||
| 143 | + TradePriceCalculateRespBO.PromotionItem promotionItem02 = promotion02.getItems().get(0); | ||
| 144 | + assertEquals(promotion02.getItems().size(), 1); | ||
| 145 | + assertEquals(promotionItem02.getSkuId(), 30L); | ||
| 146 | + assertEquals(promotionItem02.getTotalPrice(), 120); | ||
| 147 | + assertEquals(promotionItem02.getDiscountPrice(), 60); | ||
| 148 | + } | ||
| 149 | + | ||
| 150 | + @Test | ||
| 151 | + public void testCalculate_notMatch() { | ||
| 152 | + // 准备参数 | ||
| 153 | + TradePriceCalculateReqBO param = new TradePriceCalculateReqBO() | ||
| 154 | + .setItems(asList( | ||
| 155 | + new TradePriceCalculateReqBO.Item().setSkuId(10L).setCount(2).setSelected(true), | ||
| 156 | + new TradePriceCalculateReqBO.Item().setSkuId(20L).setCount(3).setSelected(true), | ||
| 157 | + new TradePriceCalculateReqBO.Item().setSkuId(30L).setCount(4).setSelected(true) | ||
| 158 | + )); | ||
| 159 | + TradePriceCalculateRespBO result = new TradePriceCalculateRespBO() | ||
| 160 | + .setPrice(new TradePriceCalculateRespBO.Price()) | ||
| 161 | + .setPromotions(new ArrayList<>()) | ||
| 162 | + .setItems(asList( | ||
| 163 | + new TradePriceCalculateRespBO.OrderItem().setSkuId(10L).setCount(2).setSelected(true) | ||
| 164 | + .setPrice(100).setSpuId(1L), | ||
| 165 | + new TradePriceCalculateRespBO.OrderItem().setSkuId(20L).setCount(3).setSelected(true) | ||
| 166 | + .setPrice(50).setSpuId(2L) | ||
| 167 | + )); | ||
| 168 | + // 保证价格被初始化上 | ||
| 169 | + TradePriceCalculatorHelper.recountPayPrice(result.getItems()); | ||
| 170 | + TradePriceCalculatorHelper.recountAllPrice(result); | ||
| 171 | + | ||
| 172 | + // mock 方法(限时折扣 DiscountActivity 信息) | ||
| 173 | + when(rewardActivityApi.getMatchRewardActivityList(eq(asSet(1L, 2L)))).thenReturn(singletonList( | ||
| 174 | + randomPojo(RewardActivityMatchRespDTO.class, o -> o.setId(1000L).setName("活动 1000 号") | ||
| 175 | + .setSpuIds(asList(1L, 2L)).setConditionType(PromotionConditionTypeEnum.PRICE.getType()) | ||
| 176 | + .setRules(singletonList(new RewardActivityMatchRespDTO.Rule().setLimit(351).setDiscountPrice(70)))) | ||
| 177 | + )); | ||
| 178 | + | ||
| 179 | + // 调用 | ||
| 180 | + tradeRewardActivityPriceCalculator.calculate(param, result); | ||
| 181 | + // 断言 Order 部分 | ||
| 182 | + TradePriceCalculateRespBO.Price price = result.getPrice(); | ||
| 183 | + assertEquals(price.getTotalPrice(), 350); | ||
| 184 | + assertEquals(price.getDiscountPrice(), 0); | ||
| 185 | + assertEquals(price.getPointPrice(), 0); | ||
| 186 | + assertEquals(price.getDeliveryPrice(), 0); | ||
| 187 | + assertEquals(price.getCouponPrice(), 0); | ||
| 188 | + assertEquals(price.getPayPrice(), 350); | ||
| 189 | + assertNull(result.getCouponId()); | ||
| 190 | + // 断言:SKU 1 | ||
| 191 | + assertEquals(result.getItems().size(), 2); | ||
| 192 | + TradePriceCalculateRespBO.OrderItem orderItem01 = result.getItems().get(0); | ||
| 193 | + assertEquals(orderItem01.getSkuId(), 10L); | ||
| 194 | + assertEquals(orderItem01.getCount(), 2); | ||
| 195 | + assertEquals(orderItem01.getPrice(), 100); | ||
| 196 | + assertEquals(orderItem01.getDiscountPrice(), 0); | ||
| 197 | + assertEquals(orderItem01.getDeliveryPrice(), 0); | ||
| 198 | + assertEquals(orderItem01.getCouponPrice(), 0); | ||
| 199 | + assertEquals(orderItem01.getPointPrice(), 0); | ||
| 200 | + assertEquals(orderItem01.getPayPrice(), 200); | ||
| 201 | + // 断言:SKU 2 | ||
| 202 | + TradePriceCalculateRespBO.OrderItem orderItem02 = result.getItems().get(1); | ||
| 203 | + assertEquals(orderItem02.getSkuId(), 20L); | ||
| 204 | + assertEquals(orderItem02.getCount(), 3); | ||
| 205 | + assertEquals(orderItem02.getPrice(), 50); | ||
| 206 | + assertEquals(orderItem02.getDiscountPrice(), 0); | ||
| 207 | + assertEquals(orderItem02.getDeliveryPrice(), 0); | ||
| 208 | + assertEquals(orderItem02.getCouponPrice(), 0); | ||
| 209 | + assertEquals(orderItem02.getPointPrice(), 0); | ||
| 210 | + assertEquals(orderItem02.getPayPrice(), 150); | ||
| 211 | + // 断言 Promotion 部分 | ||
| 212 | + assertEquals(result.getPromotions().size(), 1); | ||
| 213 | + TradePriceCalculateRespBO.Promotion promotion01 = result.getPromotions().get(0); | ||
| 214 | + assertEquals(promotion01.getId(), 1000L); | ||
| 215 | + assertEquals(promotion01.getName(), "活动 1000 号"); | ||
| 216 | + assertEquals(promotion01.getType(), PromotionTypeEnum.REWARD_ACTIVITY.getType()); | ||
| 217 | + assertEquals(promotion01.getTotalPrice(), 350); | ||
| 218 | + assertEquals(promotion01.getDiscountPrice(), 0); | ||
| 219 | + assertFalse(promotion01.getMatch()); | ||
| 220 | + assertEquals(promotion01.getDescription(), "TODO"); // TODO 芋艿:后面再想想 | ||
| 221 | + assertEquals(promotion01.getItems().size(), 2); | ||
| 222 | + TradePriceCalculateRespBO.PromotionItem promotionItem011 = promotion01.getItems().get(0); | ||
| 223 | + assertEquals(promotionItem011.getSkuId(), 10L); | ||
| 224 | + assertEquals(promotionItem011.getTotalPrice(), 200); | ||
| 225 | + assertEquals(promotionItem011.getDiscountPrice(), 0); | ||
| 226 | + TradePriceCalculateRespBO.PromotionItem promotionItem012 = promotion01.getItems().get(1); | ||
| 227 | + assertEquals(promotionItem012.getSkuId(), 20L); | ||
| 228 | + assertEquals(promotionItem012.getTotalPrice(), 150); | ||
| 229 | + assertEquals(promotionItem012.getDiscountPrice(), 0); | ||
| 230 | + } | ||
| 231 | + | ||
| 232 | +} |