package com.ruoyi.payment.controller;
|
|
import com.ruoyi.order.api.feignClient.ChargingOrderClient;
|
import com.ruoyi.payment.api.vo.IcbcPaymentResp;
|
import com.ruoyi.payment.icbc.config.IcbcPayProperties;
|
import com.ruoyi.payment.icbc.service.IcbcPayService;
|
import org.junit.jupiter.api.Test;
|
import org.springframework.mock.web.MockHttpServletRequest;
|
import org.springframework.mock.web.MockHttpServletResponse;
|
import org.springframework.test.util.ReflectionTestUtils;
|
|
import java.util.LinkedHashMap;
|
import java.util.Map;
|
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
import static org.mockito.ArgumentMatchers.anyMap;
|
import static org.mockito.Mockito.mock;
|
import static org.mockito.Mockito.never;
|
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.when;
|
|
class IcbcPayControllerTest {
|
|
@Test
|
void returnsFailWhenCallbackProcessingFails() throws Exception {
|
MockHttpServletResponse response = new MockHttpServletResponse();
|
|
ReflectionTestUtils.invokeMethod(new IcbcPayController(), "writeCallbackResponse", response, false);
|
|
assertEquals("fail", response.getContentAsString().trim());
|
}
|
|
@Test
|
void returnsSuccessWhenCallbackProcessingSucceeds() throws Exception {
|
MockHttpServletResponse response = new MockHttpServletResponse();
|
|
ReflectionTestUtils.invokeMethod(new IcbcPayController(), "writeCallbackResponse", response, true);
|
|
assertEquals("success", response.getContentAsString().trim());
|
}
|
|
@Test
|
void recoversSignatureFailureWhenBankQueryConfirmsPayment() throws Exception {
|
IcbcPayService payService = mock(IcbcPayService.class);
|
ChargingOrderClient chargingOrderClient = mock(ChargingOrderClient.class);
|
IcbcPayController controller = controller(payService, chargingOrderClient);
|
MockHttpServletRequest request = callbackRequest();
|
MockHttpServletResponse response = new MockHttpServletResponse();
|
when(payService.parseNotify(anyMap())).thenThrow(new IllegalArgumentException("工行回调验签失败"));
|
when(payService.query("CD78120260715165644735")).thenReturn(paidQuery());
|
Map<String, String> recovered = controller.recoverCallbackByPaymentQuery(
|
new LinkedHashMap<>(request.getParameterMap()));
|
assertEquals("231011990056000522607150004167", recovered.get("transaction_id"));
|
|
controller.callBack(request, response);
|
|
assertEquals("success", response.getContentAsString().trim());
|
verify(chargingOrderClient).chargingOrderWXCallback(
|
"CD78120260715165644735", "231011990056000522607150004167", "1");
|
}
|
|
@Test
|
void keepsFailureResponseWhenBankQueryDoesNotConfirmPayment() throws Exception {
|
IcbcPayService payService = mock(IcbcPayService.class);
|
ChargingOrderClient chargingOrderClient = mock(ChargingOrderClient.class);
|
IcbcPayController controller = controller(payService, chargingOrderClient);
|
MockHttpServletRequest request = callbackRequest();
|
MockHttpServletResponse response = new MockHttpServletResponse();
|
when(payService.parseNotify(anyMap())).thenThrow(new IllegalArgumentException("工行回调验签失败"));
|
IcbcPaymentResp unpaid = new IcbcPaymentResp();
|
unpaid.setRawResponse("{\"returnCode\":0,\"pay_status\":\"1\",\"out_trade_no\":\"CD78120260715165644735\"}");
|
when(payService.query("CD78120260715165644735")).thenReturn(unpaid);
|
|
controller.callBack(request, response);
|
|
assertEquals("fail", response.getContentAsString().trim());
|
verify(chargingOrderClient, never()).chargingOrderWXCallback(
|
"CD78120260715165644735", "231011990056000522607150004167", "1");
|
}
|
|
private IcbcPayController controller(IcbcPayService payService, ChargingOrderClient chargingOrderClient) {
|
IcbcPayProperties properties = new IcbcPayProperties();
|
properties.setAppId("11000000000000096526");
|
IcbcPayController controller = new IcbcPayController();
|
ReflectionTestUtils.setField(controller, "icbcPayService", payService);
|
ReflectionTestUtils.setField(controller, "icbcPayProperties", properties);
|
ReflectionTestUtils.setField(controller, "chargingOrderClient", chargingOrderClient);
|
return controller;
|
}
|
|
private MockHttpServletRequest callbackRequest() {
|
MockHttpServletRequest request = new MockHttpServletRequest("POST", "/icbc/callBack");
|
request.addParameter("app_id", "11000000000000096526");
|
request.addParameter("biz_content", "{\"out_trade_no\":\"CD78120260715165644735\"}");
|
request.addParameter("sign", "INVALID");
|
return request;
|
}
|
|
private IcbcPaymentResp paidQuery() {
|
IcbcPaymentResp payment = new IcbcPaymentResp();
|
payment.setStatus("0");
|
payment.setRawResponse("{\"returnCode\":0,\"pay_status\":\"0\",\"out_trade_no\":\"CD78120260715165644735\","
|
+ "\"order_id\":\"231011990056000522607150004167\",\"attach\":\"1\"}");
|
return payment;
|
}
|
}
|