@ -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 ) {