liujie
2026-09-09 39f6fca28e3f78abe48f08e474ec011abb990b36
backend/src/test/java/com/tourguide/modules/order/service/HuifuRefundCallbackServiceTest.java
@@ -2,6 +2,7 @@
import com.alibaba.fastjson.JSONObject;
import com.tourguide.common.huifu.properties.HuiFuProperties;
import com.tourguide.modules.order.domain.OrderStatus;
import com.tourguide.modules.order.domain.RefundStatus;
import com.tourguide.modules.order.entity.TourOrder;
import com.tourguide.modules.order.mapper.TourOrderMapper;
@@ -39,6 +40,7 @@
        assertThat(first).isTrue();
        assertThat(duplicate).isFalse();
        assertThat(order.getRefundStatus()).isEqualTo(RefundStatus.REFUNDED.getCode());
        assertThat(order.getStatus()).isEqualTo(OrderStatus.REFUNDED.getCode());
        assertThat(order.getRefundTime()).isNotNull();
        verify(orderMapper).updateById(order);
    }
@@ -69,11 +71,53 @@
        verify(orderMapper, never()).updateById(order);
    }
    @Test
    void nestedSuccessCallbackShouldCompleteOrder() {
        TourOrder order = refundingOrder();
        when(orderMapper.selectByRefundOrderNoForUpdate("RF001")).thenReturn(order);
        JSONObject data = successBody();
        JSONObject body = new JSONObject();
        body.put("data", data);
        assertThat(callbackService.handle(body)).isTrue();
        assertThat(order.getStatus()).isEqualTo(OrderStatus.REFUNDED.getCode());
    }
    @Test
    void partialSuccessCallbackShouldKeepRefundingBalance() {
        TourOrder order = refundingOrder();
        order.setRefundAmount(new BigDecimal("20.00"));
        when(orderMapper.selectByRefundOrderNoForUpdate("RF001")).thenReturn(order);
        JSONObject body = successBody();
        body.put("ord_amt", "20.00");
        assertThat(callbackService.handle(body)).isTrue();
        assertThat(order.getRefundedAmount()).isEqualByComparingTo("20.00");
        assertThat(order.getRefundStatus()).isEqualTo(RefundStatus.PARTIAL.getCode());
        assertThat(order.getStatus()).isEqualTo(OrderStatus.CANCELLED.getCode());
    }
    @Test
    void followUpSuccessCallbackShouldCompleteRemainingRefund() {
        TourOrder order = refundingOrder();
        order.setRefundAmount(new BigDecimal("16.00"));
        order.setRefundedAmount(new BigDecimal("20.00"));
        when(orderMapper.selectByRefundOrderNoForUpdate("RF001")).thenReturn(order);
        JSONObject body = successBody();
        body.put("ord_amt", "16.00");
        assertThat(callbackService.handle(body)).isTrue();
        assertThat(order.getRefundedAmount()).isEqualByComparingTo("36.00");
        assertThat(order.getRefundStatus()).isEqualTo(RefundStatus.REFUNDED.getCode());
        assertThat(order.getStatus()).isEqualTo(OrderStatus.REFUNDED.getCode());
    }
    private TourOrder refundingOrder() {
        TourOrder order = new TourOrder();
        order.setRefundOrderNo("RF001");
        order.setRefundStatus(RefundStatus.REFUNDING.getCode());
        order.setRefundAmount(new BigDecimal("36.00"));
        order.setPaymentAmount(new BigDecimal("36.00"));
        return order;
    }