更新ASIN库新需求

This commit is contained in:
super
2026-07-20 20:12:38 +08:00
parent cbde22ec79
commit ba48bbc6af
13 changed files with 1313 additions and 212 deletions

View File

@@ -0,0 +1,185 @@
package com.nanri.aiimage.modules.dedupe.service;
import com.nanri.aiimage.modules.dedupe.mapper.DedupeTotalDataMapper;
import com.nanri.aiimage.modules.dedupe.model.dto.DedupeTotalDataCreateRequest;
import com.nanri.aiimage.modules.dedupe.model.entity.DedupeTotalDataEntity;
import com.nanri.aiimage.modules.dedupe.model.vo.DedupeTotalDataItemVo;
import com.nanri.aiimage.modules.dedupe.model.vo.DedupeTotalDataPageVo;
import com.nanri.aiimage.modules.permission.mapper.AdminUserMapper;
import com.nanri.aiimage.modules.permission.model.entity.AdminUserEntity;
import com.nanri.aiimage.modules.shopkey.mapper.ShopManageGroupMapper;
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 org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.web.server.ResponseStatusException;
import java.io.ByteArrayOutputStream;
import java.util.List;
import java.util.Set;
import static org.junit.jupiter.api.Assertions.assertEquals;
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.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
class DedupeTotalDataServiceTest {
@Mock
private DedupeTotalDataMapper dedupeTotalDataMapper;
@Mock
private AdminUserMapper adminUserMapper;
@Mock
private ShopManageGroupMapper shopManageGroupMapper;
@Mock
private PlatformTransactionManager transactionManager;
@InjectMocks
private DedupeTotalDataService service;
@Test
void createRecordsUploaderIdentity() {
AdminUserEntity uploader = user(23L, "normal", "member-a");
when(adminUserMapper.selectById(23L)).thenReturn(uploader);
when(dedupeTotalDataMapper.selectOne(any())).thenReturn(null);
when(dedupeTotalDataMapper.insert(any(DedupeTotalDataEntity.class))).thenAnswer(invocation -> {
DedupeTotalDataEntity entity = invocation.getArgument(0);
entity.setId(91L);
return 1;
});
when(dedupeTotalDataMapper.selectById(91L)).thenAnswer(invocation -> {
DedupeTotalDataEntity entity = new DedupeTotalDataEntity();
entity.setId(91L);
entity.setDataValue("B012345678");
entity.setUploaderUserId(23L);
entity.setUploaderUsername("member-a");
return entity;
});
DedupeTotalDataCreateRequest request = new DedupeTotalDataCreateRequest();
request.setDataValue(" B012345678 ");
DedupeTotalDataItemVo item = service.create(request, 23L);
ArgumentCaptor<DedupeTotalDataEntity> captor = ArgumentCaptor.forClass(DedupeTotalDataEntity.class);
verify(dedupeTotalDataMapper).insert(captor.capture());
assertEquals(23L, captor.getValue().getUploaderUserId());
assertEquals("member-a", captor.getValue().getUploaderUsername());
assertEquals("member-a", item.getUsername());
}
@Test
void leaderCanDeleteManagedMemberData() {
when(adminUserMapper.selectById(10L)).thenReturn(user(10L, "admin", "leader"));
when(shopManageGroupMapper.selectManagedMemberUserIds(10L)).thenReturn(List.of(23L));
when(dedupeTotalDataMapper.selectById(91L)).thenReturn(data(91L, 23L));
service.delete(91L, 10L);
verify(dedupeTotalDataMapper).deleteById(91L);
}
@Test
void memberCannotDeleteAnotherUsersData() {
when(adminUserMapper.selectById(23L)).thenReturn(user(23L, "normal", "member-a"));
when(shopManageGroupMapper.selectManagedMemberUserIds(23L)).thenReturn(List.of());
when(dedupeTotalDataMapper.selectById(91L)).thenReturn(data(91L, 24L));
ResponseStatusException exception = assertThrows(
ResponseStatusException.class,
() -> service.delete(91L, 23L));
assertEquals(403, exception.getStatusCode().value());
verify(dedupeTotalDataMapper, never()).deleteById(any(Long.class));
}
@Test
void superAdminCanDeleteAnyUsersData() {
when(adminUserMapper.selectById(1L)).thenReturn(user(1L, "super_admin", "root"));
when(dedupeTotalDataMapper.selectById(91L)).thenReturn(data(91L, 99L));
service.delete(91L, 1L);
verify(dedupeTotalDataMapper).deleteById(91L);
verify(shopManageGroupMapper, never()).selectManagedMemberUserIds(any(Long.class));
}
@Test
void duplicateExcelValueKeepsOriginalUploader() throws Exception {
when(adminUserMapper.selectById(23L)).thenReturn(user(23L, "normal", "member-a"));
when(dedupeTotalDataMapper.selectOne(any())).thenReturn(data(91L, 99L));
MockMultipartFile file = asinWorkbook("B012345678");
var result = service.importFromExcel(file, 23L);
assertEquals(0, result.getInsertedCount());
assertEquals(1, result.getSkippedCount());
verify(dedupeTotalDataMapper, never()).insert(any(DedupeTotalDataEntity.class));
}
@Test
void usernameSearchCannotExpandLeaderScope() {
when(adminUserMapper.selectById(10L)).thenReturn(user(10L, "admin", "leader"));
when(shopManageGroupMapper.selectManagedMemberUserIds(10L)).thenReturn(List.of(23L));
when(adminUserMapper.selectIdsByUsernameLike("other")).thenReturn(List.of(99L));
DedupeTotalDataPageVo page = service.page(1, 15, "", "other", 10L);
assertEquals(0L, page.getTotal());
assertTrue(page.getItems().isEmpty());
verify(dedupeTotalDataMapper, never()).selectCount(any());
verify(dedupeTotalDataMapper, never()).selectList(any());
}
@Test
void comparableValueLookupRemainsGlobal() {
when(dedupeTotalDataMapper.selectExistingDataValues(List.of("B012345678")))
.thenReturn(List.of("B012345678"));
Set<String> values = service.findExistingComparableValues(List.of(" B012345678 "));
assertEquals(Set.of("B012345678"), values);
verify(adminUserMapper, never()).selectById(any(Long.class));
verify(shopManageGroupMapper, never()).selectManagedMemberUserIds(any(Long.class));
}
private AdminUserEntity user(Long id, String role, String username) {
AdminUserEntity user = new AdminUserEntity();
user.setId(id);
user.setRole(role);
user.setUsername(username);
user.setIsAdmin("normal".equals(role) ? 0 : 1);
return user;
}
private DedupeTotalDataEntity data(Long id, Long uploaderUserId) {
DedupeTotalDataEntity entity = new DedupeTotalDataEntity();
entity.setId(id);
entity.setDataValue("B012345678");
entity.setUploaderUserId(uploaderUserId);
entity.setUploaderUsername("uploader-" + uploaderUserId);
return entity;
}
private MockMultipartFile asinWorkbook(String asin) throws Exception {
try (XSSFWorkbook workbook = new XSSFWorkbook();
ByteArrayOutputStream output = new ByteArrayOutputStream()) {
var sheet = workbook.createSheet("data");
sheet.createRow(0).createCell(0).setCellValue("ASIN");
sheet.createRow(1).createCell(0).setCellValue(asin);
workbook.write(output);
return new MockMultipartFile(
"file",
"data.xlsx",
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
output.toByteArray());
}
}
}