Commit 734236df97c99526f3a1d1c4cb3ce941bfe5f553

Authored by YunaiV
1 parent bc2aa78f

trade:创建订单接口的后端实现的单元测试 100%

yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/order/TradeOrderDO.java
... ... @@ -116,7 +116,7 @@ public class TradeOrderDO extends BaseDO {
116 116 /**
117 117 * 商品原价(总),单位:分
118 118 *
119   - * 基于 {@link TradeOrderItemDO#getTotalOriginalPrice()} 求和
  119 + * 基于 {@link TradeOrderItemDO#getOriginalPrice()} 求和
120 120 *
121 121 * 对应 taobao 的 trade.total_fee 字段
122 122 */
... ... @@ -207,7 +207,7 @@ public class TradeOrderDO extends BaseDO {
207 207 /**
208 208 * 收件人地区编号
209 209 */
210   - private Integer receiverAreaId;
  210 + private Long receiverAreaId;
211 211 /**
212 212 * 收件人邮编
213 213 */
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/order/TradeOrderItemDO.java
1 1 package cn.iocoder.yudao.module.trade.dal.dataobject.order;
2 2  
  3 +import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
3 4 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
4 5 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderItemRefundStatusEnum;
5 6 import com.baomidou.mybatisplus.annotation.TableField;
6 7 import com.baomidou.mybatisplus.annotation.TableName;
7   -import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
  8 +import com.baomidou.mybatisplus.extension.handlers.AbstractJsonTypeHandler;
8 9 import lombok.Data;
9 10 import lombok.EqualsAndHashCode;
10 11 import lombok.experimental.Accessors;
... ... @@ -16,7 +17,7 @@ import java.util.List;
16 17 *
17 18 * @author 芋道源码
18 19 */
19   -@TableName(value = "trade_order_item")
  20 +@TableName(value = "trade_order_item", autoResultMap = true)
20 21 @Data
21 22 @Accessors(chain = true)
22 23 @EqualsAndHashCode(callSuper = true)
... ... @@ -56,7 +57,7 @@ public class TradeOrderItemDO extends BaseDO {
56 57 /**
57 58 * 规格值数组,JSON 格式
58 59 */
59   - @TableField(typeHandler = JacksonTypeHandler.class)
  60 + @TableField(typeHandler = PropertyTypeHandler.class)
60 61 private List<Property> properties;
61 62 /**
62 63 * 商品名称
... ... @@ -173,5 +174,20 @@ public class TradeOrderItemDO extends BaseDO {
173 174  
174 175 }
175 176  
  177 + // TODO @芋艿:可以找一些新的思路
  178 + public static class PropertyTypeHandler extends AbstractJsonTypeHandler<List<Property>> {
  179 +
  180 + @Override
  181 + protected List<Property> parse(String json) {
  182 + return JsonUtils.parseArray(json, Property.class);
  183 + }
  184 +
  185 + @Override
  186 + protected String toJson(List<Property> obj) {
  187 + return JsonUtils.toJsonString(obj);
  188 + }
  189 +
  190 + }
  191 +
176 192 }
177 193  
... ...
yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderServiceTest.java
1 1 package cn.iocoder.yudao.module.trade.service.order;
2 2  
3 3 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
  4 +import cn.iocoder.yudao.framework.common.enums.TerminalEnum;
4 5 import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
5 6 import cn.iocoder.yudao.module.member.api.address.AddressApi;
6 7 import cn.iocoder.yudao.module.member.api.address.dto.AddressRespDTO;
... ... @@ -13,8 +14,14 @@ import cn.iocoder.yudao.module.product.enums.spu.ProductSpuStatusEnum;
13 14 import cn.iocoder.yudao.module.promotion.api.price.PriceApi;
14 15 import cn.iocoder.yudao.module.promotion.api.price.dto.PriceCalculateRespDTO;
15 16 import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderCreateReqVO;
  17 +import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
  18 +import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
16 19 import cn.iocoder.yudao.module.trade.dal.mysql.order.TradeOrderMapper;
17 20 import cn.iocoder.yudao.module.trade.dal.mysql.orderitem.TradeOrderItemMapper;
  21 +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderItemRefundStatusEnum;
  22 +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderRefundStatusEnum;
  23 +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderStatusEnum;
  24 +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;
18 25 import cn.iocoder.yudao.module.trade.framework.order.config.TradeOrderConfig;
19 26 import org.junit.jupiter.api.Test;
20 27 import org.springframework.boot.test.mock.mockito.MockBean;
... ... @@ -22,10 +29,12 @@ import org.springframework.context.annotation.Import;
22 29  
23 30 import javax.annotation.Resource;
24 31 import java.util.Arrays;
  32 +import java.util.List;
25 33  
26 34 import static cn.iocoder.yudao.framework.common.util.collection.SetUtils.asSet;
27 35 import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
28   -import static org.junit.jupiter.api.Assertions.assertEquals;
  36 +import static java.util.Collections.singletonList;
  37 +import static org.junit.jupiter.api.Assertions.*;
29 38 import static org.mockito.ArgumentMatchers.argThat;
30 39 import static org.mockito.ArgumentMatchers.eq;
31 40 import static org.mockito.Mockito.when;
... ... @@ -66,16 +75,18 @@ class TradeOrderServiceTest extends BaseDbUnitTest {
66 75 public void testCreateTradeOrder_success() {
67 76 // 准备参数
68 77 Long userId = 100L;
69   - String clientIp = "127.0.0.1";
  78 + String userIp = "127.0.0.1";
70 79 AppTradeOrderCreateReqVO reqVO = new AppTradeOrderCreateReqVO()
71 80 .setAddressId(10L).setCouponId(101L).setRemark("我是备注").setFromCart(true)
72 81 .setItems(Arrays.asList(new AppTradeOrderCreateReqVO.Item().setSkuId(1L).setCount(3),
73 82 new AppTradeOrderCreateReqVO.Item().setSkuId(2L).setCount(4)));
74 83 // mock 方法(商品 SKU 检查)
75 84 ProductSkuRespDTO sku01 = randomPojo(ProductSkuRespDTO.class, o -> o.setId(1L).setSpuId(11L)
76   - .setPrice(50).setStock(100).setStatus(CommonStatusEnum.ENABLE.getStatus()));
  85 + .setPrice(50).setStock(100).setStatus(CommonStatusEnum.ENABLE.getStatus())
  86 + .setProperties(singletonList(new ProductSkuRespDTO.Property().setPropertyId(111L).setValueId(222L))));
77 87 ProductSkuRespDTO sku02 = randomPojo(ProductSkuRespDTO.class, o -> o.setId(2L).setSpuId(21L)
78   - .setPrice(20).setStock(50).setStatus(CommonStatusEnum.ENABLE.getStatus()));
  88 + .setPrice(20).setStock(50).setStatus(CommonStatusEnum.ENABLE.getStatus()))
  89 + .setProperties(singletonList(new ProductSkuRespDTO.Property().setPropertyId(333L).setValueId(444L)));
79 90 when(productSkuApi.getSkuList(eq(asSet(1L, 2L)))).thenReturn(Arrays.asList(sku01, sku02));
80 91 // mock 方法(商品 SPU 检查)
81 92 ProductSpuRespDTO spu01 = randomPojo(ProductSpuRespDTO.class, o -> o.setId(11L)
... ... @@ -109,35 +120,94 @@ class TradeOrderServiceTest extends BaseDbUnitTest {
109 120 }))).thenReturn(new PriceCalculateRespDTO().setOrder(priceOrder));
110 121  
111 122 // 调用方法
112   - Long tradeOrderId = tradeOrderService.createTradeOrder(userId, clientIp, reqVO);
113   - System.out.println(tradeOrderId);
114   -
115   -// // mock 价格信息
116   -// PriceCalculateRespDTO calculateRespDTO = randomPojo(PriceCalculateRespDTO.class, priceCalculateRespDTO -> {
117   -// PriceCalculateRespDTO.OrderItem item = priceCalculateRespDTO.getOrder().getItems().get(0);
118   -// item.setSkuId(1L);
119   -// item.setCount(2);
120   -// priceCalculateRespDTO.getOrder().setItems(Collections.singletonList(item));
121   -// });
122   -// when(priceApi.calculatePrice(any())).thenReturn(calculateRespDTO);
  123 + Long tradeOrderId = tradeOrderService.createTradeOrder(userId, userIp, reqVO);
  124 + // 断言 TradeOrderDO 订单
  125 + List<TradeOrderDO> tradeOrderDOs = tradeOrderMapper.selectList();
  126 + assertEquals(tradeOrderDOs.size(), 1);
  127 + TradeOrderDO tradeOrderDO = tradeOrderDOs.get(0);
  128 + assertEquals(tradeOrderDO.getId(), tradeOrderId);
  129 + assertNotNull(tradeOrderDO.getNo());
  130 + assertEquals(tradeOrderDO.getType(), TradeOrderTypeEnum.NORMAL.getType());
  131 + assertEquals(tradeOrderDO.getTerminal(), TerminalEnum.H5.getTerminal());
  132 + assertEquals(tradeOrderDO.getUserId(), userId);
  133 + assertEquals(tradeOrderDO.getUserIp(), userIp);
  134 + assertEquals(tradeOrderDO.getStatus(), TradeOrderStatusEnum.WAITING_PAYMENT.getStatus());
  135 + assertEquals(tradeOrderDO.getProductCount(), 7);
  136 + assertNull(tradeOrderDO.getFinishTime());
  137 + assertNull(tradeOrderDO.getCancelTime());
  138 + assertNull(tradeOrderDO.getCancelType());
  139 + assertEquals(tradeOrderDO.getUserRemark(), "我是备注");
  140 + assertNull(tradeOrderDO.getRemark());
  141 + assertFalse(tradeOrderDO.getPayed());
  142 + assertNull(tradeOrderDO.getPayTime());
  143 + assertEquals(tradeOrderDO.getOriginalPrice(), 230);
  144 + assertEquals(tradeOrderDO.getOrderPrice(), 100);
  145 + assertEquals(tradeOrderDO.getDiscountPrice(), 0);
  146 + assertEquals(tradeOrderDO.getAdjustPrice(), 0);
  147 + assertEquals(tradeOrderDO.getPayPrice(), 80);
  148 + assertNull(tradeOrderDO.getPayOrderId());
  149 + assertNull(tradeOrderDO.getPayChannel());
  150 + assertNull(tradeOrderDO.getDeliveryTemplateId());
  151 + assertNull(tradeOrderDO.getExpressNo());
  152 + assertFalse(tradeOrderDO.getDeliveryStatus());
  153 + assertNull(tradeOrderDO.getDeliveryTime());
  154 + assertNull(tradeOrderDO.getReceiveTime());
  155 + assertEquals(tradeOrderDO.getReceiverName(), "芋艿");
  156 + assertEquals(tradeOrderDO.getReceiverMobile(), "15601691300");
  157 + assertEquals(tradeOrderDO.getReceiverAreaId(), 3306L);
  158 + assertEquals(tradeOrderDO.getReceiverPostCode(), 85757);
  159 + assertEquals(tradeOrderDO.getReceiverDetailAddress(), "土豆村");
  160 + assertEquals(tradeOrderDO.getRefundStatus(), TradeOrderRefundStatusEnum.NONE.getStatus());
  161 + assertEquals(tradeOrderDO.getRefundPrice(), 0);
  162 + assertEquals(tradeOrderDO.getCouponPrice(), 30);
  163 + assertEquals(tradeOrderDO.getPointPrice(), 10);
  164 + // 断言 TradeOrderItemDO 订单(第 1 个)
  165 + List<TradeOrderItemDO> tradeOrderItemDOs = tradeOrderItemMapper.selectList();
  166 + assertEquals(tradeOrderItemDOs.size(), 2);
  167 + TradeOrderItemDO tradeOrderItemDO01 = tradeOrderItemDOs.get(0);
  168 + assertNotNull(tradeOrderItemDO01.getId());
  169 + assertEquals(tradeOrderItemDO01.getUserId(), userId);
  170 + assertEquals(tradeOrderItemDO01.getOrderId(), tradeOrderId);
  171 + assertEquals(tradeOrderItemDO01.getSpuId(), 11L);
  172 + assertEquals(tradeOrderItemDO01.getSkuId(), 1L);
  173 + assertEquals(tradeOrderItemDO01.getProperties().size(), 1);
  174 + assertEquals(tradeOrderItemDO01.getProperties().get(0).getPropertyId(), 111L);
  175 + assertEquals(tradeOrderItemDO01.getProperties().get(0).getValueId(), 222L);
  176 + assertEquals(tradeOrderItemDO01.getName(), sku01.getName());
  177 + assertEquals(tradeOrderItemDO01.getPicUrl(), sku01.getPicUrl());
  178 + assertEquals(tradeOrderItemDO01.getCount(), 3);
  179 + assertEquals(tradeOrderItemDO01.getOriginalPrice(), 150);
  180 + assertEquals(tradeOrderItemDO01.getOriginalUnitPrice(), 50);
  181 + assertEquals(tradeOrderItemDO01.getDiscountPrice(), 20);
  182 + assertEquals(tradeOrderItemDO01.getPayPrice(), 130);
  183 + assertEquals(tradeOrderItemDO01.getOrderPartPrice(), 7);
  184 + assertEquals(tradeOrderItemDO01.getOrderDividePrice(), 35);
  185 + assertEquals(tradeOrderItemDO01.getRefundStatus(), TradeOrderItemRefundStatusEnum.NONE.getStatus());
  186 + assertEquals(tradeOrderItemDO01.getRefundTotal(), 0);
  187 + // 断言 TradeOrderItemDO 订单(第 2 个)
  188 + TradeOrderItemDO tradeOrderItemDO02 = tradeOrderItemDOs.get(1);
  189 + assertNotNull(tradeOrderItemDO02.getId());
  190 + assertEquals(tradeOrderItemDO02.getUserId(), userId);
  191 + assertEquals(tradeOrderItemDO02.getOrderId(), tradeOrderId);
  192 + assertEquals(tradeOrderItemDO02.getSpuId(), 21L);
  193 + assertEquals(tradeOrderItemDO02.getSkuId(), 2L);
  194 + assertEquals(tradeOrderItemDO02.getProperties().size(), 1);
  195 + assertEquals(tradeOrderItemDO02.getProperties().get(0).getPropertyId(), 333L);
  196 + assertEquals(tradeOrderItemDO02.getProperties().get(0).getValueId(), 444L);
  197 + assertEquals(tradeOrderItemDO02.getName(), sku02.getName());
  198 + assertEquals(tradeOrderItemDO02.getPicUrl(), sku02.getPicUrl());
  199 + assertEquals(tradeOrderItemDO02.getCount(), 4);
  200 + assertEquals(tradeOrderItemDO02.getOriginalPrice(), 80);
  201 + assertEquals(tradeOrderItemDO02.getOriginalUnitPrice(), 20);
  202 + assertEquals(tradeOrderItemDO02.getDiscountPrice(), 40);
  203 + assertEquals(tradeOrderItemDO02.getPayPrice(), 40);
  204 + assertEquals(tradeOrderItemDO02.getOrderPartPrice(), 15);
  205 + assertEquals(tradeOrderItemDO02.getOrderDividePrice(), 25);
  206 + assertEquals(tradeOrderItemDO02.getRefundStatus(), TradeOrderItemRefundStatusEnum.NONE.getStatus());
  207 + assertEquals(tradeOrderItemDO02.getRefundTotal(), 0);
123 208 // //mock 支付订单信息
124 209 // when(payOrderApi.createPayOrder(any())).thenReturn(1L);
125 210  
126   -
127   -// // 创建交易订单,支付订单记录
128   -// Long payOrderId = tradeOrderService.createTradeOrder(1L, "127.0.0.1", tradeOrderCreateReqVO);
129   -// //断言交易订单
130   -// TradeOrderDO tradeOrderDO = tradeOrderMapper.selectOne(TradeOrderDO::getUserId, 1L);
131   -// assertNotNull(tradeOrderDO);
132   -// //价格&用户
133   -// assertEquals(calculateRespDTO.getOrder().getPayPrice(), tradeOrderDO.getPayPrice());
134   -// assertEquals(1L, tradeOrderDO.getUserId());
135   -// //断言交易订单项
136   -// TradeOrderItemDO tradeOrderItemDO = tradeOrderItemMapper.selectOne(TradeOrderItemDO::getOrderId, tradeOrderDO.getId());
137   -// assertNotNull(tradeOrderDO);
138   -// //商品&用户
139   -// assertEquals(skuInfoRespDTO.getId(), tradeOrderItemDO.getSkuId());
140   -// assertEquals(1L, tradeOrderItemDO.getUserId());
141 211 // //价格
142 212 // assertEquals(calculateRespDTO.getOrder().getItems().get(0).getPresentPrice(), tradeOrderItemDO.getPresentPrice());
143 213 }
... ...
yudao-module-mall/yudao-module-trade-biz/src/test/resources/sql/create_tables.sql
... ... @@ -22,7 +22,7 @@ CREATE TABLE IF NOT EXISTS &quot;trade_order&quot; (
22 22 "pay_price" int NOT NULL,
23 23 "pay_order_id" int,
24 24 "pay_channel" int,
25   - "delivery_templateid" int,
  25 + "delivery_template_id" int,
26 26 "express_no" int,
27 27 "delivery_status" bit NOT NULL,
28 28 "delivery_time" datetime,
... ...