OmgPaymentRetryControllerTest.java 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. package com.ruoyi.app.omgpay;
  2. import com.ruoyi.app.omgpay.dto.OmgCreatePaymentResponse;
  3. import com.ruoyi.app.omgpay.dto.OmgPaymentErrorResponse;
  4. import com.ruoyi.app.omgpay.dto.OmgRetryPaymentRequest;
  5. import com.ruoyi.common.core.domain.AjaxResult;
  6. import com.ruoyi.common.utils.MessageUtils;
  7. import com.ruoyi.system.omgpay.service.OmgIpnAuditService;
  8. import org.junit.jupiter.api.Test;
  9. import org.mockito.MockedStatic;
  10. import org.springframework.web.bind.annotation.PostMapping;
  11. import org.springframework.web.bind.annotation.RequestBody;
  12. import org.springframework.web.bind.annotation.RequestHeader;
  13. import java.lang.reflect.Field;
  14. import java.lang.reflect.Method;
  15. import java.util.Map;
  16. import java.util.Set;
  17. import java.util.stream.Collectors;
  18. import static org.junit.jupiter.api.Assertions.assertArrayEquals;
  19. import static org.junit.jupiter.api.Assertions.assertEquals;
  20. import static org.junit.jupiter.api.Assertions.assertNotNull;
  21. import static org.junit.jupiter.api.Assertions.assertSame;
  22. import static org.mockito.ArgumentMatchers.anyString;
  23. import static org.mockito.Mockito.mock;
  24. import static org.mockito.Mockito.mockStatic;
  25. import static org.mockito.Mockito.when;
  26. class OmgPaymentRetryControllerTest {
  27. @Test
  28. void exposesAuthenticatedRetryContractAndReturnsNewForm() throws Exception {
  29. Method method = OmgPaymentController.class.getDeclaredMethod(
  30. "retry", String.class, String.class, OmgRetryPaymentRequest.class);
  31. assertArrayEquals(new String[]{"/retry"}, method.getAnnotation(PostMapping.class).value());
  32. assertEquals("token", method.getParameters()[0].getAnnotation(RequestHeader.class).name());
  33. assertNotNull(method.getParameters()[1].getAnnotation(RequestHeader.class));
  34. assertNotNull(method.getParameters()[2].getAnnotation(RequestBody.class));
  35. assertEquals(Set.of("orderId", "paymentMethod"),
  36. java.util.Arrays.stream(OmgRetryPaymentRequest.class.getDeclaredFields())
  37. .map(Field::getName).collect(Collectors.toSet()));
  38. OmgPaymentTokenUserResolver resolver = mock(OmgPaymentTokenUserResolver.class);
  39. OmgPaymentRetryService retryService = mock(OmgPaymentRetryService.class);
  40. OmgCreatePaymentResponse response = new OmgCreatePaymentResponse(
  41. "CREATED", "https://stage.example", Map.of("MerchantTradeNo", "OMGNEW"));
  42. when(resolver.requireUserId("token")).thenReturn(5L);
  43. when(retryService.retry(5L, "DD-1", OmgPaymentMethod.APPLE_PAY)).thenReturn(new OmgPaymentCreateOutcome(
  44. response, 9L, "DD-1", 5L, 77L, 100, "OMGNE***0001"));
  45. OmgRetryPaymentRequest request = new OmgRetryPaymentRequest();
  46. request.setOrderId("DD-1");
  47. request.setPaymentMethod("APPLE_PAY");
  48. AjaxResult result;
  49. try (MockedStatic<MessageUtils> messages = mockStatic(MessageUtils.class)) {
  50. messages.when(() -> MessageUtils.message(anyString())).thenAnswer(call -> call.getArgument(0));
  51. result = controller(resolver, retryService).retry("token", null, request);
  52. }
  53. assertSame(response, result.get("data"));
  54. org.mockito.Mockito.verify(retryService).retry(5L, "DD-1", OmgPaymentMethod.APPLE_PAY);
  55. }
  56. @Test
  57. void mapsRetryBusinessAndUnexpectedFailuresToStableStatus() {
  58. try (MockedStatic<MessageUtils> messages = mockStatic(MessageUtils.class)) {
  59. messages.when(() -> MessageUtils.message(anyString())).thenAnswer(call -> call.getArgument(0));
  60. OmgPaymentTokenUserResolver resolver = mock(OmgPaymentTokenUserResolver.class);
  61. OmgPaymentRetryService retryService = mock(OmgPaymentRetryService.class);
  62. when(resolver.requireUserId("token")).thenReturn(5L);
  63. when(retryService.retry(5L, "DD-1", OmgPaymentMethod.CREDIT)).thenThrow(
  64. new OmgPaymentBusinessException(OmgPaymentErrorCode.PAYMENT_RETRY_NOT_AVAILABLE));
  65. OmgRetryPaymentRequest request = new OmgRetryPaymentRequest();
  66. request.setOrderId("DD-1");
  67. request.setPaymentMethod("CREDIT");
  68. OmgPaymentController controller = controller(resolver, retryService);
  69. AjaxResult business = controller.retry("token", null, request);
  70. assertEquals("PAYMENT_RETRY_NOT_AVAILABLE",
  71. ((OmgPaymentErrorResponse) business.get("data")).status());
  72. org.mockito.Mockito.doThrow(new IllegalStateException("db"))
  73. .when(retryService).retry(5L, "DD-1", OmgPaymentMethod.CREDIT);
  74. AjaxResult unexpected = controller.retry("token", null, request);
  75. assertEquals("PAYMENT_RETRY_FAILED",
  76. ((OmgPaymentErrorResponse) unexpected.get("data")).status());
  77. }
  78. }
  79. @Test
  80. void rejectsInvalidPaymentMethodsWithoutCallingRetryService() {
  81. try (MockedStatic<MessageUtils> messages = mockStatic(MessageUtils.class)) {
  82. messages.when(() -> MessageUtils.message(anyString())).thenAnswer(call -> call.getArgument(0));
  83. OmgPaymentTokenUserResolver resolver = mock(OmgPaymentTokenUserResolver.class);
  84. OmgPaymentRetryService retryService = mock(OmgPaymentRetryService.class);
  85. when(resolver.requireUserId("token")).thenReturn(5L);
  86. OmgPaymentController controller = controller(resolver, retryService);
  87. for (String paymentMethod : new String[]{null, "ALL", "Credit", " CREDIT "}) {
  88. OmgRetryPaymentRequest request = new OmgRetryPaymentRequest();
  89. request.setOrderId("DD-1");
  90. request.setPaymentMethod(paymentMethod);
  91. AjaxResult result = controller.retry("token", null, request);
  92. assertEquals("PAYMENT_METHOD_INVALID", ((OmgPaymentErrorResponse) result.get("data")).status());
  93. }
  94. org.mockito.Mockito.verifyNoInteractions(retryService);
  95. }
  96. }
  97. @Test
  98. void oldAppCannotRetryMultiStoreGatewayAttempt() {
  99. OmgPaymentController controller = controller(mock(OmgPaymentTokenUserResolver.class),
  100. mock(OmgPaymentRetryService.class));
  101. OmgRetryPaymentRequest request = new OmgRetryPaymentRequest();
  102. request.setOrderId("991789716730512001");
  103. com.ruoyi.app.order.MultiStoreCheckoutLegacyGuard guard = mock(com.ruoyi.app.order.MultiStoreCheckoutLegacyGuard.class);
  104. when(guard.isBatchOrder("991789716730512001")).thenReturn(true);
  105. org.springframework.test.util.ReflectionTestUtils.setField(controller, "batchGuard", guard);
  106. request.setPaymentMethod("CREDIT");
  107. try (MockedStatic<MessageUtils> messages = mockStatic(MessageUtils.class)) {
  108. messages.when(() -> MessageUtils.message(anyString())).thenAnswer(call -> call.getArgument(0));
  109. assertEquals("UPGRADE_REQUIRED", controller.retry("token", null, request).get("errorCode"));
  110. }
  111. }
  112. private static OmgPaymentController controller(OmgPaymentTokenUserResolver resolver,
  113. OmgPaymentRetryService retryService) {
  114. return new OmgPaymentController(resolver, mock(OmgPaymentCreateService.class),
  115. mock(OmgPaymentNotifyService.class), mock(OmgIpnAuditService.class),
  116. mock(OmgPaymentQueryService.class), retryService, mock(OmgPaymentRefundService.class));
  117. }
  118. }