|
|
@@ -0,0 +1,98 @@
|
|
|
+package com.payment.platform.module.payment.notification.handler;
|
|
|
+
|
|
|
+import com.payment.platform.module.payment.account.entity.TransferEntity;
|
|
|
+import com.payment.platform.module.payment.account.mapper.AccountMapper;
|
|
|
+import com.payment.platform.module.payment.account.mapper.TransferMapper;
|
|
|
+import com.payment.platform.module.payment.enterprise.mapper.EnterpriseMapper;
|
|
|
+import com.payment.platform.module.payment.openapi.service.OpenapiService;
|
|
|
+import com.payment.platform.module.payment.points.service.PointsService;
|
|
|
+import org.junit.jupiter.api.BeforeEach;
|
|
|
+import org.junit.jupiter.api.Test;
|
|
|
+import org.junit.jupiter.api.extension.ExtendWith;
|
|
|
+import org.mockito.Mock;
|
|
|
+import org.mockito.junit.jupiter.MockitoExtension;
|
|
|
+
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.Map;
|
|
|
+
|
|
|
+import static org.junit.jupiter.api.Assertions.*;
|
|
|
+import static org.mockito.ArgumentMatchers.any;
|
|
|
+import static org.mockito.Mockito.*;
|
|
|
+
|
|
|
+/**
|
|
|
+ * alipay.fund.trans.order.changed 这条腿的字段落库。
|
|
|
+ *
|
|
|
+ * <p>键名与取值逐字取自 2026-09-29 生产库 {@code alipay_notify_log.message} 里那条
|
|
|
+ * 报文(biz_content 展开后的形态)—— 不是照文档或邻类推的:
|
|
|
+ * {@code out_biz_no} 1302345790789783552 / {@code order_id}
|
|
|
+ * 20260929110070100006870072072224 / {@code status} FAIL /
|
|
|
+ * {@code error_code} Ali_Err_111036 /
|
|
|
+ * {@code fail_reason} 该银行账户已冻结,请联系银行客服。
|
|
|
+ *
|
|
|
+ * <p>本类此前**没有任何测试**,症状因此只表现为「生产库里两列是空的」。
|
|
|
+ */
|
|
|
+@ExtendWith(MockitoExtension.class)
|
|
|
+class AccountHandlerTest {
|
|
|
+
|
|
|
+ private static final String METHOD = "alipay.fund.trans.order.changed";
|
|
|
+
|
|
|
+ @Mock private TransferMapper transferMapper;
|
|
|
+ @Mock private AccountMapper accountMapper;
|
|
|
+ @Mock private EnterpriseMapper enterpriseMapper;
|
|
|
+ @Mock private PointsService pointsService;
|
|
|
+ @Mock private OpenapiService openapiService;
|
|
|
+
|
|
|
+ private AccountHandler handler;
|
|
|
+
|
|
|
+ @BeforeEach
|
|
|
+ void setUp() {
|
|
|
+ // 本 handler 的 mapper 走**构造器注入**(@RequiredArgsConstructor),不是 NotifyContext ——
|
|
|
+ // 与同包的 BatchPayHandler 相反。照 BatchPayHandler 的写法会构造不出来。
|
|
|
+ handler = new AccountHandler(transferMapper, accountMapper, enterpriseMapper,
|
|
|
+ pointsService, openapiService);
|
|
|
+ }
|
|
|
+
|
|
|
+ private TransferEntity dealingTransfer() {
|
|
|
+ TransferEntity t = new TransferEntity();
|
|
|
+ t.setOutBizNo("1302345790789783552");
|
|
|
+ t.setStatus("DEALING");
|
|
|
+ when(transferMapper.selectOne(any())).thenReturn(t);
|
|
|
+ return t;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ void transOrderChanged_fail_writesErrorCodeAndReason() {
|
|
|
+ TransferEntity t = dealingTransfer();
|
|
|
+ Map<String, String> params = new HashMap<>();
|
|
|
+ params.put("out_biz_no", "1302345790789783552");
|
|
|
+ params.put("order_id", "20260929110070100006870072072224");
|
|
|
+ params.put("status", "FAIL");
|
|
|
+ params.put("trans_amount", "1170.00");
|
|
|
+ params.put("error_code", "Ali_Err_111036");
|
|
|
+ params.put("fail_reason", "该银行账户已冻结,请联系银行客服");
|
|
|
+
|
|
|
+ handler.dispatch(METHOD, params);
|
|
|
+
|
|
|
+ assertEquals("FAIL", t.getStatus());
|
|
|
+ assertEquals("Ali_Err_111036", t.getErrorCode());
|
|
|
+ assertEquals("该银行账户已冻结,请联系银行客服", t.getErrorMsg());
|
|
|
+ verify(transferMapper).updateById(t);
|
|
|
+ }
|
|
|
+
|
|
|
+ /** 正对照:成功报文里**没有**这两个键,守卫必须一个字符都不写。 */
|
|
|
+ @Test
|
|
|
+ void transOrderChanged_success_leavesErrorColumnsUntouched() {
|
|
|
+ TransferEntity t = dealingTransfer();
|
|
|
+ Map<String, String> params = new HashMap<>();
|
|
|
+ params.put("out_biz_no", "1302345790789783552");
|
|
|
+ params.put("order_id", "20260929110070100006870072072224");
|
|
|
+ params.put("status", "SUCCESS");
|
|
|
+ params.put("trans_amount", "1170.00");
|
|
|
+
|
|
|
+ handler.dispatch(METHOD, params);
|
|
|
+
|
|
|
+ assertEquals("SUCCESS", t.getStatus());
|
|
|
+ assertNull(t.getErrorCode());
|
|
|
+ assertNull(t.getErrorMsg());
|
|
|
+ }
|
|
|
+}
|