puzhibing
2026-09-28 83188a6c8ea2f123519378da736382a9136a4331
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
package com.ruoyi.account.service.impl;
 
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.ruoyi.account.api.model.TAppUser;
import com.ruoyi.account.api.model.TAppUserWhitelist;
import com.ruoyi.account.api.vo.AppUserWhitelistImportResultVO;
import com.ruoyi.account.mapper.TAppUserWhitelistMapper;
import com.ruoyi.account.service.TAppUserService;
import com.ruoyi.account.service.TAppUserWhitelistSiteService;
import com.ruoyi.chargingPile.api.feignClient.PartnerClient;
import com.ruoyi.chargingPile.api.feignClient.SiteClient;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.security.service.TokenService;
import com.ruoyi.other.api.feignClient.GroupCompanyClient;
import com.ruoyi.system.api.feignClient.SysUserClient;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.test.util.ReflectionTestUtils;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionStatus;
 
import java.io.ByteArrayOutputStream;
import java.util.Collections;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;
 
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
 
@ExtendWith(MockitoExtension.class)
class TAppUserWhitelistServiceImplTest {
    @Mock private TAppUserWhitelistMapper mapper;
    @Mock private TAppUserWhitelistSiteService whitelistSiteService;
    @Mock private TAppUserService appUserService;
    @Mock private SiteClient siteClient;
    @Mock private PartnerClient partnerClient;
    @Mock private TokenService tokenService;
    @Mock private SysUserClient sysUserClient;
    @Mock private PlatformTransactionManager transactionManager;
    @Mock private GroupCompanyClient groupCompanyClient;
    @Mock private RedissonClient redissonClient;
 
    private TAppUserWhitelistServiceImpl service;
 
    @BeforeEach
    void setUp() {
        service = new TAppUserWhitelistServiceImpl();
        ReflectionTestUtils.setField(service, "baseMapper", mapper);
        ReflectionTestUtils.setField(service, "whitelistSiteService", whitelistSiteService);
        ReflectionTestUtils.setField(service, "appUserService", appUserService);
        ReflectionTestUtils.setField(service, "siteClient", siteClient);
        ReflectionTestUtils.setField(service, "partnerClient", partnerClient);
        ReflectionTestUtils.setField(service, "tokenService", tokenService);
        ReflectionTestUtils.setField(service, "sysUserClient", sysUserClient);
        ReflectionTestUtils.setField(service, "transactionManager", transactionManager);
        ReflectionTestUtils.setField(service, "groupCompanyClient", groupCompanyClient);
        ReflectionTestUtils.setField(service, "redissonClient", redissonClient);
        RLock lock = mock(RLock.class);
        when(redissonClient.getLock(any())).thenReturn(lock);
        try {
            when(lock.tryLock(anyLong(), anyLong(), any(TimeUnit.class))).thenReturn(true);
        } catch (InterruptedException exception) {
            throw new IllegalStateException(exception);
        }
    }
 
    @Test
    void importsValidRowsAndReturnsOnlyInvalidRows() throws Exception {
        when(siteClient.getSiteAll()).thenReturn(R.ok(Collections.emptyList()));
        when(mapper.selectValidByPhone(any())).thenReturn(null);
        TransactionStatus transactionStatus = mock(TransactionStatus.class);
        when(transactionManager.getTransaction(any())).thenReturn(transactionStatus);
        LambdaQueryChainWrapper<TAppUser> appUserQuery = mock(LambdaQueryChainWrapper.class);
        when(appUserService.lambdaQuery()).thenReturn(appUserQuery);
        when(appUserQuery.eq(any(), any())).thenReturn(appUserQuery);
        when(appUserQuery.last(any())).thenReturn(appUserQuery);
        when(appUserQuery.one()).thenReturn(null);
        AtomicLong ids = new AtomicLong(1L);
        doAnswer(invocation -> {
            TAppUserWhitelist whitelist = invocation.getArgument(0);
            whitelist.setId(ids.getAndIncrement());
            return 1;
        }).when(mapper).insert(any(TAppUserWhitelist.class));
 
        AppUserWhitelistImportResultVO result = service.importWhitelist(importFile());
 
        assertEquals(3, result.getTotalCount());
        assertEquals(2, result.getSuccessCount());
        assertEquals(1, result.getErrorCount());
        assertEquals("13540211237", result.getErrorMessage().get(0).getPhone());
        verify(mapper, org.mockito.Mockito.times(2)).insert(any(TAppUserWhitelist.class));
    }
 
    private MockMultipartFile importFile() throws Exception {
        try (XSSFWorkbook workbook = new XSSFWorkbook(); ByteArrayOutputStream output = new ByteArrayOutputStream()) {
            org.apache.poi.ss.usermodel.Sheet sheet = workbook.createSheet("白名单用户");
            org.apache.poi.ss.usermodel.Row header = sheet.createRow(0);
            header.createCell(0).setCellValue("用户手机号");
            header.createCell(1).setCellValue("享受权益");
            header.createCell(2).setCellValue("白名单电站");
            addRow(sheet, 1, "13540211236", "1", "all");
            addRow(sheet, 2, "13540211238", "2", "all");
            addRow(sheet, 3, "13540211237", "", "all");
            workbook.write(output);
            return new MockMultipartFile("file", "whitelist.xlsx",
                    "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", output.toByteArray());
        }
    }
 
    private void addRow(org.apache.poi.ss.usermodel.Sheet sheet, int index,
                        String phone, String benefitType, String whitelistSite) {
        org.apache.poi.ss.usermodel.Row row = sheet.createRow(index);
        row.createCell(0).setCellValue(phone);
        row.createCell(1).setCellValue(benefitType);
        row.createCell(2).setCellValue(whitelistSite);
    }
}