package cn.iocoder.yudao.module.srm.service.supplier;
|
|
import cn.iocoder.yudao.module.srm.controller.admin.supplier.vo.SrmSupplierSaveReqVO;
|
import cn.iocoder.yudao.module.srm.dal.dataobject.SrmSupplierDO;
|
import cn.iocoder.yudao.module.srm.dal.mysql.SrmSupplierMapper;
|
import cn.iocoder.yudao.module.system.api.agent.imports.AgentImportCommitReqVO;
|
import cn.iocoder.yudao.module.system.api.agent.imports.AgentImportPreflightReqVO;
|
import cn.iocoder.yudao.module.system.api.agent.imports.AgentImportPreflightRespVO;
|
import cn.iocoder.yudao.module.system.api.agent.imports.AgentImportRowReceipt;
|
import cn.iocoder.yudao.module.system.framework.agent.AgentPrincipal;
|
import org.junit.jupiter.api.BeforeEach;
|
import org.junit.jupiter.api.Test;
|
import org.springframework.test.util.ReflectionTestUtils;
|
|
import java.util.LinkedHashMap;
|
import java.util.List;
|
import java.util.Map;
|
|
import static org.junit.jupiter.api.Assertions.*;
|
import static org.mockito.ArgumentMatchers.any;
|
import static org.mockito.Mockito.*;
|
|
class SrmSupplierImportAdapterTest {
|
|
private static final AgentPrincipal PRINCIPAL = new AgentPrincipal(1L, 1L, "live");
|
|
private SrmSupplierImportAdapter adapter;
|
private SrmSupplierService supplierService;
|
private SrmSupplierMapper supplierMapper;
|
|
@BeforeEach
|
void setUp() {
|
adapter = new SrmSupplierImportAdapter();
|
supplierService = mock(SrmSupplierService.class);
|
supplierMapper = mock(SrmSupplierMapper.class);
|
ReflectionTestUtils.setField(adapter, "supplierService", supplierService);
|
ReflectionTestUtils.setField(adapter, "supplierMapper", supplierMapper);
|
}
|
|
@Test
|
void preflightMarksCreateSkipAndBlockedRows() {
|
SrmSupplierDO existing = new SrmSupplierDO();
|
existing.setId(7L);
|
when(supplierMapper.selectByCode("SUP-OLD")).thenReturn(existing);
|
when(supplierMapper.selectByCode("SUP-NEW")).thenReturn(null);
|
|
AgentImportPreflightRespVO plan = adapter.preflight(PRINCIPAL, request(
|
row("r1", "SUP-NEW", "新供应商"),
|
row("r2", "SUP-OLD", "旧供应商"),
|
row("r3", "", "缺编码")));
|
|
assertEquals("CREATE", plan.getRows().get(0).getAction());
|
assertEquals("SKIP", plan.getRows().get(1).getAction());
|
assertEquals(7L, plan.getRows().get(1).getTargetId());
|
assertEquals("BLOCKED", plan.getRows().get(2).getAction());
|
assertEquals(1, plan.getSummary().getCreate());
|
assertEquals(1, plan.getSummary().getSkip());
|
assertEquals(1, plan.getSummary().getBlocked());
|
assertFalse(plan.getCanCommit());
|
assertNotNull(plan.getPreflightHash());
|
assertTrue(plan.getRows().get(1).getWarnings().stream()
|
.anyMatch(item -> "SUPPLIER_EXISTS".equals(item.getCode())));
|
}
|
|
@Test
|
void duplicateCodeInFileBlocksAllOccurrences() {
|
when(supplierMapper.selectByCode(any())).thenReturn(null);
|
|
AgentImportPreflightRespVO plan = adapter.preflight(PRINCIPAL, request(
|
row("r1", "SUP-DUP", "供应商A"),
|
row("r2", "SUP-DUP", "供应商B")));
|
|
assertEquals("BLOCKED", plan.getRows().get(0).getAction());
|
assertEquals("BLOCKED", plan.getRows().get(1).getAction());
|
assertEquals(2, plan.getSummary().getBlocked());
|
assertFalse(plan.getCanCommit());
|
}
|
|
@Test
|
void preflightHashIsStableForSameInput() {
|
when(supplierMapper.selectByCode(any())).thenReturn(null);
|
AgentImportPreflightReqVO request = request(row("r1", "SUP-NEW", "新供应商"));
|
|
assertEquals(adapter.preflight(PRINCIPAL, request).getPreflightHash(),
|
adapter.preflight(PRINCIPAL, request).getPreflightHash());
|
}
|
|
@Test
|
void commitCreatesSupplierAndReturnsReceipt() {
|
when(supplierService.createSupplier(any())).thenReturn(99L);
|
AgentImportPreflightReqVO.Row row = row("r1", "SUP-NEW", "新供应商");
|
|
AgentImportRowReceipt receipt = adapter.commitRow(PRINCIPAL, new AgentImportCommitReqVO(),
|
AgentImportPreflightRespVO.Row.builder().candidateId("r1").action("CREATE").build(), row);
|
|
assertEquals("CREATE", receipt.action());
|
assertEquals(99L, receipt.targetId());
|
assertEquals("SUP-NEW", receipt.code());
|
verify(supplierService).createSupplier(any(SrmSupplierSaveReqVO.class));
|
}
|
|
private static AgentImportPreflightReqVO request(AgentImportPreflightReqVO.Row... rows) {
|
AgentImportPreflightReqVO request = new AgentImportPreflightReqVO();
|
request.setAttachmentId(1L);
|
request.setSourceSha256("a".repeat(64));
|
request.setProposalRevision("0");
|
request.setRows(List.of(rows));
|
return request;
|
}
|
|
private static AgentImportPreflightReqVO.Row row(String candidateId, String code, String name) {
|
Map<String, String> values = new LinkedHashMap<>();
|
values.put("code", code);
|
values.put("name", name);
|
AgentImportPreflightReqVO.Row row = new AgentImportPreflightReqVO.Row();
|
row.setCandidateId(candidateId);
|
row.setRowNo(1);
|
row.setValues(values);
|
return row;
|
}
|
}
|