更新ASIN库新需求
This commit is contained in:
@@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user