StallBankCardControllerTest.java 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. package com.ruoyi.app.pay;
  2. import com.ruoyi.common.exception.ServiceException;
  3. import com.ruoyi.common.utils.spring.SpringUtils;
  4. import com.ruoyi.common.utils.DictUtils;
  5. import com.ruoyi.common.core.domain.entity.SysDictData;
  6. import com.ruoyi.app.pay.dto.BankCardSaveDto;
  7. import com.ruoyi.system.domain.InfoBankCard;
  8. import com.ruoyi.system.domain.InfoUser;
  9. import com.ruoyi.system.mapper.InfoBankCardMapper;
  10. import com.ruoyi.system.mapper.InfoUserMapper;
  11. import com.ruoyi.system.mapper.PosStoreMapper;
  12. import com.ruoyi.system.service.MerchantStoreAccessService;
  13. import com.ruoyi.system.service.StallPaymentAccessService;
  14. import com.baomidou.mybatisplus.core.MybatisConfiguration;
  15. import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
  16. import org.apache.ibatis.builder.MapperBuilderAssistant;
  17. import org.junit.jupiter.api.AfterAll;
  18. import org.junit.jupiter.api.BeforeAll;
  19. import org.junit.jupiter.api.BeforeEach;
  20. import org.junit.jupiter.api.Test;
  21. import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
  22. import org.springframework.beans.factory.support.DefaultListableBeanFactory;
  23. import org.springframework.context.support.StaticMessageSource;
  24. import org.springframework.test.util.ReflectionTestUtils;
  25. import java.util.Locale;
  26. import static org.junit.jupiter.api.Assertions.assertThrows;
  27. import static org.junit.jupiter.api.Assertions.assertTrue;
  28. import static org.mockito.ArgumentMatchers.any;
  29. import org.mockito.ArgumentCaptor;
  30. import static org.mockito.Mockito.mock;
  31. import static org.mockito.Mockito.inOrder;
  32. import static org.mockito.Mockito.never;
  33. import static org.mockito.Mockito.verify;
  34. import static org.mockito.Mockito.when;
  35. class StallBankCardControllerTest {
  36. private static ConfigurableListableBeanFactory originalBeanFactory;
  37. private InfoBankCardMapper cardMapper;
  38. private InfoUserMapper userMapper;
  39. private StallPaymentAccessService stallAccess;
  40. private PosStoreMapper storeMapper;
  41. private BankCardController controller;
  42. @BeforeAll
  43. static void messages() {
  44. TableInfoHelper.initTableInfo(new MapperBuilderAssistant(new MybatisConfiguration(), ""), InfoBankCard.class);
  45. originalBeanFactory = (ConfigurableListableBeanFactory)
  46. ReflectionTestUtils.getField(SpringUtils.class, "beanFactory");
  47. DefaultListableBeanFactory beans = new DefaultListableBeanFactory();
  48. StaticMessageSource messages = new StaticMessageSource();
  49. messages.addMessage("no.user.stop", Locale.getDefault(), "无权限");
  50. messages.addMessage("no.action.success", Locale.getDefault(), "成功");
  51. beans.registerSingleton("messageSource", messages);
  52. new SpringUtils().postProcessBeanFactory(beans);
  53. }
  54. @AfterAll
  55. static void restore() {
  56. new SpringUtils().postProcessBeanFactory(originalBeanFactory);
  57. }
  58. @BeforeEach
  59. void setUp() {
  60. cardMapper = mock(InfoBankCardMapper.class);
  61. userMapper = mock(InfoUserMapper.class);
  62. stallAccess = mock(StallPaymentAccessService.class);
  63. storeMapper = mock(PosStoreMapper.class);
  64. controller = new BankCardController(cardMapper, userMapper,
  65. mock(MerchantStoreAccessService.class), stallAccess, storeMapper);
  66. InfoUser owner = new InfoUser();
  67. owner.setUserType("4");
  68. when(userMapper.selectById(101L)).thenReturn(owner);
  69. when(stallAccess.resolveStoreId(101L)).thenReturn(11L);
  70. }
  71. @Test
  72. void stallOwnerCannotDeleteAnotherStallsCard() {
  73. InfoBankCard other = new InfoBankCard();
  74. other.setId(7L);
  75. other.setStoreId(12L);
  76. when(cardMapper.selectById(7L)).thenReturn(other);
  77. assertThrows(ServiceException.class, () ->
  78. controller.delete(com.ruoyi.system.utils.JwtUtil.setToken("101", "test"), 7L));
  79. verify(cardMapper, never()).deleteById(7L);
  80. }
  81. @Test
  82. void stallCardListIsScopedByStoreId() {
  83. when(cardMapper.selectList(any())).thenReturn(java.util.List.of());
  84. controller.list(com.ruoyi.system.utils.JwtUtil.setToken("101", "test"));
  85. @SuppressWarnings("rawtypes")
  86. ArgumentCaptor<com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper> query =
  87. ArgumentCaptor.forClass(com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper.class);
  88. verify(cardMapper).selectList(query.capture());
  89. assertTrue(query.getValue().getSqlSegment().contains("store_id"));
  90. }
  91. @Test
  92. void activatingStallCardLocksStallBeforeChangingActiveCards() {
  93. InfoBankCard card = new InfoBankCard();
  94. card.setId(7L);
  95. card.setStoreId(11L);
  96. when(cardMapper.selectById(7L)).thenReturn(card);
  97. when(storeMapper.lockStallForPayment(11L)).thenReturn(11L);
  98. controller.activate(com.ruoyi.system.utils.JwtUtil.setToken("101", "test"), 7L);
  99. org.mockito.InOrder order = inOrder(storeMapper, cardMapper);
  100. order.verify(storeMapper).lockStallForPayment(11L);
  101. order.verify(cardMapper).selectById(7L);
  102. order.verify(cardMapper, org.mockito.Mockito.times(2)).update(any(), any());
  103. }
  104. @Test
  105. void firstStallCardIsCountedOnlyAfterStallLock() {
  106. when(storeMapper.lockStallForPayment(11L)).thenReturn(11L);
  107. when(cardMapper.selectCount(any())).thenReturn(0L);
  108. SysDictData bank = new SysDictData();
  109. bank.setDictLabel("银行");
  110. BankCardSaveDto dto = new BankCardSaveDto();
  111. dto.setBankName("银行");
  112. dto.setAccountNo("123");
  113. dto.setAccountName("摊位");
  114. try (org.mockito.MockedStatic<DictUtils> dict = org.mockito.Mockito.mockStatic(DictUtils.class)) {
  115. dict.when(() -> DictUtils.getDictCache("taiwan_bank_list"))
  116. .thenReturn(java.util.List.of(bank));
  117. controller.add(com.ruoyi.system.utils.JwtUtil.setToken("101", "test"), dto);
  118. }
  119. org.mockito.InOrder order = inOrder(storeMapper, cardMapper);
  120. order.verify(storeMapper).lockStallForPayment(11L);
  121. order.verify(cardMapper).selectCount(any());
  122. ArgumentCaptor<InfoBankCard> inserted = ArgumentCaptor.forClass(InfoBankCard.class);
  123. order.verify(cardMapper).insert(inserted.capture());
  124. assertTrue(inserted.getValue().getIsActive() == 1);
  125. assertTrue(inserted.getValue().getStoreId() == 11L);
  126. }
  127. }