OmgPaymentRefundControllerTest.java 4.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. package com.ruoyi.app.omgpay;
  2. import com.ruoyi.app.omgpay.dto.OmgPaymentErrorResponse;
  3. import com.ruoyi.app.omgpay.dto.OmgRefundPaymentRequest;
  4. import com.ruoyi.common.core.domain.AjaxResult;
  5. import com.ruoyi.common.utils.MessageUtils;
  6. import com.ruoyi.system.omgpay.service.OmgIpnAuditService;
  7. import org.junit.jupiter.api.Test;
  8. import org.mockito.MockedStatic;
  9. import org.springframework.web.bind.annotation.PostMapping;
  10. import org.springframework.web.bind.annotation.RequestBody;
  11. import org.springframework.web.bind.annotation.RequestHeader;
  12. import java.lang.reflect.Method;
  13. import java.util.Map;
  14. import static org.junit.jupiter.api.Assertions.*;
  15. import static org.mockito.ArgumentMatchers.anyString;
  16. import static org.mockito.Mockito.*;
  17. class OmgPaymentRefundControllerTest {
  18. @Test
  19. void exposesAuthenticatedOrderIdOnlyRefundContract() throws Exception {
  20. Method method = OmgPaymentController.class.getDeclaredMethod(
  21. "refund", String.class, OmgRefundPaymentRequest.class);
  22. assertArrayEquals(new String[]{"/refund"}, method.getAnnotation(PostMapping.class).value());
  23. assertEquals("token", method.getParameters()[0].getAnnotation(RequestHeader.class).name());
  24. assertNotNull(method.getParameters()[1].getAnnotation(RequestBody.class));
  25. assertEquals(1, OmgRefundPaymentRequest.class.getDeclaredFields().length);
  26. assertEquals("orderId", OmgRefundPaymentRequest.class.getDeclaredFields()[0].getName());
  27. assertTrue(java.util.Arrays.stream(method.getParameterTypes())
  28. .noneMatch(Map.class::isAssignableFrom));
  29. }
  30. @Test
  31. void returnsStableLocalizedTestEnvironmentRejection() {
  32. try (MockedStatic<MessageUtils> messages = mockStatic(MessageUtils.class)) {
  33. messages.when(() -> MessageUtils.message(anyString())).thenAnswer(call -> call.getArgument(0));
  34. OmgPaymentTokenUserResolver resolver = mock(OmgPaymentTokenUserResolver.class);
  35. OmgPaymentRefundService refundService = mock(OmgPaymentRefundService.class);
  36. when(resolver.requireUserId("token")).thenReturn(5L);
  37. when(refundService.refund(5L, "DD-1")).thenThrow(new OmgPaymentBusinessException(
  38. OmgPaymentErrorCode.PAYMENT_REFUND_UNAVAILABLE_IN_TEST_ENVIRONMENT));
  39. OmgRefundPaymentRequest request = new OmgRefundPaymentRequest();
  40. request.setOrderId("DD-1");
  41. AjaxResult result = controller(resolver, refundService).refund("token", request);
  42. assertEquals("omg.pay.refund.unavailable.test.environment", result.get("msg"));
  43. assertEquals("PAYMENT_REFUND_UNAVAILABLE_IN_TEST_ENVIRONMENT",
  44. ((OmgPaymentErrorResponse) result.get("data")).status());
  45. }
  46. }
  47. @Test
  48. void unexpectedFailureUsesStableRefundFailureWithoutLeakingToken() {
  49. try (MockedStatic<MessageUtils> messages = mockStatic(MessageUtils.class)) {
  50. messages.when(() -> MessageUtils.message(anyString())).thenAnswer(call -> call.getArgument(0));
  51. OmgPaymentTokenUserResolver resolver = mock(OmgPaymentTokenUserResolver.class);
  52. OmgPaymentRefundService refundService = mock(OmgPaymentRefundService.class);
  53. when(resolver.requireUserId("NEVER_LOG")).thenReturn(5L);
  54. when(refundService.refund(5L, "DD-1")).thenThrow(new IllegalStateException("unexpected"));
  55. OmgRefundPaymentRequest request = new OmgRefundPaymentRequest();
  56. request.setOrderId("DD-1");
  57. AjaxResult result = controller(resolver, refundService).refund("NEVER_LOG", request);
  58. assertEquals("PAYMENT_REFUND_FAILED",
  59. ((OmgPaymentErrorResponse) result.get("data")).status());
  60. }
  61. }
  62. private static OmgPaymentController controller(OmgPaymentTokenUserResolver resolver,
  63. OmgPaymentRefundService refundService) {
  64. return new OmgPaymentController(resolver, mock(OmgPaymentCreateService.class),
  65. mock(OmgPaymentNotifyService.class), mock(OmgIpnAuditService.class),
  66. mock(OmgPaymentQueryService.class), mock(OmgPaymentRetryService.class), refundService);
  67. }
  68. }