|
@@ -1,7 +1,11 @@
|
|
|
package cn.iocoder.yudao.module.pay.service.notify;
|
|
|
|
|
|
import cn.hutool.extra.spring.SpringUtil;
|
|
|
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
|
|
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
|
|
import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
|
|
|
+import cn.iocoder.yudao.module.pay.controller.admin.notify.vo.PayNotifyTaskPageReqVO;
|
|
|
+import cn.iocoder.yudao.module.pay.dal.dataobject.notify.PayNotifyLogDO;
|
|
|
import cn.iocoder.yudao.module.pay.dal.dataobject.notify.PayNotifyTaskDO;
|
|
|
import cn.iocoder.yudao.module.pay.dal.dataobject.order.PayOrderDO;
|
|
|
import cn.iocoder.yudao.module.pay.dal.dataobject.refund.PayRefundDO;
|
|
@@ -20,14 +24,17 @@ import org.redisson.api.RLock;
|
|
|
import org.redisson.api.RedissonClient;
|
|
|
import org.springframework.boot.test.mock.mockito.MockBean;
|
|
|
import org.springframework.context.annotation.Import;
|
|
|
-import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
|
-
|
|
|
import java.time.Duration;
|
|
|
+import java.util.List;
|
|
|
|
|
|
-import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.addTime;
|
|
|
+import static cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants.BAD_REQUEST;
|
|
|
+import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.*;
|
|
|
+import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId;
|
|
|
+import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
|
|
|
import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
|
|
|
+import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomString;
|
|
|
import static org.assertj.core.api.Assertions.assertThat;
|
|
|
import static org.junit.jupiter.api.Assertions.*;
|
|
|
import static org.mockito.ArgumentMatchers.anyString;
|
|
@@ -167,7 +174,167 @@ public class PayNotifyServiceTest extends BaseDbUnitTest {
|
|
|
|
|
|
// 调用
|
|
|
notifyService.executeNotify0(task);
|
|
|
+ // 断言,task
|
|
|
+ PayNotifyTaskDO dbTask = notifyTaskMapper.selectById(task.getId());
|
|
|
+ assertNotEquals(task.getNextNotifyTime(), dbTask.getNextNotifyTime());
|
|
|
+ assertNotEquals(task.getLastExecuteTime(), dbTask.getNextNotifyTime());
|
|
|
+ assertEquals(dbTask.getNotifyTimes(), 1);
|
|
|
+ assertEquals(dbTask.getStatus(), PayNotifyStatusEnum.REQUEST_FAILURE.getStatus());
|
|
|
+ // 断言,log
|
|
|
+ PayNotifyLogDO dbLog = notifyLogMapper.selectOne(null);
|
|
|
+ assertEquals(dbLog.getTaskId(), task.getId());
|
|
|
+ assertEquals(dbLog.getNotifyTimes(), 1);
|
|
|
+ assertTrue(dbLog.getResponse().contains("未知的通知任务类型:"));
|
|
|
+ assertEquals(dbLog.getStatus(), PayNotifyStatusEnum.REQUEST_FAILURE.getStatus());
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testProcessNotifyResult_success() {
|
|
|
+ // mock 数据(task)
|
|
|
+ PayNotifyTaskDO task = randomPojo(PayNotifyTaskDO.class,
|
|
|
+ o -> o.setNotifyTimes(0).setMaxNotifyTimes(9));
|
|
|
+ notifyTaskMapper.insert(task);
|
|
|
+ // 准备参数
|
|
|
+ CommonResult<?> invokeResult = CommonResult.success(randomString());
|
|
|
+
|
|
|
+ // 调用
|
|
|
+ notifyService.processNotifyResult(task, invokeResult, null);
|
|
|
+ // 断言
|
|
|
+ PayNotifyTaskDO dbTask = notifyTaskMapper.selectById(task.getId());
|
|
|
+ assertEquals(task.getNextNotifyTime(), dbTask.getNextNotifyTime());
|
|
|
+ assertNotEquals(task.getLastExecuteTime(), dbTask.getNextNotifyTime());
|
|
|
+ assertEquals(dbTask.getNotifyTimes(), 1);
|
|
|
+ assertEquals(dbTask.getStatus(), PayNotifyStatusEnum.SUCCESS.getStatus());
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testProcessNotifyResult_failure() {
|
|
|
+ // mock 数据(task)
|
|
|
+ PayNotifyTaskDO task = randomPojo(PayNotifyTaskDO.class,
|
|
|
+ o -> o.setNotifyTimes(8).setMaxNotifyTimes(9));
|
|
|
+ notifyTaskMapper.insert(task);
|
|
|
+ // 准备参数
|
|
|
+ CommonResult<?> invokeResult = CommonResult.error(BAD_REQUEST);
|
|
|
+
|
|
|
+ // 调用
|
|
|
+ notifyService.processNotifyResult(task, invokeResult, null);
|
|
|
+ // 断言
|
|
|
+ PayNotifyTaskDO dbTask = notifyTaskMapper.selectById(task.getId());
|
|
|
+ assertEquals(task.getNextNotifyTime(), dbTask.getNextNotifyTime());
|
|
|
+ assertNotEquals(task.getLastExecuteTime(), dbTask.getNextNotifyTime());
|
|
|
+ assertEquals(dbTask.getNotifyTimes(), 9);
|
|
|
+ assertEquals(dbTask.getStatus(), PayNotifyStatusEnum.FAILURE.getStatus());
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testProcessNotifyResult_requestFailure() {
|
|
|
+ // mock 数据(task)
|
|
|
+ PayNotifyTaskDO task = randomPojo(PayNotifyTaskDO.class,
|
|
|
+ o -> o.setNotifyTimes(0).setMaxNotifyTimes(9));
|
|
|
+ notifyTaskMapper.insert(task);
|
|
|
+ // 准备参数
|
|
|
+ CommonResult<?> invokeResult = CommonResult.error(BAD_REQUEST);
|
|
|
+
|
|
|
+ // 调用
|
|
|
+ notifyService.processNotifyResult(task, invokeResult, null);
|
|
|
+ // 断言
|
|
|
+ PayNotifyTaskDO dbTask = notifyTaskMapper.selectById(task.getId());
|
|
|
+ assertNotEquals(task.getNextNotifyTime(), dbTask.getNextNotifyTime());
|
|
|
+ assertNotEquals(task.getLastExecuteTime(), dbTask.getNextNotifyTime());
|
|
|
+ assertEquals(dbTask.getNotifyTimes(), 1);
|
|
|
+ assertEquals(dbTask.getStatus(), PayNotifyStatusEnum.REQUEST_SUCCESS.getStatus());
|
|
|
+ }
|
|
|
|
|
|
+ @Test
|
|
|
+ public void testProcessNotifyResult_requestSuccess() {
|
|
|
+ // mock 数据(task)
|
|
|
+ PayNotifyTaskDO task = randomPojo(PayNotifyTaskDO.class,
|
|
|
+ o -> o.setNotifyTimes(0).setMaxNotifyTimes(9));
|
|
|
+ notifyTaskMapper.insert(task);
|
|
|
+ // 准备参数
|
|
|
+ CommonResult<?> invokeResult = CommonResult.error(BAD_REQUEST);
|
|
|
+ RuntimeException invokeException = new RuntimeException();
|
|
|
+
|
|
|
+ // 调用
|
|
|
+ notifyService.processNotifyResult(task, invokeResult, invokeException);
|
|
|
+ // 断言
|
|
|
+ PayNotifyTaskDO dbTask = notifyTaskMapper.selectById(task.getId());
|
|
|
+ assertNotEquals(task.getNextNotifyTime(), dbTask.getNextNotifyTime());
|
|
|
+ assertNotEquals(task.getLastExecuteTime(), dbTask.getNextNotifyTime());
|
|
|
+ assertEquals(dbTask.getNotifyTimes(), 1);
|
|
|
+ assertEquals(dbTask.getStatus(), PayNotifyStatusEnum.REQUEST_FAILURE.getStatus());
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testGetNotifyTask() {
|
|
|
+ // mock 数据(task)
|
|
|
+ PayNotifyTaskDO task = randomPojo(PayNotifyTaskDO.class);
|
|
|
+ notifyTaskMapper.insert(task);
|
|
|
+ // 准备参数
|
|
|
+ Long id = task.getId();
|
|
|
+
|
|
|
+ // 调用
|
|
|
+ PayNotifyTaskDO dbTask = notifyService.getNotifyTask(id);
|
|
|
+ // 断言
|
|
|
+ assertPojoEquals(dbTask, task);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testGetNotifyTaskPage() {
|
|
|
+ // mock 数据
|
|
|
+ PayNotifyTaskDO dbTask = randomPojo(PayNotifyTaskDO.class, o -> { // 等会查询到
|
|
|
+ o.setAppId(1L);
|
|
|
+ o.setType(PayNotifyTypeEnum.REFUND.getType());
|
|
|
+ o.setDataId(100L);
|
|
|
+ o.setStatus(PayNotifyStatusEnum.SUCCESS.getStatus());
|
|
|
+ o.setMerchantOrderId("P110");
|
|
|
+ o.setCreateTime(buildTime(2023, 2, 3));
|
|
|
+ });
|
|
|
+ notifyTaskMapper.insert(dbTask);
|
|
|
+ // 测试 appId 不匹配
|
|
|
+ notifyTaskMapper.insert(cloneIgnoreId(dbTask, o -> o.setAppId(2L)));
|
|
|
+ // 测试 type 不匹配
|
|
|
+ notifyTaskMapper.insert(cloneIgnoreId(dbTask, o -> o.setType(PayNotifyTypeEnum.ORDER.getType())));
|
|
|
+ // 测试 dataId 不匹配
|
|
|
+ notifyTaskMapper.insert(cloneIgnoreId(dbTask, o -> o.setDataId(200L)));
|
|
|
+ // 测试 status 不匹配
|
|
|
+ notifyTaskMapper.insert(cloneIgnoreId(dbTask, o -> o.setStatus(PayNotifyStatusEnum.FAILURE.getStatus())));
|
|
|
+ // 测试 merchantOrderId 不匹配
|
|
|
+ notifyTaskMapper.insert(cloneIgnoreId(dbTask, o -> o.setMerchantOrderId(randomString())));
|
|
|
+ // 测试 createTime 不匹配
|
|
|
+ notifyTaskMapper.insert(cloneIgnoreId(dbTask, o -> o.setCreateTime(buildTime(2023, 1, 1))));
|
|
|
+ // 准备参数
|
|
|
+ PayNotifyTaskPageReqVO reqVO = new PayNotifyTaskPageReqVO();
|
|
|
+ reqVO.setAppId(1L);
|
|
|
+ reqVO.setType(PayNotifyTypeEnum.REFUND.getType());
|
|
|
+ reqVO.setDataId(100L);
|
|
|
+ reqVO.setStatus(PayNotifyStatusEnum.SUCCESS.getStatus());
|
|
|
+ reqVO.setMerchantOrderId("P110");
|
|
|
+ reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
|
|
|
+
|
|
|
+ // 调用
|
|
|
+ PageResult<PayNotifyTaskDO> pageResult = notifyService.getNotifyTaskPage(reqVO);
|
|
|
+ // 断言
|
|
|
+ assertEquals(1, pageResult.getTotal());
|
|
|
+ assertEquals(1, pageResult.getList().size());
|
|
|
+ assertPojoEquals(dbTask, pageResult.getList().get(0));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testGetNotifyLogList() {
|
|
|
+ // mock 数据
|
|
|
+ PayNotifyLogDO dbLog = randomPojo(PayNotifyLogDO.class);
|
|
|
+ notifyLogMapper.insert(dbLog);
|
|
|
+ PayNotifyLogDO dbLog02 = randomPojo(PayNotifyLogDO.class);
|
|
|
+ notifyLogMapper.insert(dbLog02);
|
|
|
+ // 准备参数
|
|
|
+ Long taskId = dbLog.getTaskId();
|
|
|
+
|
|
|
+ // 调用
|
|
|
+ List<PayNotifyLogDO> logList = notifyService.getNotifyLogList(taskId);
|
|
|
+ // 断言
|
|
|
+ assertEquals(logList.size(), 1);
|
|
|
+ assertPojoEquals(dbLog, logList.get(0));
|
|
|
}
|
|
|
|
|
|
private void mockLock(Long id) {
|