|
@@ -0,0 +1,192 @@
|
|
|
|
|
+package com.etotem.cfc.service;
|
|
|
|
|
+
|
|
|
|
|
+import static org.junit.jupiter.api.Assertions.*;
|
|
|
|
|
+import static org.mockito.ArgumentMatchers.*;
|
|
|
|
|
+import static org.mockito.Mockito.*;
|
|
|
|
|
+
|
|
|
|
|
+import java.util.HashMap;
|
|
|
|
|
+import java.util.Map;
|
|
|
|
|
+
|
|
|
|
|
+import org.junit.jupiter.api.Test;
|
|
|
|
|
+import org.junit.jupiter.api.extension.ExtendWith;
|
|
|
|
|
+import org.mockito.InjectMocks;
|
|
|
|
|
+import org.mockito.Mock;
|
|
|
|
|
+import org.mockito.junit.jupiter.MockitoExtension;
|
|
|
|
|
+import org.mockito.junit.jupiter.MockitoSettings;
|
|
|
|
|
+import org.mockito.quality.Strictness;
|
|
|
|
|
+
|
|
|
|
|
+import com.etotem.cfc.dto.VirtualPayParamsDTO;
|
|
|
|
|
+import com.etotem.cfc.entity.MembershipLevel;
|
|
|
|
|
+import com.etotem.cfc.entity.PaymentOrder;
|
|
|
|
|
+import com.etotem.cfc.mapper.*;
|
|
|
|
|
+import com.etotem.cfc.entity.Family;
|
|
|
|
|
+import com.etotem.cfc.entity.User;
|
|
|
|
|
+
|
|
|
|
|
+@MockitoSettings(strictness = Strictness.LENIENT)
|
|
|
|
|
+@ExtendWith(MockitoExtension.class)
|
|
|
|
|
+class MembershipPaySwitchTest {
|
|
|
|
|
+
|
|
|
|
|
+ @InjectMocks
|
|
|
|
|
+ private MembershipService membershipService;
|
|
|
|
|
+
|
|
|
|
|
+ @Mock private MembershipLevelMapper levelMapper;
|
|
|
|
|
+ @Mock private FamilyMembershipMapper membershipMapper;
|
|
|
|
|
+ @Mock private FamilyMapper familyMapper;
|
|
|
|
|
+ @Mock private UserMapper userMapper;
|
|
|
|
|
+ @Mock private PaymentOrderMapper paymentOrderMapper;
|
|
|
|
|
+ @Mock private CommissionService commissionService;
|
|
|
|
|
+ @Mock private SysConfigService sysConfigService;
|
|
|
|
|
+ @Mock private MemberUpgradeRecordMapper memberUpgradeRecordMapper;
|
|
|
|
|
+ @Mock private MembershipBenefitsMapper benefitsMapper;
|
|
|
|
|
+ @Mock private CouponService couponService;
|
|
|
|
|
+ @Mock private TrialMembershipMapper trialMembershipMapper;
|
|
|
|
|
+ @Mock private VirtualGoodsConfigService virtualGoodsConfigService;
|
|
|
|
|
+ @Mock private VirtualPayService virtualPayService;
|
|
|
|
|
+ @Mock private PaymentService paymentService;
|
|
|
|
|
+
|
|
|
|
|
+ // --- 虚拟支付开启(默认) ---
|
|
|
|
|
+
|
|
|
|
|
+ @Test
|
|
|
|
|
+ void createOrderWithPayType_virtualEnabled_returnsVirtualPayType() {
|
|
|
|
|
+ when(sysConfigService.getValue("member_pay_virtual_enabled")).thenReturn("1");
|
|
|
|
|
+ when(sysConfigService.getValue("member_fee_family")).thenReturn("131400");
|
|
|
|
|
+ when(levelMapper.selectOne(any())).thenReturn(buildLevel("FAMILY", 131400, null, null));
|
|
|
|
|
+ when(paymentOrderMapper.selectCount(any())).thenReturn(0L);
|
|
|
|
|
+ when(couponService.apply(anyLong(), anyLong(), anyString(), anyInt())).thenReturn(null);
|
|
|
|
|
+ when(paymentOrderMapper.insert(any())).thenReturn(1);
|
|
|
|
|
+
|
|
|
|
|
+ VirtualPayParamsDTO mockDto = new VirtualPayParamsDTO();
|
|
|
|
|
+ mockDto.setOrderInfo(new HashMap<>());
|
|
|
|
|
+ mockDto.setSign("mock-sign");
|
|
|
|
|
+ mockDto.setSignature("mock-sig");
|
|
|
|
|
+ when(virtualPayService.generateMembershipPayParams(anyString(), anyString())).thenReturn(mockDto);
|
|
|
|
|
+
|
|
|
|
|
+ User user = new User();
|
|
|
|
|
+ user.setFamilyId(1L);
|
|
|
|
|
+ when(userMapper.selectById(1L)).thenReturn(user);
|
|
|
|
|
+
|
|
|
|
|
+ Map<String, Object> result = membershipService.createOrderWithPayType(
|
|
|
|
|
+ 1L, 1L, "FAMILY", "pay", "yearly", null, "mockSessionKey", null);
|
|
|
|
|
+
|
|
|
|
|
+ assertNotNull(result);
|
|
|
|
|
+ assertEquals("virtual", result.get("payType"));
|
|
|
|
|
+ assertEquals("ORD", result.get("orderNo") != null ? result.get("orderNo").toString().substring(0, 3) : "");
|
|
|
|
|
+ assertNotNull(result.get("orderInfo"));
|
|
|
|
|
+ assertNotNull(result.get("sign"));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // --- 虚拟支付关闭 ---
|
|
|
|
|
+
|
|
|
|
|
+ @Test
|
|
|
|
|
+ void createOrderWithPayType_virtualDisabled_returnsWechatPayType() {
|
|
|
|
|
+ when(sysConfigService.getValue("member_pay_virtual_enabled")).thenReturn("0");
|
|
|
|
|
+ when(sysConfigService.getValue("member_fee_family")).thenReturn("131400");
|
|
|
|
|
+ when(levelMapper.selectOne(any())).thenReturn(buildLevel("FAMILY", 131400, null, null));
|
|
|
|
|
+ when(paymentOrderMapper.selectCount(any())).thenReturn(0L);
|
|
|
|
|
+ when(couponService.apply(anyLong(), anyLong(), anyString(), anyInt())).thenReturn(null);
|
|
|
|
|
+ when(paymentOrderMapper.insert(any())).thenReturn(1);
|
|
|
|
|
+
|
|
|
|
|
+ Map<String, Object> mockWechatParams = new HashMap<>();
|
|
|
|
|
+ mockWechatParams.put("appId", "wx5ba8038ef16fb245");
|
|
|
|
|
+ mockWechatParams.put("timeStamp", "1724900000");
|
|
|
|
|
+ mockWechatParams.put("package", "prepay_id=wx_mock");
|
|
|
|
|
+ when(paymentService.createWechatPrepay(anyString(), anyString(), anyInt(), anyString()))
|
|
|
|
|
+ .thenReturn(mockWechatParams);
|
|
|
|
|
+
|
|
|
|
|
+ User user = new User();
|
|
|
|
|
+ user.setFamilyId(1L);
|
|
|
|
|
+ when(userMapper.selectById(1L)).thenReturn(user);
|
|
|
|
|
+
|
|
|
|
|
+ Map<String, Object> result = membershipService.createOrderWithPayType(
|
|
|
|
|
+ 1L, 1L, "FAMILY", "pay", "yearly", null, "mockSessionKey", "mockOpenid");
|
|
|
|
|
+
|
|
|
|
|
+ assertNotNull(result);
|
|
|
|
|
+ assertEquals("wechat", result.get("payType"));
|
|
|
|
|
+ assertNotNull(result.get("wechatPayParams"));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Test
|
|
|
|
|
+ void createOrderWithPayType_virtualDisabled_noSplit() {
|
|
|
|
|
+ when(sysConfigService.getValue("member_pay_virtual_enabled")).thenReturn("0");
|
|
|
|
|
+ when(sysConfigService.getValue("member_fee_family")).thenReturn("131400");
|
|
|
|
|
+ when(levelMapper.selectOne(any())).thenReturn(buildLevel("FAMILY", 131400, null, null));
|
|
|
|
|
+ when(paymentOrderMapper.selectCount(any())).thenReturn(0L);
|
|
|
|
|
+ when(couponService.apply(anyLong(), anyLong(), anyString(), anyInt())).thenReturn(null);
|
|
|
|
|
+ when(paymentOrderMapper.insert(any())).thenReturn(1);
|
|
|
|
|
+
|
|
|
|
|
+ Map<String, Object> mockWechatParams = new HashMap<>();
|
|
|
|
|
+ mockWechatParams.put("package", "prepay_id=wx_mock");
|
|
|
|
|
+ when(paymentService.createWechatPrepay(anyString(), anyString(), anyInt(), anyString()))
|
|
|
|
|
+ .thenReturn(mockWechatParams);
|
|
|
|
|
+
|
|
|
|
|
+ User user = new User();
|
|
|
|
|
+ user.setFamilyId(1L);
|
|
|
|
|
+ when(userMapper.selectById(1L)).thenReturn(user);
|
|
|
|
|
+
|
|
|
|
|
+ Map<String, Object> result = membershipService.createOrderWithPayType(
|
|
|
|
|
+ 1L, 1L, "FAMILY", "pay", "yearly", null, "mockSessionKey", "mockOpenid");
|
|
|
|
|
+
|
|
|
|
|
+ assertNotNull(result);
|
|
|
|
|
+ assertEquals("wechat", result.get("payType"));
|
|
|
|
|
+ assertNull(result.get("groupNo"));
|
|
|
|
|
+ assertEquals(1, result.get("totalPeriods"));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // --- trial 路径 ---
|
|
|
|
|
+
|
|
|
|
|
+ @Test
|
|
|
|
|
+ void createOrderWithPayType_trial_returnsNone() {
|
|
|
|
|
+ when(sysConfigService.getValue("member_pay_virtual_enabled")).thenReturn("1");
|
|
|
|
|
+ when(sysConfigService.getValue("member_fee_family")).thenReturn("131400");
|
|
|
|
|
+ when(levelMapper.selectOne(any())).thenReturn(buildLevel("FAMILY", 131400, null, null));
|
|
|
|
|
+ when(paymentOrderMapper.selectCount(any())).thenReturn(0L);
|
|
|
|
|
+ when(paymentOrderMapper.insert(any())).thenReturn(1);
|
|
|
|
|
+
|
|
|
|
|
+ User user = new User();
|
|
|
|
|
+ user.setFamilyId(1L);
|
|
|
|
|
+ when(userMapper.selectById(1L)).thenReturn(user);
|
|
|
|
|
+
|
|
|
|
|
+ Family family = new Family();
|
|
|
|
|
+ family.setId(1L);
|
|
|
|
|
+ when(familyMapper.selectById(1L)).thenReturn(family);
|
|
|
|
|
+
|
|
|
|
|
+ Map<String, Object> result = membershipService.createOrderWithPayType(
|
|
|
|
|
+ 1L, 1L, "FAMILY", "trial", null, null, "mockSessionKey", null);
|
|
|
|
|
+
|
|
|
|
|
+ assertNotNull(result);
|
|
|
|
|
+ assertEquals("none", result.get("payType"));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // --- 道具未配置 ---
|
|
|
|
|
+
|
|
|
|
|
+ @Test
|
|
|
|
|
+ void createOrderWithPayType_virtualEnabled_configMissing_returnsNull() {
|
|
|
|
|
+ when(sysConfigService.getValue("member_pay_virtual_enabled")).thenReturn("1");
|
|
|
|
|
+ when(sysConfigService.getValue("member_fee_family")).thenReturn("131400");
|
|
|
|
|
+ when(levelMapper.selectOne(any())).thenReturn(buildLevel("FAMILY", 131400, null, null));
|
|
|
|
|
+ when(paymentOrderMapper.selectCount(any())).thenReturn(0L);
|
|
|
|
|
+ when(couponService.apply(anyLong(), anyLong(), anyString(), anyInt())).thenReturn(null);
|
|
|
|
|
+ when(paymentOrderMapper.insert(any())).thenReturn(1);
|
|
|
|
|
+ when(virtualPayService.generateMembershipPayParams(anyString(), anyString())).thenReturn(null);
|
|
|
|
|
+
|
|
|
|
|
+ User user = new User();
|
|
|
|
|
+ user.setFamilyId(1L);
|
|
|
|
|
+ when(userMapper.selectById(1L)).thenReturn(user);
|
|
|
|
|
+
|
|
|
|
|
+ Map<String, Object> result = membershipService.createOrderWithPayType(
|
|
|
|
|
+ 1L, 1L, "FAMILY", "pay", "yearly", null, "mockSessionKey", null);
|
|
|
|
|
+
|
|
|
|
|
+ assertNull(result);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // --- 辅助方法 ---
|
|
|
|
|
+
|
|
|
|
|
+ private MembershipLevel buildLevel(String code, int yearly, Integer monthly, Integer quarterly) {
|
|
|
|
|
+ MembershipLevel level = new MembershipLevel();
|
|
|
|
|
+ level.setLevelCode(code);
|
|
|
|
|
+ level.setPriceYearly(yearly);
|
|
|
|
|
+ level.setPriceMonthly(monthly);
|
|
|
|
|
+ level.setPriceQuarterly(quarterly);
|
|
|
|
|
+ return level;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|