package com.tourguide.modules.order.payment;
|
|
import com.tourguide.common.huifu.biz.DouGongRefundBiz;
|
import com.tourguide.modules.order.entity.TourOrder;
|
import com.tourguide.modules.order.entity.TourOrderPaymentAttempt;
|
import com.tourguide.modules.order.mapper.TourOrderPaymentAttemptMapper;
|
import org.junit.jupiter.api.Test;
|
|
import java.math.BigDecimal;
|
import java.util.HashMap;
|
import java.util.Map;
|
|
import static org.assertj.core.api.Assertions.assertThat;
|
import static org.assertj.core.api.Assertions.assertThatThrownBy;
|
import static org.mockito.Mockito.mock;
|
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.when;
|
|
class HuifuPaymentRefundGatewayTest {
|
@Test
|
void shouldSubmitRefundUsingOriginalPaymentAttempt() throws Exception {
|
DouGongRefundBiz refundBiz = mock(DouGongRefundBiz.class);
|
TourOrderPaymentAttemptMapper attemptMapper = mock(TourOrderPaymentAttemptMapper.class);
|
HuifuPaymentRefundGateway gateway = new HuifuPaymentRefundGateway(refundBiz, attemptMapper);
|
TourOrder order = order();
|
TourOrderPaymentAttempt attempt = attempt();
|
when(attemptMapper.selectByReqSeqIdForUpdate(order.getPaymentOrderNo())).thenReturn(attempt);
|
Map<String, Object> response = new HashMap<>();
|
response.put("resp_code", "00000100");
|
when(refundBiz.refund(order.getRefundOrderNo(), new BigDecimal("36.00"),
|
"20260803", order.getPaymentOrderNo())).thenReturn(response);
|
|
String refundOrderNo = gateway.refund(order, new BigDecimal("36.00"));
|
|
assertThat(refundOrderNo).isEqualTo(order.getRefundOrderNo());
|
verify(refundBiz).refund(order.getRefundOrderNo(), new BigDecimal("36.00"),
|
"20260803", order.getPaymentOrderNo());
|
}
|
|
@Test
|
void shouldRejectFailedHuifuResponse() throws Exception {
|
DouGongRefundBiz refundBiz = mock(DouGongRefundBiz.class);
|
TourOrderPaymentAttemptMapper attemptMapper = mock(TourOrderPaymentAttemptMapper.class);
|
HuifuPaymentRefundGateway gateway = new HuifuPaymentRefundGateway(refundBiz, attemptMapper);
|
TourOrder order = order();
|
when(attemptMapper.selectByReqSeqIdForUpdate(order.getPaymentOrderNo())).thenReturn(attempt());
|
Map<String, Object> response = new HashMap<>();
|
response.put("resp_code", "10000100");
|
response.put("resp_desc", "refund failed");
|
when(refundBiz.refund(order.getRefundOrderNo(), new BigDecimal("36.00"),
|
"20260803", order.getPaymentOrderNo())).thenReturn(response);
|
|
assertThatThrownBy(() -> gateway.refund(order, new BigDecimal("36.00")))
|
.isInstanceOf(IllegalStateException.class)
|
.hasMessage("refund failed");
|
}
|
|
@Test
|
void shouldReadNestedHuifuResponseCode() throws Exception {
|
DouGongRefundBiz refundBiz = mock(DouGongRefundBiz.class);
|
TourOrderPaymentAttemptMapper attemptMapper = mock(TourOrderPaymentAttemptMapper.class);
|
HuifuPaymentRefundGateway gateway = new HuifuPaymentRefundGateway(refundBiz, attemptMapper);
|
TourOrder order = order();
|
when(attemptMapper.selectByReqSeqIdForUpdate(order.getPaymentOrderNo())).thenReturn(attempt());
|
Map<String, Object> nested = new HashMap<>();
|
nested.put("resp_code", "00000100");
|
Map<String, Object> response = new HashMap<>();
|
response.put("data", nested);
|
when(refundBiz.refund(order.getRefundOrderNo(), new BigDecimal("36.00"),
|
"20260803", order.getPaymentOrderNo())).thenReturn(response);
|
|
assertThat(gateway.refund(order, new BigDecimal("36.00")))
|
.isEqualTo(order.getRefundOrderNo());
|
}
|
|
private TourOrder order() {
|
TourOrder order = new TourOrder();
|
order.setPaymentOrderNo("PY202608031700000000000000000001");
|
order.setRefundOrderNo("RF202608031710000000000000000001");
|
return order;
|
}
|
|
private TourOrderPaymentAttempt attempt() {
|
TourOrderPaymentAttempt attempt = new TourOrderPaymentAttempt();
|
attempt.setReqSeqId("PY202608031700000000000000000001");
|
attempt.setReqDate("20260803");
|
return attempt;
|
}
|
}
|