package com.ruoyi.other.service.impl;
|
|
import com.baomidou.mybatisplus.core.MybatisConfiguration;
|
import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
|
import com.ruoyi.other.api.domain.TChargeAuthorization;
|
import com.ruoyi.other.api.domain.TGroupCompany;
|
import com.ruoyi.other.api.dto.ChargeAuthorizationDTO;
|
import com.ruoyi.other.api.dto.ChargeTimeRange;
|
import com.ruoyi.other.api.support.ChargeAuthorizationSupport;
|
import com.ruoyi.other.mapper.TChargeAuthorizationMapper;
|
import com.ruoyi.other.mapper.TGroupCompanyMapper;
|
import org.apache.ibatis.builder.MapperBuilderAssistant;
|
import org.junit.jupiter.api.BeforeAll;
|
import org.junit.jupiter.api.Test;
|
import org.mockito.ArgumentCaptor;
|
import org.mockito.Mockito;
|
import org.springframework.test.util.ReflectionTestUtils;
|
|
import java.math.BigDecimal;
|
import java.util.Arrays;
|
import java.util.Collections;
|
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertNull;
|
import static org.junit.jupiter.api.Assertions.assertThrows;
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
|
/**
|
* 充电授权配置保存/详情逻辑单测,不依赖 Spring 容器与数据库。
|
*/
|
class TChargeAuthorizationServiceImplTest {
|
|
@BeforeAll
|
static void initTableInfo() {
|
// 初始化 MyBatis-Plus 表元数据,使 LambdaQueryWrapper 与 saveOrUpdate 可在无 Spring/DB 环境下解析字段
|
TableInfoHelper.initTableInfo(new MapperBuilderAssistant(new MybatisConfiguration(), ""),
|
TChargeAuthorization.class);
|
}
|
|
@Test
|
void insertsNewAuthorizationWithNormalizedFields() {
|
TChargeAuthorizationMapper mapper = Mockito.mock(TChargeAuthorizationMapper.class);
|
Mockito.when(mapper.selectList(Mockito.any())).thenReturn(Collections.emptyList());
|
Mockito.when(mapper.insert(Mockito.any(TChargeAuthorization.class))).thenAnswer(invocation -> {
|
TChargeAuthorization entity = invocation.getArgument(0);
|
entity.setId(66);
|
return 1;
|
});
|
TGroupCompanyMapper companyMapper = Mockito.mock(TGroupCompanyMapper.class);
|
Mockito.when(companyMapper.selectById(11)).thenReturn(company(11));
|
|
Integer id = buildService(mapper, companyMapper).saveAuthorization(dto());
|
|
assertEquals(66, id);
|
ArgumentCaptor<TChargeAuthorization> captor = ArgumentCaptor.forClass(TChargeAuthorization.class);
|
Mockito.verify(mapper).insert(captor.capture());
|
TChargeAuthorization saved = captor.getValue();
|
assertEquals(11, saved.getCompanyId());
|
assertEquals("9,8", saved.getPartnerIds());
|
assertEquals(2, saved.getTimeMode());
|
assertEquals(Arrays.asList(
|
new ChargeTimeRange("08:00", "12:00"), new ChargeTimeRange("13:00", "18:00")),
|
ChargeAuthorizationSupport.parseTimeRanges(saved.getTimeRanges()));
|
assertNull(saved.getPriceTypes());
|
assertEquals(Boolean.FALSE, saved.getAutoCharge());
|
assertEquals("5,3", saved.getSiteIds());
|
assertEquals(new BigDecimal("88.50"), saved.getDispatchAmount());
|
assertEquals(Boolean.FALSE, saved.getDelFlag());
|
}
|
|
@Test
|
void storesPriceTypesWhenTimeModeIsPrice() {
|
TChargeAuthorizationMapper mapper = Mockito.mock(TChargeAuthorizationMapper.class);
|
Mockito.when(mapper.selectList(Mockito.any())).thenReturn(Collections.emptyList());
|
Mockito.when(mapper.insert(Mockito.any(TChargeAuthorization.class))).thenReturn(1);
|
TGroupCompanyMapper companyMapper = Mockito.mock(TGroupCompanyMapper.class);
|
Mockito.when(companyMapper.selectById(11)).thenReturn(company(11));
|
|
ChargeAuthorizationDTO dto = dto();
|
dto.setTimeMode(3);
|
dto.setPriceTypes(Arrays.asList(2, 1, 2));
|
dto.setAutoCharge(true);
|
buildService(mapper, companyMapper).saveAuthorization(dto);
|
|
ArgumentCaptor<TChargeAuthorization> captor = ArgumentCaptor.forClass(TChargeAuthorization.class);
|
Mockito.verify(mapper).insert(captor.capture());
|
assertEquals("2,1", captor.getValue().getPriceTypes());
|
// 指定电价时段方式不再保存时段(即使请求带了时段也忽略)
|
assertNull(captor.getValue().getTimeRanges());
|
assertEquals(Boolean.TRUE, captor.getValue().getAutoCharge());
|
assertEquals("9,8", captor.getValue().getPartnerIds());
|
}
|
|
@Test
|
void clearsTimeRangeAndPriceTypesWhenTimeModeIsAllDay() {
|
TChargeAuthorizationMapper mapper = Mockito.mock(TChargeAuthorizationMapper.class);
|
Mockito.when(mapper.selectList(Mockito.any())).thenReturn(Collections.emptyList());
|
Mockito.when(mapper.insert(Mockito.any(TChargeAuthorization.class))).thenReturn(1);
|
TGroupCompanyMapper companyMapper = Mockito.mock(TGroupCompanyMapper.class);
|
Mockito.when(companyMapper.selectById(11)).thenReturn(company(11));
|
|
ChargeAuthorizationDTO dto = dto();
|
dto.setTimeMode(1);
|
buildService(mapper, companyMapper).saveAuthorization(dto);
|
|
ArgumentCaptor<TChargeAuthorization> captor = ArgumentCaptor.forClass(TChargeAuthorization.class);
|
Mockito.verify(mapper).insert(captor.capture());
|
assertNull(captor.getValue().getTimeRanges());
|
assertNull(captor.getValue().getPriceTypes());
|
}
|
|
@Test
|
void updatesExistingAuthorizationKeepingId() {
|
TChargeAuthorization existing = new TChargeAuthorization();
|
existing.setId(8);
|
existing.setCompanyId(11);
|
|
TChargeAuthorizationMapper mapper = Mockito.mock(TChargeAuthorizationMapper.class);
|
Mockito.when(mapper.selectList(Mockito.any())).thenReturn(Collections.singletonList(existing));
|
Mockito.when(mapper.selectById(8)).thenReturn(existing);
|
Mockito.when(mapper.updateById(Mockito.any(TChargeAuthorization.class))).thenReturn(1);
|
TGroupCompanyMapper companyMapper = Mockito.mock(TGroupCompanyMapper.class);
|
Mockito.when(companyMapper.selectById(11)).thenReturn(company(11));
|
|
Integer id = buildService(mapper, companyMapper).saveAuthorization(dto());
|
|
assertEquals(8, id);
|
ArgumentCaptor<TChargeAuthorization> captor = ArgumentCaptor.forClass(TChargeAuthorization.class);
|
Mockito.verify(mapper).updateById(captor.capture());
|
Mockito.verify(mapper, Mockito.never()).insert(Mockito.any(TChargeAuthorization.class));
|
assertEquals(2, captor.getValue().getTimeMode());
|
assertEquals("5,3", captor.getValue().getSiteIds());
|
assertEquals("9,8", captor.getValue().getPartnerIds());
|
}
|
|
@Test
|
void rejectsBlankCompanyId() {
|
TChargeAuthorizationMapper mapper = Mockito.mock(TChargeAuthorizationMapper.class);
|
TGroupCompanyMapper companyMapper = Mockito.mock(TGroupCompanyMapper.class);
|
ChargeAuthorizationDTO dto = dto();
|
dto.setCompanyId(null);
|
|
IllegalArgumentException error = assertThrows(IllegalArgumentException.class,
|
() -> buildService(mapper, companyMapper).saveAuthorization(dto));
|
|
assertEquals("配置所属公司不能为空", error.getMessage());
|
Mockito.verifyNoInteractions(mapper, companyMapper);
|
}
|
|
@Test
|
void rejectsBlankPartnerIdsWithoutPersist() {
|
TChargeAuthorizationMapper mapper = Mockito.mock(TChargeAuthorizationMapper.class);
|
TGroupCompanyMapper companyMapper = Mockito.mock(TGroupCompanyMapper.class);
|
Mockito.when(companyMapper.selectById(11)).thenReturn(company(11));
|
ChargeAuthorizationDTO dto = dto();
|
dto.setPartnerIds(Collections.emptyList());
|
|
IllegalArgumentException error = assertThrows(IllegalArgumentException.class,
|
() -> buildService(mapper, companyMapper).saveAuthorization(dto));
|
|
assertEquals("请至少选择一个充电商家", error.getMessage());
|
Mockito.verifyNoInteractions(mapper);
|
}
|
|
@Test
|
void rejectsWhenCompanyNotExists() {
|
TChargeAuthorizationMapper mapper = Mockito.mock(TChargeAuthorizationMapper.class);
|
TGroupCompanyMapper companyMapper = Mockito.mock(TGroupCompanyMapper.class);
|
Mockito.when(companyMapper.selectById(11)).thenReturn(null);
|
|
IllegalArgumentException error = assertThrows(IllegalArgumentException.class,
|
() -> buildService(mapper, companyMapper).saveAuthorization(dto()));
|
|
assertEquals("公司不存在", error.getMessage());
|
Mockito.verifyNoInteractions(mapper);
|
}
|
|
@Test
|
void rejectsOverlappedTimeRangesWithoutPersist() {
|
TChargeAuthorizationMapper mapper = Mockito.mock(TChargeAuthorizationMapper.class);
|
TGroupCompanyMapper companyMapper = Mockito.mock(TGroupCompanyMapper.class);
|
Mockito.when(companyMapper.selectById(11)).thenReturn(company(11));
|
ChargeAuthorizationDTO dto = dto();
|
dto.setTimeRanges(Arrays.asList(new ChargeTimeRange("08:00", "12:00"), new ChargeTimeRange("11:00", "15:00")));
|
|
IllegalArgumentException error = assertThrows(IllegalArgumentException.class,
|
() -> buildService(mapper, companyMapper).saveAuthorization(dto));
|
|
assertEquals("可用时段不能重叠", error.getMessage());
|
Mockito.verifyNoInteractions(mapper);
|
}
|
|
@Test
|
void rejectsBlankSiteIdsWithoutPersist() {
|
TChargeAuthorizationMapper mapper = Mockito.mock(TChargeAuthorizationMapper.class);
|
TGroupCompanyMapper companyMapper = Mockito.mock(TGroupCompanyMapper.class);
|
Mockito.when(companyMapper.selectById(11)).thenReturn(company(11));
|
ChargeAuthorizationDTO dto = dto();
|
dto.setSiteIds(Collections.emptyList());
|
|
IllegalArgumentException error = assertThrows(IllegalArgumentException.class,
|
() -> buildService(mapper, companyMapper).saveAuthorization(dto));
|
|
assertEquals("请至少选择一个可用电站", error.getMessage());
|
Mockito.verifyNoInteractions(mapper);
|
}
|
|
@Test
|
void rejectsBlankDispatchAmountWithoutPersist() {
|
TChargeAuthorizationMapper mapper = Mockito.mock(TChargeAuthorizationMapper.class);
|
TGroupCompanyMapper companyMapper = Mockito.mock(TGroupCompanyMapper.class);
|
Mockito.when(companyMapper.selectById(11)).thenReturn(company(11));
|
ChargeAuthorizationDTO dto = dto();
|
dto.setDispatchAmount(null);
|
|
IllegalArgumentException error = assertThrows(IllegalArgumentException.class,
|
() -> buildService(mapper, companyMapper).saveAuthorization(dto));
|
|
assertEquals("请输入充电下发金额", error.getMessage());
|
Mockito.verifyNoInteractions(mapper);
|
}
|
|
@Test
|
void returnsParsedDetailForExistingConfiguration() {
|
TChargeAuthorization entity = new TChargeAuthorization();
|
entity.setId(8);
|
entity.setCompanyId(11);
|
entity.setPartnerIds("9,8");
|
entity.setTimeMode(3);
|
entity.setTimeRanges("[{\"startTime\":\"08:00\",\"endTime\":\"12:00\"}]");
|
entity.setPriceTypes("1,4");
|
entity.setAutoCharge(true);
|
entity.setSiteIds("5,3");
|
entity.setDispatchAmount(new BigDecimal("66.00"));
|
|
TChargeAuthorizationMapper mapper = Mockito.mock(TChargeAuthorizationMapper.class);
|
Mockito.when(mapper.selectList(Mockito.any())).thenReturn(Collections.singletonList(entity));
|
|
ChargeAuthorizationDTO detail = buildService(mapper, Mockito.mock(TGroupCompanyMapper.class))
|
.getAuthorization(11);
|
|
assertEquals(11, detail.getCompanyId());
|
assertEquals(Arrays.asList(9, 8), detail.getPartnerIds());
|
assertEquals(3, detail.getTimeMode());
|
assertEquals(Collections.singletonList(new ChargeTimeRange("08:00", "12:00")), detail.getTimeRanges());
|
assertEquals(Arrays.asList(1, 4), detail.getPriceTypes());
|
assertEquals(Boolean.TRUE, detail.getAutoCharge());
|
assertEquals(Arrays.asList(5, 3), detail.getSiteIds());
|
assertEquals(new BigDecimal("66.00"), detail.getDispatchAmount());
|
}
|
|
@Test
|
void returnsNullDetailWhenCompanyIdIsNull() {
|
TChargeAuthorizationMapper mapper = Mockito.mock(TChargeAuthorizationMapper.class);
|
|
assertNull(buildService(mapper, Mockito.mock(TGroupCompanyMapper.class)).getAuthorization(null));
|
Mockito.verifyNoInteractions(mapper);
|
}
|
|
@Test
|
void returnsNullDetailWhenNotConfigured() {
|
TChargeAuthorizationMapper mapper = Mockito.mock(TChargeAuthorizationMapper.class);
|
Mockito.when(mapper.selectList(Mockito.any())).thenReturn(Collections.emptyList());
|
|
assertNull(buildService(mapper, Mockito.mock(TGroupCompanyMapper.class)).getAuthorization(11));
|
}
|
|
@Test
|
void normalizesBlankTimeAndSiteFieldsToEmptyCollections() {
|
TChargeAuthorization entity = new TChargeAuthorization();
|
entity.setCompanyId(11);
|
entity.setTimeMode(1);
|
entity.setAutoCharge(null);
|
|
TChargeAuthorizationMapper mapper = Mockito.mock(TChargeAuthorizationMapper.class);
|
Mockito.when(mapper.selectList(Mockito.any())).thenReturn(Collections.singletonList(entity));
|
|
ChargeAuthorizationDTO detail = buildService(mapper, Mockito.mock(TGroupCompanyMapper.class))
|
.getAuthorization(11);
|
|
assertTrue(detail.getTimeRanges().isEmpty());
|
assertTrue(detail.getPriceTypes().isEmpty());
|
assertTrue(detail.getSiteIds().isEmpty());
|
assertTrue(detail.getPartnerIds().isEmpty());
|
assertEquals(Boolean.FALSE, detail.getAutoCharge());
|
}
|
|
private TChargeAuthorizationServiceImpl buildService(TChargeAuthorizationMapper mapper,
|
TGroupCompanyMapper companyMapper) {
|
TChargeAuthorizationServiceImpl service = new TChargeAuthorizationServiceImpl();
|
ReflectionTestUtils.setField(service, "baseMapper", mapper);
|
ReflectionTestUtils.setField(service, "groupCompanyMapper", companyMapper);
|
return service;
|
}
|
|
private TGroupCompany company(Integer id) {
|
TGroupCompany company = new TGroupCompany();
|
company.setId(id);
|
company.setName("利普芯科技有限公司");
|
return company;
|
}
|
|
private ChargeAuthorizationDTO dto() {
|
ChargeAuthorizationDTO dto = new ChargeAuthorizationDTO();
|
dto.setCompanyId(11);
|
dto.setPartnerIds(Arrays.asList(9, 8, 9));
|
dto.setTimeMode(2);
|
dto.setTimeRanges(Arrays.asList(new ChargeTimeRange("08:00", "12:00"), new ChargeTimeRange("13:00", "18:00")));
|
dto.setAutoCharge(false);
|
dto.setSiteIds(Arrays.asList(5, 3));
|
dto.setDispatchAmount(new BigDecimal("88.5"));
|
return dto;
|
}
|
}
|