package com.ruoyi.other.service.impl;
|
|
import com.baomidou.mybatisplus.core.MybatisConfiguration;
|
import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.ruoyi.common.core.domain.R;
|
import com.ruoyi.other.api.domain.TGroupCompany;
|
import com.ruoyi.other.api.dto.CompanyRechargeRecordExcelDTO;
|
import com.ruoyi.other.api.dto.CompanyRechargeRecordQueryDTO;
|
import com.ruoyi.other.api.model.TCompanyRechargeRecord;
|
import com.ruoyi.other.mapper.TCompanyRechargeRecordMapper;
|
import com.ruoyi.other.mapper.TGroupCompanyMapper;
|
import com.ruoyi.other.service.CompanyAccountAccessService;
|
import com.ruoyi.system.api.domain.SysUser;
|
import com.ruoyi.system.api.feignClient.SysUserClient;
|
import org.apache.ibatis.builder.MapperBuilderAssistant;
|
import org.junit.jupiter.api.BeforeAll;
|
import org.junit.jupiter.api.Test;
|
import org.mockito.Mockito;
|
import org.springframework.test.util.ReflectionTestUtils;
|
|
import java.math.BigDecimal;
|
import java.time.LocalDateTime;
|
import java.util.Arrays;
|
import java.util.Collections;
|
import java.util.List;
|
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertNotEquals;
|
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
import static org.junit.jupiter.api.Assertions.assertThrows;
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
import static org.mockito.ArgumentMatchers.any;
|
import static org.mockito.ArgumentMatchers.eq;
|
|
/**
|
* 公司充值记录 服务实现类 单测:覆盖充值流水号生成、状态默认值、公司隔离、名称回填、Excel DTO 映射。
|
*/
|
class TCompanyRechargeRecordServiceImplTest {
|
|
@BeforeAll
|
static void initTableInfo() {
|
TableInfoHelper.initTableInfo(new MapperBuilderAssistant(new MybatisConfiguration(), ""),
|
TCompanyRechargeRecord.class);
|
}
|
|
@Test
|
void rechargeGeneratesSerialNoAndSetsStatusSuccess() {
|
TGroupCompany company = new TGroupCompany();
|
company.setId(100);
|
company.setName("M公司");
|
|
TGroupCompanyMapper groupCompanyMapper = Mockito.mock(TGroupCompanyMapper.class);
|
Mockito.when(groupCompanyMapper.selectById(100)).thenReturn(company);
|
|
TCompanyRechargeRecordMapper mapper = Mockito.mock(TCompanyRechargeRecordMapper.class);
|
Mockito.when(mapper.insert(any())).thenAnswer(invocation -> {
|
TCompanyRechargeRecord r = invocation.getArgument(0);
|
r.setId(555);
|
return 1;
|
});
|
|
CompanyAccountAccessService access = Mockito.mock(CompanyAccountAccessService.class);
|
SysUserClient userClient = Mockito.mock(SysUserClient.class);
|
|
TCompanyRechargeRecordServiceImpl service = new TCompanyRechargeRecordServiceImpl();
|
ReflectionTestUtils.setField(service, "groupCompanyMapper", groupCompanyMapper);
|
ReflectionTestUtils.setField(service, "companyAccountAccessService", access);
|
ReflectionTestUtils.setField(service, "sysUserClient", userClient);
|
ReflectionTestUtils.setField(service, "baseMapper", mapper);
|
|
TCompanyRechargeRecord in = new TCompanyRechargeRecord();
|
in.setCompanyId(100);
|
in.setPayAmount(new BigDecimal("1000.00"));
|
in.setGiftAmount(new BigDecimal("200.00"));
|
Integer newId = service.recharge(in);
|
assertEquals(555, newId);
|
assertEquals(1, in.getStatus());
|
assertNotNull(in.getSerialNo());
|
assertTrue(in.getSerialNo().startsWith("CR"));
|
assertEquals(LocalDateTime.now().toLocalDate(), in.getRechargeTime().toLocalDate());
|
assertEquals(new BigDecimal("1200.00"), in.getArrivalAmount());
|
// 验证公司余额原子加 setSql 触发
|
Mockito.verify(groupCompanyMapper, Mockito.times(1))
|
.update(eq(null), any());
|
}
|
|
@Test
|
void rechargeFailsWhenCompanyNotExists() {
|
TGroupCompanyMapper groupCompanyMapper = Mockito.mock(TGroupCompanyMapper.class);
|
Mockito.when(groupCompanyMapper.selectById(999)).thenReturn(null);
|
|
TCompanyRechargeRecordMapper mapper = Mockito.mock(TCompanyRechargeRecordMapper.class);
|
CompanyAccountAccessService access = Mockito.mock(CompanyAccountAccessService.class);
|
SysUserClient userClient = Mockito.mock(SysUserClient.class);
|
|
TCompanyRechargeRecordServiceImpl service = new TCompanyRechargeRecordServiceImpl();
|
ReflectionTestUtils.setField(service, "groupCompanyMapper", groupCompanyMapper);
|
ReflectionTestUtils.setField(service, "companyAccountAccessService", access);
|
ReflectionTestUtils.setField(service, "sysUserClient", userClient);
|
ReflectionTestUtils.setField(service, "baseMapper", mapper);
|
|
TCompanyRechargeRecord in = new TCompanyRechargeRecord();
|
in.setCompanyId(999);
|
in.setPayAmount(new BigDecimal("100"));
|
|
IllegalArgumentException ex = assertThrows(IllegalArgumentException.class, () -> service.recharge(in));
|
assertTrue(ex.getMessage().contains("公司不存在"));
|
Mockito.verifyNoInteractions(mapper);
|
}
|
|
@Test
|
@SuppressWarnings({"rawtypes", "unchecked"})
|
void pageListAppliesCompanyFilterAndFillsNames() {
|
TCompanyRechargeRecord r1 = new TCompanyRechargeRecord();
|
r1.setId(1);
|
r1.setCompanyId(100);
|
r1.setOperatorId(9001L);
|
r1.setPayAmount(new BigDecimal("100"));
|
TCompanyRechargeRecord r2 = new TCompanyRechargeRecord();
|
r2.setId(2);
|
r2.setCompanyId(200);
|
r2.setOperatorId(9002L);
|
r2.setPayAmount(new BigDecimal("50"));
|
|
Page pageResult = new Page(1, 10);
|
pageResult.setRecords(Arrays.asList(r1, r2));
|
pageResult.setTotal(2L);
|
|
TCompanyRechargeRecordMapper mapper = Mockito.mock(TCompanyRechargeRecordMapper.class);
|
Mockito.when(mapper.selectPage(any(Page.class), any())).thenReturn(pageResult);
|
|
TGroupCompanyMapper groupCompanyMapper = Mockito.mock(TGroupCompanyMapper.class);
|
TGroupCompany c1 = new TGroupCompany();
|
c1.setId(100);
|
c1.setName("A公司");
|
TGroupCompany c2 = new TGroupCompany();
|
c2.setId(200);
|
c2.setName("B公司");
|
Mockito.when(groupCompanyMapper.selectBatchIds(any())).thenReturn(Arrays.asList(c1, c2));
|
|
SysUserClient userClient = Mockito.mock(SysUserClient.class);
|
SysUser u1 = new SysUser();
|
u1.setUserId(9001L);
|
u1.setUserName("张三");
|
SysUser u2 = new SysUser();
|
u2.setUserId(9002L);
|
u2.setUserName("李四");
|
Mockito.when(userClient.getSysUser(9001L)).thenReturn(R.ok(u1));
|
Mockito.when(userClient.getSysUser(9002L)).thenReturn(R.ok(u2));
|
|
CompanyAccountAccessService access = Mockito.mock(CompanyAccountAccessService.class);
|
// 当前请求携带 companyId=null,且当前账号非公司账号 → resolveCompanyFilter 返回 null(不限)
|
Mockito.when(access.resolveCompanyFilter(null)).thenReturn(null);
|
|
TCompanyRechargeRecordServiceImpl service = new TCompanyRechargeRecordServiceImpl();
|
ReflectionTestUtils.setField(service, "baseMapper", mapper);
|
ReflectionTestUtils.setField(service, "groupCompanyMapper", groupCompanyMapper);
|
ReflectionTestUtils.setField(service, "sysUserClient", userClient);
|
ReflectionTestUtils.setField(service, "companyAccountAccessService", access);
|
|
CompanyRechargeRecordQueryDTO query = new CompanyRechargeRecordQueryDTO();
|
query.setCurrent(1);
|
query.setSize(10);
|
com.ruoyi.common.core.web.page.PageInfo<TCompanyRechargeRecord> page = service.pageList(query);
|
|
assertEquals(2L, page.getTotal());
|
assertEquals(2, page.getRecords().size());
|
assertEquals("A公司", page.getRecords().get(0).getCompanyName());
|
assertEquals("张三", page.getRecords().get(0).getOperatorName());
|
assertEquals("B公司", page.getRecords().get(1).getCompanyName());
|
assertEquals("李四", page.getRecords().get(1).getOperatorName());
|
}
|
|
@Test
|
@SuppressWarnings("unchecked")
|
void selectExportListMapsToExcelDto() {
|
TCompanyRechargeRecord r1 = new TCompanyRechargeRecord();
|
r1.setId(1);
|
r1.setSerialNo("CR20260930101500001");
|
r1.setCompanyId(100);
|
r1.setPayAmount(new BigDecimal("100"));
|
r1.setGiftAmount(new BigDecimal("20"));
|
r1.setArrivalAmount(new BigDecimal("120"));
|
r1.setStatus(1);
|
r1.setOperatorId(9001L);
|
r1.setCompanyName("A公司");
|
r1.setOperatorName("张三");
|
r1.setRechargeTime(LocalDateTime.of(2026, 9, 30, 10, 15, 0));
|
|
TCompanyRechargeRecordMapper mapper = Mockito.mock(TCompanyRechargeRecordMapper.class);
|
Mockito.when(mapper.selectList(any())).thenReturn(Collections.singletonList(r1));
|
|
// fillNames 会重新覆盖 companyName/operatorName,必须 stub 远程查询
|
TGroupCompanyMapper groupCompanyMapper = Mockito.mock(TGroupCompanyMapper.class);
|
TGroupCompany c1 = new TGroupCompany();
|
c1.setId(100);
|
c1.setName("A公司");
|
Mockito.when(groupCompanyMapper.selectBatchIds(any())).thenReturn(Collections.singletonList(c1));
|
SysUserClient userClient = Mockito.mock(SysUserClient.class);
|
SysUser u1 = new SysUser();
|
u1.setUserId(9001L);
|
u1.setUserName("张三");
|
Mockito.when(userClient.getSysUser(9001L)).thenReturn(R.ok(u1));
|
|
TCompanyRechargeRecordServiceImpl service = new TCompanyRechargeRecordServiceImpl();
|
ReflectionTestUtils.setField(service, "baseMapper", mapper);
|
ReflectionTestUtils.setField(service, "groupCompanyMapper", groupCompanyMapper);
|
ReflectionTestUtils.setField(service, "sysUserClient", userClient);
|
ReflectionTestUtils.setField(service, "companyAccountAccessService",
|
Mockito.mock(CompanyAccountAccessService.class));
|
|
CompanyRechargeRecordQueryDTO query = new CompanyRechargeRecordQueryDTO();
|
query.setStatus(1);
|
List<CompanyRechargeRecordExcelDTO> list = service.selectExportList(query);
|
|
assertEquals(1, list.size());
|
CompanyRechargeRecordExcelDTO dto = list.get(0);
|
assertEquals("CR20260930101500001", dto.getSerialNo());
|
assertEquals("A公司", dto.getCompanyName());
|
assertEquals(new BigDecimal("120"), dto.getArrivalAmount());
|
assertEquals(1, dto.getStatus());
|
assertEquals("张三", dto.getOperatorName());
|
assertNotEquals(null, dto.getRechargeTime());
|
}
|
}
|