package cn.iocoder.yudao.module.crm.service.invoice; import cn.iocoder.yudao.framework.common.exception.ServiceException; import cn.iocoder.yudao.module.crm.dal.dataobject.contract.CrmContractProductDO; import cn.iocoder.yudao.module.crm.service.contract.CrmContractService; import cn.iocoder.yudao.module.mdm.api.item.MdmItemApi; import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO; import cn.iocoder.yudao.module.mdm.enums.MdmItemTypeEnum; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import java.util.List; import java.util.Map; import java.util.Set; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) class CrmInvoiceServiceImplTest { @Mock private CrmContractService contractService; @Mock private MdmItemApi mdmItemApi; @InjectMocks private CrmInvoiceServiceImpl invoiceService; @Test void validateContractItemsInvoiceable_rejectsMaterial() { mockContractItem(MdmItemTypeEnum.MATERIAL); ServiceException exception = assertThrows(ServiceException.class, () -> invoiceService.validateContractItemsInvoiceable(1L)); assertEquals("物料不允许开票", exception.getMessage()); } @Test void validateContractItemsInvoiceable_allowsProduct() { mockContractItem(MdmItemTypeEnum.PRODUCT); assertDoesNotThrow(() -> invoiceService.validateContractItemsInvoiceable(1L)); } private void mockContractItem(MdmItemTypeEnum itemType) { CrmContractProductDO contractProduct = CrmContractProductDO.builder().itemId(10L).build(); MdmItemRespDTO item = new MdmItemRespDTO(); item.setId(10L); item.setItemType(itemType.getType()); when(contractService.getContractProductListByContractId(1L)).thenReturn(List.of(contractProduct)); when(mdmItemApi.getItemMap(Set.of(10L))).thenReturn(Map.of(10L, item)); } }