UserInvoiceAuthResponseTest.java 4.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. package com.ruoyi.app.order;
  2. import com.github.pagehelper.PageHelper;
  3. import com.ruoyi.common.core.redis.RedisCache;
  4. import com.ruoyi.common.utils.MessageUtils;
  5. import com.ruoyi.system.domain.vo.PosOrderInvoiceVo;
  6. import com.ruoyi.system.utils.AuthAspect;
  7. import com.ruoyi.system.utils.JwtUtil;
  8. import org.junit.jupiter.api.Test;
  9. import org.springframework.aop.aspectj.annotation.AspectJProxyFactory;
  10. import org.springframework.mock.web.MockHttpServletRequest;
  11. import org.springframework.mock.web.MockHttpServletResponse;
  12. import org.springframework.test.util.ReflectionTestUtils;
  13. import java.util.List;
  14. import java.util.Map;
  15. import static org.junit.jupiter.api.Assertions.*;
  16. import static org.mockito.Mockito.*;
  17. /** 使用真实Controller代理复现鉴权失败时的checkcast,而不是直接调用切面绕过代理。 */
  18. class UserInvoiceAuthResponseTest {
  19. private MockHttpServletResponse response;
  20. @Test
  21. void expiredAndRevokedSessionReturn401WithoutCastingPaginationToAjaxResult() {
  22. RedisCache redis = mock(RedisCache.class);
  23. OrderInvoiceService invoices = mock(OrderInvoiceService.class);
  24. MockHttpServletRequest request = new MockHttpServletRequest();
  25. request.addHeader("token", "expired-fixture");
  26. UserOrderController controller = proxy(request, redis, invoices);
  27. try (var jwt = mockStatic(JwtUtil.class)) {
  28. jwt.when(() -> JwtUtil.verifyToken("expired-fixture")).thenReturn(Map.of("valid", false));
  29. var result = assertDoesNotThrow(() -> controller.myInvoices("expired-fixture", 1, 10));
  30. assertEquals(401, result.getCode());
  31. assertEquals(401, response.getStatus());
  32. assertEquals(0, result.getTotal());
  33. assertTrue(result.getRows().isEmpty());
  34. assertFalse(result.getMsg().isBlank());
  35. assertEquals(401, controller.loveOrgList("expired-fixture", 1, 20, null).getCode());
  36. response.setStatus(200);
  37. assertEquals(401, controller.getInvoice("expired-fixture", 123L).get("code"));
  38. assertEquals(401, response.getStatus()); // 原AjaxResult接口也是真实HTTP401。
  39. // 签名有效但会话被顶号/登出,也必须返回分页形状的401,不进入查询。
  40. jwt.when(() -> JwtUtil.verifyToken("expired-fixture")).thenReturn(
  41. Map.of("valid", true, "id", "7", "jti", "qtw_tokens:user:7:revoked"));
  42. when(redis.hasKey("qtw_tokens:user:7:revoked")).thenReturn(false);
  43. response.setStatus(200);
  44. assertEquals(401, controller.myInvoices("expired-fixture", 1, 10).getCode());
  45. assertEquals(401, response.getStatus());
  46. verifyNoInteractions(invoices);
  47. }
  48. }
  49. @Test
  50. void validSessionKeepsExistingUserScopedRowsTotalAndCode() {
  51. RedisCache redis = mock(RedisCache.class);
  52. OrderInvoiceService invoices = mock(OrderInvoiceService.class);
  53. String token = JwtUtil.token("7", "user");
  54. MockHttpServletRequest request = new MockHttpServletRequest();
  55. request.addHeader("token", token);
  56. PosOrderInvoiceVo invoice = new PosOrderInvoiceVo(); invoice.setOrderId(123L);
  57. when(invoices.listMyInvoices(7L)).thenReturn(List.of(invoice));
  58. try (var messages = mockStatic(MessageUtils.class, call -> call.getArgument(0))) {
  59. var result = proxy(request, redis, invoices).myInvoices(token, 1, 10);
  60. assertEquals(200, result.getCode());
  61. assertEquals(200, response.getStatus());
  62. assertEquals(1, result.getTotal());
  63. assertSame(invoice, result.getRows().get(0));
  64. verify(invoices).listMyInvoices(7L);
  65. } finally { PageHelper.clearPage(); }
  66. }
  67. private UserOrderController proxy(MockHttpServletRequest request, RedisCache redis, OrderInvoiceService invoices) {
  68. UserOrderController target = new UserOrderController();
  69. ReflectionTestUtils.setField(target, "orderInvoiceService", invoices);
  70. AuthAspect aspect = new AuthAspect(redis);
  71. aspect.setHttpServletRequest(request);
  72. response = new MockHttpServletResponse();
  73. aspect.setHttpServletResponse(response);
  74. AspectJProxyFactory factory = new AspectJProxyFactory(target);
  75. factory.setProxyTargetClass(true);
  76. factory.addAspect(aspect);
  77. return factory.getProxy();
  78. }
  79. }