Prechádzať zdrojové kódy

支付宝 条码支付 Client 单元测试

jason 1 rok pred
rodič
commit
b119aadba5

+ 157 - 0
yudao-framework/yudao-spring-boot-starter-biz-pay/src/test/java/cn/iocoder/yudao/framework/pay/core/client/impl/alipay/AlipayBarPayClientTest.java

@@ -0,0 +1,157 @@
+package cn.iocoder.yudao.framework.pay.core.client.impl.alipay;
+
+import cn.hutool.core.date.LocalDateTimeUtil;
+import cn.iocoder.yudao.framework.common.exception.ServiceException;
+import cn.iocoder.yudao.framework.pay.core.client.dto.order.PayOrderRespDTO;
+import cn.iocoder.yudao.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO;
+import cn.iocoder.yudao.framework.pay.core.enums.order.PayOrderDisplayModeEnum;
+import cn.iocoder.yudao.framework.pay.core.enums.order.PayOrderStatusRespEnum;
+import com.alipay.api.AlipayApiException;
+import com.alipay.api.domain.AlipayTradePayModel;
+import com.alipay.api.request.AlipayTradePayRequest;
+import com.alipay.api.response.AlipayTradePayResponse;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+import org.mockito.ArgumentMatcher;
+import org.mockito.InjectMocks;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+import static cn.iocoder.yudao.framework.pay.core.enums.order.PayOrderStatusRespEnum.CLOSED;
+import static cn.iocoder.yudao.framework.pay.core.enums.order.PayOrderStatusRespEnum.WAITING;
+import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*;
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.ArgumentMatchers.argThat;
+import static org.mockito.Mockito.when;
+
+/**
+ * {@link  AlipayBarPayClient} 单元测试
+ *
+ * @author jason
+ */
+public class AlipayBarPayClientTest extends AbstractAlipayClientTest {
+
+    @InjectMocks
+    private AlipayBarPayClient client = new AlipayBarPayClient(randomLongId(), config);
+
+    @Override
+    @BeforeEach
+    public void setUp() {
+        setClient(client);
+    }
+
+    @Test
+    @DisplayName("支付宝条码支付,非免密码支付下单成功")
+    public void test_unified_order_success() throws AlipayApiException {
+        String outTradeNo = randomString();
+        String notifyUrl = randomURL();
+        Integer price = randomInteger();
+        String authCode = randomString();
+        // 准备返回对象
+        AlipayTradePayResponse response = randomPojo(AlipayTradePayResponse.class, o -> o.setSubCode(""));
+
+        // mock
+        when(defaultAlipayClient.execute(argThat((ArgumentMatcher<AlipayTradePayRequest>) request -> {
+            assertInstanceOf(AlipayTradePayModel.class, request.getBizModel());
+            assertEquals(notifyUrl, request.getNotifyUrl());
+            AlipayTradePayModel model = (AlipayTradePayModel) request.getBizModel();
+            assertEquals(outTradeNo, model.getOutTradeNo());
+            assertEquals(String.valueOf(price / 100.0), model.getTotalAmount());
+            assertEquals(authCode, model.getAuthCode());
+            return true;
+        }))).thenReturn(response);
+        // 准备请求参数
+        PayOrderUnifiedReqDTO reqDTO = buildOrderUnifiedReqDTO(notifyUrl, outTradeNo, price);
+        // 设置条码
+        Map<String, String> extraParam = new HashMap<>();
+        extraParam.put("auth_code", authCode);
+        reqDTO.setChannelExtras(extraParam);
+        // 下单请求
+        PayOrderRespDTO resp = client.unifiedOrder(reqDTO);
+        // 断言
+        assertEquals(WAITING.getStatus(), resp.getStatus());
+        assertEquals(PayOrderDisplayModeEnum.BAR_CODE.getMode(), resp.getDisplayMode());
+        assertEquals(outTradeNo, resp.getOutTradeNo());
+        assertEquals("", resp.getDisplayContent());
+        assertSame(response, resp.getRawData());
+    }
+
+    @Test
+    @DisplayName("支付宝条码支付,免密码支付下单成功")
+    public void test_unified_order_code_10000_success() throws AlipayApiException {
+        String outTradeNo = randomString();
+        String channelNo = randomString();
+        String channelUserId = randomString();
+        Date payTime = randomDate();
+        // 准备返回对象
+        AlipayTradePayResponse response = randomPojo(AlipayTradePayResponse.class, o -> {
+            o.setSubCode("");
+            o.setCode("10000");
+            o.setOutTradeNo(outTradeNo);
+            o.setTradeNo(channelNo);
+            o.setBuyerUserId(channelUserId);
+            o.setGmtPayment(payTime);
+        });
+        // mock
+        when(defaultAlipayClient.execute(argThat((ArgumentMatcher<AlipayTradePayRequest>) request -> true)))
+                .thenReturn(response);
+        // 准备请求参数
+        String authCode = randomString();
+        PayOrderUnifiedReqDTO reqDTO = buildOrderUnifiedReqDTO(randomURL(), outTradeNo, randomInteger());
+        // 设置条码
+        Map<String, String> extraParam = new HashMap<>();
+        extraParam.put("auth_code", authCode);
+        reqDTO.setChannelExtras(extraParam);
+        // 下单请求
+        PayOrderRespDTO resp = client.unifiedOrder(reqDTO);
+        // 断言
+        assertEquals(PayOrderStatusRespEnum.SUCCESS.getStatus(), resp.getStatus());
+        assertEquals(outTradeNo, resp.getOutTradeNo());
+        assertEquals(channelNo, resp.getChannelOrderNo());
+        assertEquals(channelUserId, resp.getChannelUserId());
+        assertEquals(LocalDateTimeUtil.of(payTime), resp.getSuccessTime());
+        assertSame(response, resp.getRawData());
+    }
+
+    @Test
+    @DisplayName("支付宝条码支付,没有传条码")
+    public void test_unified_order_empty_auth_code() {
+        PayOrderUnifiedReqDTO reqDTO = buildOrderUnifiedReqDTO(randomURL(), randomString(), randomInteger());
+        // 断言
+        assertThrows(ServiceException.class, () -> client.unifiedOrder(reqDTO));
+    }
+
+    @Test
+    @DisplayName("支付宝条码支付,渠道返回失败")
+    public void test_unified_order_channel_failed() throws AlipayApiException {
+        // 准备响应对象
+        String subCode = randomString();
+        String subMsg = randomString();
+        AlipayTradePayResponse response = randomPojo(AlipayTradePayResponse.class, o -> {
+            o.setSubCode(subCode);
+            o.setSubMsg(subMsg);
+        });
+        // mock
+        when(defaultAlipayClient.execute(argThat((ArgumentMatcher<AlipayTradePayRequest>) request -> true)))
+                .thenReturn(response);
+        // 准备请求参数
+        String authCode = randomString();
+        String outTradeNo = randomString();
+        PayOrderUnifiedReqDTO reqDTO = buildOrderUnifiedReqDTO(randomURL(), outTradeNo, randomInteger());
+        // 设置条码
+        Map<String, String> extraParam = new HashMap<>();
+        extraParam.put("auth_code", authCode);
+        reqDTO.setChannelExtras(extraParam);
+        // 下单请求
+        PayOrderRespDTO resp = client.unifiedOrder(reqDTO);
+        // 断言
+        assertEquals(CLOSED.getStatus(), resp.getStatus());
+        assertEquals(subCode, resp.getChannelErrorCode());
+        assertEquals(subMsg, resp.getChannelErrorMsg());
+        assertSame(response, resp.getRawData());
+
+    }
+}

+ 6 - 8
yudao-framework/yudao-spring-boot-starter-biz-pay/src/test/java/cn/iocoder/yudao/framework/pay/core/client/impl/alipay/AlipayPcPayClientTest.java

@@ -23,6 +23,8 @@ import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.when;
 
 /**
+ * {@link  AlipayPcPayClient} 单元测试
+ *
  * @author jason
  */
 public class AlipayPcPayClientTest extends AbstractAlipayClientTest {
@@ -41,15 +43,13 @@ public class AlipayPcPayClientTest extends AbstractAlipayClientTest {
     public void test_unified_order_url_display_mode_success() throws AlipayApiException {
         // 准备返回对象
         String notifyUrl = randomURL();
-        Integer price = randomInteger();
-        AlipayTradePagePayResponse response = randomPojo(AlipayTradePagePayResponse.class, o -> {
-            o.setSubCode("");
-        });
+        AlipayTradePagePayResponse response = randomPojo(AlipayTradePagePayResponse.class, o -> o.setSubCode(""));
         // mock
         when(defaultAlipayClient.pageExecute(argThat((ArgumentMatcher<AlipayTradePagePayRequest>) request -> true),
                 eq(Method.GET.name()))).thenReturn(response);
         // 准备请求参数
         String outTradeNo = randomString();
+        Integer price = randomInteger();
         PayOrderUnifiedReqDTO reqDTO = buildOrderUnifiedReqDTO(notifyUrl, outTradeNo, price);
         // 设置  displayMode 为 null.
         reqDTO.setDisplayMode(null);
@@ -67,15 +67,13 @@ public class AlipayPcPayClientTest extends AbstractAlipayClientTest {
     public void test_unified_order_form_display_mode_success() throws AlipayApiException {
         // 准备返回对象
         String notifyUrl = randomURL();
-        Integer price = randomInteger();
-        AlipayTradePagePayResponse response = randomPojo(AlipayTradePagePayResponse.class, o -> {
-            o.setSubCode("");
-        });
+        AlipayTradePagePayResponse response = randomPojo(AlipayTradePagePayResponse.class, o -> o.setSubCode(""));
         // mock
         when(defaultAlipayClient.pageExecute(argThat((ArgumentMatcher<AlipayTradePagePayRequest>) request -> true),
                 eq(Method.POST.name()))).thenReturn(response);
         // 准备请求参数
         String outTradeNo = randomString();
+        Integer price = randomInteger();
         PayOrderUnifiedReqDTO reqDTO = buildOrderUnifiedReqDTO(notifyUrl, outTradeNo, price);
         reqDTO.setDisplayMode(PayOrderDisplayModeEnum.FORM.getMode());