package cn.iocoder.yudao.module.pay.service.transfer; import cn.iocoder.yudao.framework.test.core.ut.BaseDbAndRedisUnitTest; import cn.iocoder.yudao.module.pay.dal.dataobject.channel.PayChannelDO; import cn.iocoder.yudao.module.pay.dal.dataobject.transfer.PayTransferDO; import cn.iocoder.yudao.module.pay.dal.mysql.transfer.PayTransferMapper; import cn.iocoder.yudao.module.pay.dal.redis.no.PayNoRedisDAO; import cn.iocoder.yudao.module.pay.enums.transfer.PayTransferStatusEnum; import cn.iocoder.yudao.module.pay.framework.pay.config.PayProperties; import cn.iocoder.yudao.module.pay.framework.pay.core.client.dto.transfer.PayTransferRespDTO; import cn.iocoder.yudao.module.pay.service.app.PayAppService; import cn.iocoder.yudao.module.pay.service.channel.PayChannelService; import cn.iocoder.yudao.module.pay.service.notify.PayNotifyService; import jakarta.annotation.Resource; import org.junit.jupiter.api.Test; import org.springframework.context.annotation.Import; import org.springframework.test.context.bean.override.mockito.MockitoBean; import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; import static org.junit.jupiter.api.Assertions.assertEquals; /** * {@link PayTransferServiceImpl} 的单元测试类 * * @author 芋道源码 */ @Import({PayTransferServiceImpl.class, PayNoRedisDAO.class}) public class PayTransferServiceTest extends BaseDbAndRedisUnitTest { @Resource private PayTransferServiceImpl transferService; @Resource private PayTransferMapper transferMapper; @MockitoBean private PayProperties payProperties; @MockitoBean private PayAppService appService; @MockitoBean private PayChannelService channelService; @MockitoBean private PayNotifyService notifyService; @Test public void testNotifyTransferProgressing_fillChannelPackageInfoIfAbsent() { // mock 数据(PayTransferDO):同步任务先把 WAITING 更新为 PROCESSING,但是不返回 package 信息 PayTransferDO transfer = randomPojo(PayTransferDO.class, o -> o.setAppId(10L) .setNo("T110") .setStatus(PayTransferStatusEnum.PROCESSING.getStatus()) .setChannelPackageInfo(null)); transferMapper.insert(transfer); // 准备参数 PayChannelDO channel = randomPojo(PayChannelDO.class, o -> o.setAppId(10L)); PayTransferRespDTO createNotify = PayTransferRespDTO.processingOf("WX_TRANSFER_110", "T110", "create"); createNotify.setChannelPackageInfo("package-info-110"); // 调用:模拟发起转账接口随后返回 PROCESSING,并携带微信确认收款 package 信息 transferService.notifyTransfer(channel, createNotify); // 断言:已是 PROCESSING 时仍会补写 package 信息 PayTransferDO dbTransfer = transferMapper.selectById(transfer.getId()); assertEquals(PayTransferStatusEnum.PROCESSING.getStatus(), dbTransfer.getStatus()); assertEquals("package-info-110", dbTransfer.getChannelPackageInfo()); } @Test public void testNotifyTransferProgressing_notOverwriteChannelPackageInfo() { // mock 数据(PayTransferDO):已经存在 package 信息 PayTransferDO transfer = randomPojo(PayTransferDO.class, o -> o.setAppId(10L) .setNo("T110") .setStatus(PayTransferStatusEnum.PROCESSING.getStatus()) .setChannelPackageInfo("package-info-110")); transferMapper.insert(transfer); // 准备参数 PayChannelDO channel = randomPojo(PayChannelDO.class, o -> o.setAppId(10L)); PayTransferRespDTO syncNotify = PayTransferRespDTO.processingOf("WX_TRANSFER_110", "T110", "sync"); // 调用:后续同步任务不返回 package 信息 transferService.notifyTransfer(channel, syncNotify); // 断言:已有 package 信息不被空值覆盖 PayTransferDO dbTransfer = transferMapper.selectById(transfer.getId()); assertEquals("package-info-110", dbTransfer.getChannelPackageInfo()); } }