package com.ruoyi.user.service.impl;
|
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertThrows;
|
import static org.mockito.ArgumentMatchers.any;
|
import static org.mockito.Mockito.never;
|
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.when;
|
|
import java.math.BigDecimal;
|
import java.util.Collections;
|
import java.util.List;
|
|
import org.junit.jupiter.api.DisplayName;
|
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.extension.ExtendWith;
|
import org.mockito.ArgumentCaptor;
|
import org.mockito.InjectMocks;
|
import org.mockito.Mock;
|
import org.mockito.junit.jupiter.MockitoExtension;
|
import com.ruoyi.common.core.exception.ServiceException;
|
import com.ruoyi.user.domain.AccountLevelConfig;
|
import com.ruoyi.user.mapper.AccountLevelConfigMapper;
|
|
/**
|
* 等级配置服务单元测试
|
*
|
* 覆盖等级白名单(合法等级透传、非法/空等级拒绝且不落库)、读接口透传,
|
* 以及开关缺省时的归一化(空 -> 关闭,避免库里出现 NULL 这一「第三种状态」)。
|
*
|
* @author hugray
|
*/
|
@ExtendWith(MockitoExtension.class)
|
class AccountLevelConfigServiceImplTest
|
{
|
@Mock
|
private AccountLevelConfigMapper levelConfigMapper;
|
|
@InjectMocks
|
private AccountLevelConfigServiceImpl levelConfigService;
|
|
private static AccountLevelConfig configOf(String levelCode)
|
{
|
AccountLevelConfig config = new AccountLevelConfig();
|
config.setLevelCode(levelCode);
|
return config;
|
}
|
|
@Test
|
@DisplayName("合法等级应透传给 mapper")
|
void saveAccountLevelConfig_shouldPassThrough_whenLevelValid()
|
{
|
AccountLevelConfig config = configOf("L2");
|
config.setBuyQualify(AccountLevelConfig.SWITCH_ON);
|
config.setConsumeAmount(new BigDecimal("1000.00"));
|
when(levelConfigMapper.saveAccountLevelConfig(any(AccountLevelConfig.class))).thenReturn(1);
|
|
int rows = levelConfigService.saveAccountLevelConfig(config);
|
|
assertEquals(1, rows);
|
ArgumentCaptor<AccountLevelConfig> captor = ArgumentCaptor.forClass(AccountLevelConfig.class);
|
verify(levelConfigMapper).saveAccountLevelConfig(captor.capture());
|
assertEquals("L2", captor.getValue().getLevelCode());
|
assertEquals(new BigDecimal("1000.00"), captor.getValue().getConsumeAmount());
|
}
|
|
@Test
|
@DisplayName("等级不在 C/L1~L4 之内时应拒绝且不落库")
|
void saveAccountLevelConfig_shouldThrow_whenLevelUnknown()
|
{
|
ServiceException ex = assertThrows(ServiceException.class,
|
() -> levelConfigService.saveAccountLevelConfig(configOf("L5")));
|
assertEquals("等级不合法:L5", ex.getMessage());
|
// 放过自由值等于允许客户端造出第 6 个等级行,而前端只有 5 个 Tab 能显示它
|
verify(levelConfigMapper, never()).saveAccountLevelConfig(any(AccountLevelConfig.class));
|
}
|
|
@Test
|
@DisplayName("等级为空时应拒绝且不落库")
|
void saveAccountLevelConfig_shouldThrow_whenLevelEmpty()
|
{
|
assertThrows(ServiceException.class,
|
() -> levelConfigService.saveAccountLevelConfig(configOf(null)));
|
verify(levelConfigMapper, never()).saveAccountLevelConfig(any(AccountLevelConfig.class));
|
}
|
|
@Test
|
@DisplayName("开关为空时应按「关闭」落库")
|
void saveAccountLevelConfig_shouldDefaultSwitchesToOff_whenBlank()
|
{
|
when(levelConfigMapper.saveAccountLevelConfig(any(AccountLevelConfig.class))).thenReturn(1);
|
|
levelConfigService.saveAccountLevelConfig(configOf("C"));
|
|
ArgumentCaptor<AccountLevelConfig> captor = ArgumentCaptor.forClass(AccountLevelConfig.class);
|
verify(levelConfigMapper).saveAccountLevelConfig(captor.capture());
|
AccountLevelConfig saved = captor.getValue();
|
assertEquals(AccountLevelConfig.SWITCH_OFF, saved.getBuyQualify());
|
assertEquals(AccountLevelConfig.SWITCH_OFF, saved.getInviteWarehouseQualify());
|
assertEquals(AccountLevelConfig.SWITCH_OFF, saved.getPublicQualify());
|
assertEquals(AccountLevelConfig.SWITCH_OFF, saved.getConsumeAmountEnabled());
|
assertEquals(AccountLevelConfig.SWITCH_OFF, saved.getRecruitQtyEnabled());
|
assertEquals(AccountLevelConfig.SWITCH_OFF, saved.getRealNameAuthEnabled());
|
assertEquals(AccountLevelConfig.SWITCH_OFF, saved.getSubjectAuthEnabled());
|
}
|
|
@Test
|
@DisplayName("开关已显式填「开启」时不应被归一化覆盖")
|
void saveAccountLevelConfig_shouldKeepSwitchOn_whenExplicitlyOn()
|
{
|
AccountLevelConfig config = configOf("L4");
|
config.setBuyQualify(AccountLevelConfig.SWITCH_ON);
|
when(levelConfigMapper.saveAccountLevelConfig(any(AccountLevelConfig.class))).thenReturn(1);
|
|
levelConfigService.saveAccountLevelConfig(config);
|
|
ArgumentCaptor<AccountLevelConfig> captor = ArgumentCaptor.forClass(AccountLevelConfig.class);
|
verify(levelConfigMapper).saveAccountLevelConfig(captor.capture());
|
assertEquals(AccountLevelConfig.SWITCH_ON, captor.getValue().getBuyQualify());
|
}
|
|
@Test
|
@DisplayName("查询接口应透传 mapper 结果")
|
void selectAccountLevelConfigList_shouldPassThrough()
|
{
|
List<AccountLevelConfig> rows = Collections.singletonList(configOf("C"));
|
when(levelConfigMapper.selectAccountLevelConfigList()).thenReturn(rows);
|
|
assertEquals(rows, levelConfigService.selectAccountLevelConfigList());
|
}
|
}
|