Commit abfebebdd5d3fd2f668dd5f71879d64f8bce1ebf

Authored by owen
1 parent afd306a7

交易:增加 积分抵扣计算器 单元测试

yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradePointUsePriceCalculator.java
... ... @@ -20,7 +20,6 @@ import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionU
20 20 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.filterList;
21 21 import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.PRICE_CALCULATE_PAY_PRICE_ILLEGAL;
22 22  
23   -// TODO @疯狂:搞个单测,嘿嘿;
24 23 /**
25 24 * 使用积分的 {@link TradePriceCalculator} 实现类
26 25 *
... ... @@ -38,6 +37,8 @@ public class TradePointUsePriceCalculator implements TradePriceCalculator {
38 37  
39 38 @Override
40 39 public void calculate(TradePriceCalculateReqBO param, TradePriceCalculateRespBO result) {
  40 + // 默认使用积分为 0
  41 + result.setUsePoint(0);
41 42 // 1.1 校验是否使用积分
42 43 if (!BooleanUtil.isTrue(param.getPointStatus())) {
43 44 result.setUsePoint(0);
... ... @@ -78,7 +79,7 @@ public class TradePointUsePriceCalculator implements TradePriceCalculator {
78 79  
79 80 private boolean isDeductPointEnable(MemberConfigRespDTO config) {
80 81 return config != null &&
81   - !BooleanUtil.isTrue(config.getPointTradeDeductEnable()) && // 积分功能是否启用
  82 + BooleanUtil.isTrue(config.getPointTradeDeductEnable()) && // 积分功能是否启用
82 83 config.getPointTradeDeductUnitPrice() != null && config.getPointTradeDeductUnitPrice() > 0; // 有没有配置:1 积分抵扣多少分
83 84 }
84 85  
... ...
yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradePointGiveCalculatorTest.java
... ... @@ -35,7 +35,7 @@ public class TradePointGiveCalculatorTest extends BaseMockitoUnitTest {
35 35  
36 36 // 准备参数
37 37 TradePriceCalculateReqBO param = new TradePriceCalculateReqBO()
38   - .setUserId(233L).setCouponId(1024L)
  38 + .setUserId(233L)
39 39 .setItems(asList(
40 40 new TradePriceCalculateReqBO.Item().setSkuId(10L).setCount(2).setSelected(true), // 全局积分
41 41 new TradePriceCalculateReqBO.Item().setSkuId(20L).setCount(3).setSelected(true), // 全局积分 + SKU 积分
... ... @@ -61,8 +61,9 @@ public class TradePointGiveCalculatorTest extends BaseMockitoUnitTest {
61 61 TradePriceCalculatorHelper.recountAllPrice(result);
62 62  
63 63 // mock 方法(积分配置 信息)
64   - MemberConfigRespDTO memberConfig = randomPojo(MemberConfigRespDTO.class, o -> o.setPointTradeDeductEnable(true)
65   - .setPointTradeGivePoint(100));
  64 + MemberConfigRespDTO memberConfig = randomPojo(MemberConfigRespDTO.class,
  65 + o -> o.setPointTradeDeductEnable(true) // 启用积分折扣
  66 + .setPointTradeGivePoint(100)); // 1 元赠送多少分
66 67 when(memberConfigApi.getConfig()).thenReturn(memberConfig);
67 68  
68 69 // 调用
... ...
yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradePointUsePriceCalculatorTest.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.member.api.config.MemberConfigApi;
  5 +import cn.iocoder.yudao.module.member.api.config.dto.MemberConfigRespDTO;
  6 +import cn.iocoder.yudao.module.member.api.user.MemberUserApi;
  7 +import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
  8 +import cn.iocoder.yudao.module.promotion.enums.common.PromotionTypeEnum;
  9 +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;
  10 +import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO;
  11 +import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO;
  12 +import org.junit.jupiter.api.Test;
  13 +import org.mockito.InjectMocks;
  14 +import org.mockito.Mock;
  15 +
  16 +import java.util.ArrayList;
  17 +
  18 +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
  19 +import static java.util.Arrays.asList;
  20 +import static org.junit.jupiter.api.Assertions.assertEquals;
  21 +import static org.junit.jupiter.api.Assertions.assertTrue;
  22 +import static org.mockito.Mockito.when;
  23 +
  24 +/**
  25 + * {@link TradePointUsePriceCalculator } 的单元测试类
  26 + *
  27 + * @author owen
  28 + */
  29 +public class TradePointUsePriceCalculatorTest extends BaseMockitoUnitTest {
  30 +
  31 + @InjectMocks
  32 + private TradePointUsePriceCalculator tradePointUsePriceCalculator;
  33 +
  34 + @Mock
  35 + private MemberConfigApi memberConfigApi;
  36 + @Mock
  37 + private MemberUserApi memberUserApi;
  38 +
  39 + @Test
  40 + public void testCalculate_success() {
  41 + // 准备参数
  42 + TradePriceCalculateReqBO param = new TradePriceCalculateReqBO()
  43 + .setUserId(233L).setPointStatus(true) // 是否使用积分
  44 + .setItems(asList(
  45 + new TradePriceCalculateReqBO.Item().setSkuId(10L).setCount(2).setSelected(true), // 使用积分
  46 + new TradePriceCalculateReqBO.Item().setSkuId(20L).setCount(3).setSelected(true), // 使用积分
  47 + new TradePriceCalculateReqBO.Item().setSkuId(30L).setCount(5).setSelected(false) // 未选中,不使用积分
  48 + ));
  49 + TradePriceCalculateRespBO result = new TradePriceCalculateRespBO()
  50 + .setType(TradeOrderTypeEnum.NORMAL.getType())
  51 + .setPrice(new TradePriceCalculateRespBO.Price())
  52 + .setPromotions(new ArrayList<>())
  53 + .setItems(asList(
  54 + new TradePriceCalculateRespBO.OrderItem().setSkuId(10L).setCount(2).setSelected(true)
  55 + .setPrice(100).setSpuId(1L),
  56 + new TradePriceCalculateRespBO.OrderItem().setSkuId(20L).setCount(3).setSelected(true)
  57 + .setPrice(50).setSpuId(2L),
  58 + new TradePriceCalculateRespBO.OrderItem().setSkuId(30L).setCount(5).setSelected(false)
  59 + .setPrice(30).setSpuId(3L)
  60 + ));
  61 + // 保证价格被初始化上
  62 + TradePriceCalculatorHelper.recountPayPrice(result.getItems());
  63 + TradePriceCalculatorHelper.recountAllPrice(result);
  64 +
  65 + // mock 方法(积分配置 信息)
  66 + MemberConfigRespDTO memberConfig = randomPojo(MemberConfigRespDTO.class,
  67 + o -> o.setPointTradeDeductEnable(true) // 启用积分折扣
  68 + .setPointTradeDeductUnitPrice(1) // 1 积分抵扣多少金额(单位分)
  69 + .setPointTradeDeductMaxPrice(100)); // 积分抵扣最大值
  70 + when(memberConfigApi.getConfig()).thenReturn(memberConfig);
  71 + // mock 方法(会员 信息)
  72 + MemberUserRespDTO user = randomPojo(MemberUserRespDTO.class, o -> o.setId(param.getUserId()).setPoint(100));
  73 + when(memberUserApi.getUser(user.getId())).thenReturn(user);
  74 +
  75 + // 调用
  76 + tradePointUsePriceCalculator.calculate(param, result);
  77 + // 断言:使用了多少积分
  78 + assertEquals(result.getUsePoint(), 100);
  79 + // 断言:Price 部分
  80 + TradePriceCalculateRespBO.Price price = result.getPrice();
  81 + assertEquals(price.getTotalPrice(), 350);
  82 + assertEquals(price.getPayPrice(), 250);
  83 + assertEquals(price.getPointPrice(), 100);
  84 + // 断言:SKU 1
  85 + TradePriceCalculateRespBO.OrderItem orderItem01 = result.getItems().get(0);
  86 + assertEquals(orderItem01.getSkuId(), 10L);
  87 + assertEquals(orderItem01.getCount(), 2);
  88 + assertEquals(orderItem01.getPrice(), 100);
  89 + assertEquals(orderItem01.getPointPrice(), 57);
  90 + assertEquals(orderItem01.getPayPrice(), 143);
  91 + // 断言:SKU 2
  92 + TradePriceCalculateRespBO.OrderItem orderItem02 = result.getItems().get(1);
  93 + assertEquals(orderItem02.getSkuId(), 20L);
  94 + assertEquals(orderItem02.getCount(), 3);
  95 + assertEquals(orderItem02.getPrice(), 50);
  96 + assertEquals(orderItem02.getPointPrice(), 43);
  97 + assertEquals(orderItem02.getPayPrice(), 107);
  98 + // 断言:SKU 3
  99 + TradePriceCalculateRespBO.OrderItem orderItem03 = result.getItems().get(2);
  100 + assertEquals(orderItem03.getSkuId(), 30L);
  101 + assertEquals(orderItem03.getCount(), 5);
  102 + assertEquals(orderItem03.getPrice(), 30);
  103 + assertEquals(orderItem03.getPointPrice(), 0);
  104 + assertEquals(orderItem03.getPayPrice(), 150);
  105 + // 断言:Promotion 部分
  106 + assertEquals(result.getPromotions().size(), 1);
  107 + TradePriceCalculateRespBO.Promotion promotion01 = result.getPromotions().get(0);
  108 + assertEquals(promotion01.getId(), user.getId());
  109 + assertEquals(promotion01.getName(), "积分抵扣");
  110 + assertEquals(promotion01.getType(), PromotionTypeEnum.POINT.getType());
  111 + assertEquals(promotion01.getTotalPrice(), 350);
  112 + assertEquals(promotion01.getDiscountPrice(), 100);
  113 + assertTrue(promotion01.getMatch());
  114 + assertEquals(promotion01.getDescription(), "积分抵扣:省 1.00 元");
  115 + assertEquals(promotion01.getItems().size(), 2);
  116 + TradePriceCalculateRespBO.PromotionItem promotionItem011 = promotion01.getItems().get(0);
  117 + assertEquals(promotionItem011.getSkuId(), 10L);
  118 + assertEquals(promotionItem011.getTotalPrice(), 200);
  119 + assertEquals(promotionItem011.getDiscountPrice(), 57);
  120 + TradePriceCalculateRespBO.PromotionItem promotionItem012 = promotion01.getItems().get(1);
  121 + assertEquals(promotionItem012.getSkuId(), 20L);
  122 + assertEquals(promotionItem012.getTotalPrice(), 150);
  123 + assertEquals(promotionItem012.getDiscountPrice(), 43);
  124 + }
  125 +
  126 + /**
  127 + * 当用户积分充足时,抵扣的金额为:配置表的“积分抵扣最大值”
  128 + */
  129 + @Test
  130 + public void testCalculate_TradeDeductMaxPrice() {
  131 + // 准备参数
  132 + TradePriceCalculateReqBO param = new TradePriceCalculateReqBO()
  133 + .setUserId(233L).setPointStatus(true) // 是否使用积分
  134 + .setItems(asList(
  135 + new TradePriceCalculateReqBO.Item().setSkuId(10L).setCount(2).setSelected(true), // 使用积分
  136 + new TradePriceCalculateReqBO.Item().setSkuId(20L).setCount(3).setSelected(true), // 使用积分
  137 + new TradePriceCalculateReqBO.Item().setSkuId(30L).setCount(5).setSelected(false) // 未选中,不使用积分
  138 + ));
  139 + TradePriceCalculateRespBO result = new TradePriceCalculateRespBO()
  140 + .setType(TradeOrderTypeEnum.NORMAL.getType())
  141 + .setPrice(new TradePriceCalculateRespBO.Price())
  142 + .setPromotions(new ArrayList<>())
  143 + .setItems(asList(
  144 + new TradePriceCalculateRespBO.OrderItem().setSkuId(10L).setCount(2).setSelected(true)
  145 + .setPrice(100).setSpuId(1L),
  146 + new TradePriceCalculateRespBO.OrderItem().setSkuId(20L).setCount(3).setSelected(true)
  147 + .setPrice(50).setSpuId(2L),
  148 + new TradePriceCalculateRespBO.OrderItem().setSkuId(30L).setCount(5).setSelected(false)
  149 + .setPrice(30).setSpuId(3L)
  150 + ));
  151 + // 保证价格被初始化上
  152 + TradePriceCalculatorHelper.recountPayPrice(result.getItems());
  153 + TradePriceCalculatorHelper.recountAllPrice(result);
  154 +
  155 + // mock 方法(积分配置 信息)
  156 + MemberConfigRespDTO memberConfig = randomPojo(MemberConfigRespDTO.class,
  157 + o -> o.setPointTradeDeductEnable(true) // 启用积分折扣
  158 + .setPointTradeDeductUnitPrice(1) // 1 积分抵扣多少金额(单位分)
  159 + .setPointTradeDeductMaxPrice(50)); // 积分抵扣最大值
  160 + when(memberConfigApi.getConfig()).thenReturn(memberConfig);
  161 + // mock 方法(会员 信息)
  162 + MemberUserRespDTO user = randomPojo(MemberUserRespDTO.class, o -> o.setId(param.getUserId()).setPoint(100));
  163 + when(memberUserApi.getUser(user.getId())).thenReturn(user);
  164 +
  165 + // 调用
  166 + tradePointUsePriceCalculator.calculate(param, result);
  167 + // 断言:使用了多少积分
  168 + assertEquals(result.getUsePoint(), 50);
  169 + // 断言:Price 部分
  170 + TradePriceCalculateRespBO.Price price = result.getPrice();
  171 + assertEquals(price.getTotalPrice(), 350);
  172 + assertEquals(price.getPayPrice(), 300);
  173 + assertEquals(price.getPointPrice(), 50);
  174 + // 断言:SKU 1
  175 + TradePriceCalculateRespBO.OrderItem orderItem01 = result.getItems().get(0);
  176 + assertEquals(orderItem01.getSkuId(), 10L);
  177 + assertEquals(orderItem01.getCount(), 2);
  178 + assertEquals(orderItem01.getPrice(), 100);
  179 + assertEquals(orderItem01.getPointPrice(), 28);
  180 + assertEquals(orderItem01.getPayPrice(), 172);
  181 + // 断言:SKU 2
  182 + TradePriceCalculateRespBO.OrderItem orderItem02 = result.getItems().get(1);
  183 + assertEquals(orderItem02.getSkuId(), 20L);
  184 + assertEquals(orderItem02.getCount(), 3);
  185 + assertEquals(orderItem02.getPrice(), 50);
  186 + assertEquals(orderItem02.getPointPrice(), 22);
  187 + assertEquals(orderItem02.getPayPrice(), 128);
  188 + // 断言:SKU 3
  189 + TradePriceCalculateRespBO.OrderItem orderItem03 = result.getItems().get(2);
  190 + assertEquals(orderItem03.getSkuId(), 30L);
  191 + assertEquals(orderItem03.getCount(), 5);
  192 + assertEquals(orderItem03.getPrice(), 30);
  193 + assertEquals(orderItem03.getPointPrice(), 0);
  194 + assertEquals(orderItem03.getPayPrice(), 150);
  195 + // 断言:Promotion 部分
  196 + assertEquals(result.getPromotions().size(), 1);
  197 + TradePriceCalculateRespBO.Promotion promotion01 = result.getPromotions().get(0);
  198 + assertEquals(promotion01.getId(), user.getId());
  199 + assertEquals(promotion01.getName(), "积分抵扣");
  200 + assertEquals(promotion01.getType(), PromotionTypeEnum.POINT.getType());
  201 + assertEquals(promotion01.getTotalPrice(), 350);
  202 + assertEquals(promotion01.getDiscountPrice(), 50);
  203 + assertTrue(promotion01.getMatch());
  204 + assertEquals(promotion01.getDescription(), "积分抵扣:省 0.50 元");
  205 + assertEquals(promotion01.getItems().size(), 2);
  206 + TradePriceCalculateRespBO.PromotionItem promotionItem011 = promotion01.getItems().get(0);
  207 + assertEquals(promotionItem011.getSkuId(), 10L);
  208 + assertEquals(promotionItem011.getTotalPrice(), 200);
  209 + assertEquals(promotionItem011.getDiscountPrice(), 28);
  210 + TradePriceCalculateRespBO.PromotionItem promotionItem012 = promotion01.getItems().get(1);
  211 + assertEquals(promotionItem012.getSkuId(), 20L);
  212 + assertEquals(promotionItem012.getTotalPrice(), 150);
  213 + assertEquals(promotionItem012.getDiscountPrice(), 22);
  214 + }
  215 +
  216 + /**
  217 + * 订单不使用积分,不会产生优惠
  218 + */
  219 + @Test
  220 + public void testCalculate_PointStatusFalse() {
  221 + // 准备参数
  222 + TradePriceCalculateReqBO param = new TradePriceCalculateReqBO()
  223 + .setUserId(233L).setPointStatus(false) // 是否使用积分
  224 + .setItems(asList(
  225 + new TradePriceCalculateReqBO.Item().setSkuId(10L).setCount(2).setSelected(true), // 使用积分
  226 + new TradePriceCalculateReqBO.Item().setSkuId(20L).setCount(3).setSelected(true), // 使用积分
  227 + new TradePriceCalculateReqBO.Item().setSkuId(30L).setCount(5).setSelected(false) // 未选中,不使用积分
  228 + ));
  229 + TradePriceCalculateRespBO result = new TradePriceCalculateRespBO()
  230 + .setType(TradeOrderTypeEnum.NORMAL.getType())
  231 + .setPrice(new TradePriceCalculateRespBO.Price())
  232 + .setPromotions(new ArrayList<>())
  233 + .setItems(asList(
  234 + new TradePriceCalculateRespBO.OrderItem().setSkuId(10L).setCount(2).setSelected(true)
  235 + .setPrice(100).setSpuId(1L),
  236 + new TradePriceCalculateRespBO.OrderItem().setSkuId(20L).setCount(3).setSelected(true)
  237 + .setPrice(50).setSpuId(2L),
  238 + new TradePriceCalculateRespBO.OrderItem().setSkuId(30L).setCount(5).setSelected(false)
  239 + .setPrice(30).setSpuId(3L)
  240 + ));
  241 + // 保证价格被初始化上
  242 + TradePriceCalculatorHelper.recountPayPrice(result.getItems());
  243 + TradePriceCalculatorHelper.recountAllPrice(result);
  244 +
  245 + // 调用
  246 + tradePointUsePriceCalculator.calculate(param, result);
  247 + // 断言:没有使用积分
  248 + assertNotUsePoint(result);
  249 + }
  250 +
  251 + /**
  252 + * 会员积分不足,不会产生优惠
  253 + */
  254 + @Test
  255 + public void testCalculate_UserPointNotEnough() {
  256 + // 准备参数
  257 + TradePriceCalculateReqBO param = new TradePriceCalculateReqBO()
  258 + .setUserId(233L).setPointStatus(true) // 是否使用积分
  259 + .setItems(asList(
  260 + new TradePriceCalculateReqBO.Item().setSkuId(10L).setCount(2).setSelected(true), // 使用积分
  261 + new TradePriceCalculateReqBO.Item().setSkuId(20L).setCount(3).setSelected(true), // 使用积分
  262 + new TradePriceCalculateReqBO.Item().setSkuId(30L).setCount(5).setSelected(false) // 未选中,不使用积分
  263 + ));
  264 + TradePriceCalculateRespBO result = new TradePriceCalculateRespBO()
  265 + .setType(TradeOrderTypeEnum.NORMAL.getType())
  266 + .setPrice(new TradePriceCalculateRespBO.Price())
  267 + .setPromotions(new ArrayList<>())
  268 + .setItems(asList(
  269 + new TradePriceCalculateRespBO.OrderItem().setSkuId(10L).setCount(2).setSelected(true)
  270 + .setPrice(100).setSpuId(1L),
  271 + new TradePriceCalculateRespBO.OrderItem().setSkuId(20L).setCount(3).setSelected(true)
  272 + .setPrice(50).setSpuId(2L),
  273 + new TradePriceCalculateRespBO.OrderItem().setSkuId(30L).setCount(5).setSelected(false)
  274 + .setPrice(30).setSpuId(3L)
  275 + ));
  276 + // 保证价格被初始化上
  277 + TradePriceCalculatorHelper.recountPayPrice(result.getItems());
  278 + TradePriceCalculatorHelper.recountAllPrice(result);
  279 +
  280 + // mock 方法(积分配置 信息)
  281 + MemberConfigRespDTO memberConfig = randomPojo(MemberConfigRespDTO.class,
  282 + o -> o.setPointTradeDeductEnable(true) // 启用积分折扣
  283 + .setPointTradeDeductUnitPrice(1) // 1 积分抵扣多少金额(单位分)
  284 + .setPointTradeDeductMaxPrice(100)); // 积分抵扣最大值
  285 + when(memberConfigApi.getConfig()).thenReturn(memberConfig);
  286 + // mock 方法(会员 信息)
  287 + MemberUserRespDTO user = randomPojo(MemberUserRespDTO.class, o -> o.setId(param.getUserId()).setPoint(0));
  288 + when(memberUserApi.getUser(user.getId())).thenReturn(user);
  289 +
  290 + // 调用
  291 + tradePointUsePriceCalculator.calculate(param, result);
  292 +
  293 + // 断言:没有使用积分
  294 + assertNotUsePoint(result);
  295 + }
  296 +
  297 + /**
  298 + * 断言:没有使用积分
  299 + */
  300 + private static void assertNotUsePoint(TradePriceCalculateRespBO result) {
  301 + // 断言:使用了多少积分
  302 + assertEquals(result.getUsePoint(), 0);
  303 + // 断言:Price 部分
  304 + TradePriceCalculateRespBO.Price price = result.getPrice();
  305 + assertEquals(price.getTotalPrice(), 350);
  306 + assertEquals(price.getPayPrice(), 350);
  307 + assertEquals(price.getPointPrice(), 0);
  308 + // 断言:SKU 1
  309 + TradePriceCalculateRespBO.OrderItem orderItem01 = result.getItems().get(0);
  310 + assertEquals(orderItem01.getSkuId(), 10L);
  311 + assertEquals(orderItem01.getCount(), 2);
  312 + assertEquals(orderItem01.getPrice(), 100);
  313 + assertEquals(orderItem01.getPointPrice(), 0);
  314 + assertEquals(orderItem01.getPayPrice(), 200);
  315 + // 断言:SKU 2
  316 + TradePriceCalculateRespBO.OrderItem orderItem02 = result.getItems().get(1);
  317 + assertEquals(orderItem02.getSkuId(), 20L);
  318 + assertEquals(orderItem02.getCount(), 3);
  319 + assertEquals(orderItem02.getPrice(), 50);
  320 + assertEquals(orderItem02.getPointPrice(), 0);
  321 + assertEquals(orderItem02.getPayPrice(), 150);
  322 + // 断言:SKU 3
  323 + TradePriceCalculateRespBO.OrderItem orderItem03 = result.getItems().get(2);
  324 + assertEquals(orderItem03.getSkuId(), 30L);
  325 + assertEquals(orderItem03.getCount(), 5);
  326 + assertEquals(orderItem03.getPrice(), 30);
  327 + assertEquals(orderItem03.getPointPrice(), 0);
  328 + assertEquals(orderItem03.getPayPrice(), 150);
  329 + // 断言:Promotion 部分
  330 + assertEquals(result.getPromotions().size(), 0);
  331 + }
  332 +}
0 333 \ No newline at end of file
... ...