Commit cc853a2b92a30381a07f6d42b6d7737bff5f4f87

Authored by YunaiV
1 parent 15cca8f3

mall + pay:

1. 支付订单的状态同步 Job[单测]
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/order/PayOrderServiceImpl.java
@@ -40,7 +40,6 @@ import org.springframework.transaction.annotation.Transactional; @@ -40,7 +40,6 @@ import org.springframework.transaction.annotation.Transactional;
40 import org.springframework.validation.annotation.Validated; 40 import org.springframework.validation.annotation.Validated;
41 41
42 import javax.annotation.Resource; 42 import javax.annotation.Resource;
43 -import java.time.Duration;  
44 import java.time.LocalDateTime; 43 import java.time.LocalDateTime;
45 import java.util.List; 44 import java.util.List;
46 import java.util.Objects; 45 import java.util.Objects;
@@ -155,7 +154,6 @@ public class PayOrderServiceImpl implements PayOrderService { @@ -155,7 +154,6 @@ public class PayOrderServiceImpl implements PayOrderService {
155 .setReturnUrl(reqVO.getReturnUrl()) 154 .setReturnUrl(reqVO.getReturnUrl())
156 // 订单相关字段 155 // 订单相关字段
157 .setPrice(order.getPrice()).setExpireTime(order.getExpireTime()); 156 .setPrice(order.getPrice()).setExpireTime(order.getExpireTime());
158 - unifiedOrderReqDTO.setExpireTime(LocalDateTimeUtils.addTime(Duration.ofSeconds(70))); // TODO 芋艿:稍后删除掉  
159 PayOrderRespDTO unifiedOrderResp = client.unifiedOrder(unifiedOrderReqDTO); 157 PayOrderRespDTO unifiedOrderResp = client.unifiedOrder(unifiedOrderReqDTO);
160 158
161 // 4. 如果调用直接支付成功,则直接更新支付单状态为成功。例如说:付款码支付,免密支付时,就直接验证支付成功 159 // 4. 如果调用直接支付成功,则直接更新支付单状态为成功。例如说:付款码支付,免密支付时,就直接验证支付成功
yudao-module-pay/yudao-module-pay-biz/src/test/java/cn/iocoder/yudao/module/pay/service/order/PayOrderServiceTest.java
@@ -36,6 +36,7 @@ import org.springframework.context.annotation.Import; @@ -36,6 +36,7 @@ import org.springframework.context.annotation.Import;
36 36
37 import javax.annotation.Resource; 37 import javax.annotation.Resource;
38 import java.time.Duration; 38 import java.time.Duration;
  39 +import java.time.LocalDateTime;
39 import java.util.List; 40 import java.util.List;
40 41
41 import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.*; 42 import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.*;
@@ -849,4 +850,110 @@ public class PayOrderServiceTest extends BaseDbAndRedisUnitTest { @@ -849,4 +850,110 @@ public class PayOrderServiceTest extends BaseDbAndRedisUnitTest {
849 assertPojoEquals(dbOrderExtension, orderExtension); 850 assertPojoEquals(dbOrderExtension, orderExtension);
850 } 851 }
851 852
  853 + @Test
  854 + public void testSyncOrder_payClientNotFound() {
  855 + // 准备参数
  856 + LocalDateTime minCreateTime = LocalDateTime.now().minus(Duration.ofMinutes(10));
  857 + // mock 数据(PayOrderExtensionDO)
  858 + PayOrderExtensionDO orderExtension = randomPojo(PayOrderExtensionDO.class,
  859 + o -> o.setStatus(PayOrderStatusEnum.WAITING.getStatus())
  860 + .setCreateTime(LocalDateTime.now()));
  861 + orderExtensionMapper.insert(orderExtension);
  862 +
  863 + // 调用
  864 + int count = orderService.syncOrder(minCreateTime);
  865 + // 断言
  866 + assertEquals(count, 0);
  867 + }
  868 +
  869 + @Test
  870 + public void testSyncOrder_exception() {
  871 + // 准备参数
  872 + LocalDateTime minCreateTime = LocalDateTime.now().minus(Duration.ofMinutes(10));
  873 + // mock 数据(PayOrderExtensionDO)
  874 + PayOrderExtensionDO orderExtension = randomPojo(PayOrderExtensionDO.class,
  875 + o -> o.setStatus(PayOrderStatusEnum.WAITING.getStatus())
  876 + .setChannelId(10L)
  877 + .setCreateTime(LocalDateTime.now()));
  878 + orderExtensionMapper.insert(orderExtension);
  879 + // mock 方法(PayClient)
  880 + PayClient client = mock(PayClient.class);
  881 + when(payClientFactory.getPayClient(eq(10L))).thenReturn(client);
  882 + // mock 方法(PayClient 异常)
  883 + when(client.getOrder(any())).thenThrow(new RuntimeException());
  884 +
  885 + // 调用
  886 + int count = orderService.syncOrder(minCreateTime);
  887 + // 断言
  888 + assertEquals(count, 0);
  889 + }
  890 +
  891 + @Test
  892 + public void testSyncOrder_orderSuccess() {
  893 + PayOrderServiceImpl payOrderServiceImpl = mock(PayOrderServiceImpl.class);
  894 + try (MockedStatic<SpringUtil> springUtilMockedStatic = mockStatic(SpringUtil.class)) {
  895 + springUtilMockedStatic.when(() -> SpringUtil.getBean(eq(PayOrderServiceImpl.class)))
  896 + .thenReturn(payOrderServiceImpl);
  897 +
  898 + // 准备参数
  899 + LocalDateTime minCreateTime = LocalDateTime.now().minus(Duration.ofMinutes(10));
  900 + // mock 数据(PayOrderExtensionDO)
  901 + PayOrderExtensionDO orderExtension = randomPojo(PayOrderExtensionDO.class,
  902 + o -> o.setStatus(PayOrderStatusEnum.WAITING.getStatus())
  903 + .setChannelId(10L).setNo("P110")
  904 + .setCreateTime(LocalDateTime.now()));
  905 + orderExtensionMapper.insert(orderExtension);
  906 + // mock 方法(PayClient)
  907 + PayClient client = mock(PayClient.class);
  908 + when(payClientFactory.getPayClient(eq(10L))).thenReturn(client);
  909 + // mock 方法(PayClient 成功返回)
  910 + PayOrderRespDTO respDTO = randomPojo(PayOrderRespDTO.class,
  911 + o -> o.setStatus(PayOrderStatusEnum.SUCCESS.getStatus()));
  912 + when(client.getOrder(eq("P110"))).thenReturn(respDTO);
  913 + // mock 方法(PayChannelDO)
  914 + PayChannelDO channel = randomPojo(PayChannelDO.class, o -> o.setId(10L));
  915 + when(channelService.validPayChannel(eq(10L))).thenReturn(channel);
  916 +
  917 + // 调用
  918 + int count = orderService.syncOrder(minCreateTime);
  919 + // 断言
  920 + assertEquals(count, 1);
  921 + verify(payOrderServiceImpl).notifyOrder(same(channel), same(respDTO));
  922 + }
  923 + }
  924 +
  925 + @Test
  926 + public void testSyncOrder_orderClosed() {
  927 + PayOrderServiceImpl payOrderServiceImpl = mock(PayOrderServiceImpl.class);
  928 + try (MockedStatic<SpringUtil> springUtilMockedStatic = mockStatic(SpringUtil.class)) {
  929 + springUtilMockedStatic.when(() -> SpringUtil.getBean(eq(PayOrderServiceImpl.class)))
  930 + .thenReturn(payOrderServiceImpl);
  931 +
  932 + // 准备参数
  933 + LocalDateTime minCreateTime = LocalDateTime.now().minus(Duration.ofMinutes(10));
  934 + // mock 数据(PayOrderExtensionDO)
  935 + PayOrderExtensionDO orderExtension = randomPojo(PayOrderExtensionDO.class,
  936 + o -> o.setStatus(PayOrderStatusEnum.WAITING.getStatus())
  937 + .setChannelId(10L).setNo("P110")
  938 + .setCreateTime(LocalDateTime.now()));
  939 + orderExtensionMapper.insert(orderExtension);
  940 + // mock 方法(PayClient)
  941 + PayClient client = mock(PayClient.class);
  942 + when(payClientFactory.getPayClient(eq(10L))).thenReturn(client);
  943 + // mock 方法(PayClient 成功返回)
  944 + PayOrderRespDTO respDTO = randomPojo(PayOrderRespDTO.class,
  945 + o -> o.setStatus(PayOrderStatusEnum.CLOSED.getStatus()));
  946 + when(client.getOrder(eq("P110"))).thenReturn(respDTO);
  947 + // mock 方法(PayChannelDO)
  948 + PayChannelDO channel = randomPojo(PayChannelDO.class, o -> o.setId(10L));
  949 + when(channelService.validPayChannel(eq(10L))).thenReturn(channel);
  950 +
  951 + // 调用
  952 + int count = orderService.syncOrder(minCreateTime);
  953 + // 断言
  954 + assertEquals(count, 0);
  955 + verify(payOrderServiceImpl).notifyOrder(same(channel), same(respDTO));
  956 + }
  957 + }
  958 +
852 } 959 }