package com.ruoyi.loanpricing.service; import com.alibaba.fastjson2.JSONObject; import com.ruoyi.loanpricing.domain.dto.ModelInvokeDTO; import com.ruoyi.loanpricing.domain.dto.PersonalLoanPricingCreateDTO; import com.ruoyi.loanpricing.domain.entity.LoanPricingWorkflow; import com.ruoyi.loanpricing.mapper.LoanPricingWorkflowMapper; import com.ruoyi.loanpricing.mapper.ModelCorpOutputFieldsMapper; import com.ruoyi.loanpricing.mapper.ModelRetailOutputFieldsMapper; import com.ruoyi.loanpricing.util.LoanPricingConverter; 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.Objects; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.argThat; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) class LoanPricingModelServicePersonalParamsTest { @Mock private ModelService modelService; @Mock private LoanPricingWorkflowMapper loanPricingWorkflowMapper; @Mock private ModelRetailOutputFieldsMapper modelRetailOutputFieldsMapper; @Mock private ModelCorpOutputFieldsMapper modelCorpOutputFieldsMapper; @Mock private SensitiveFieldCryptoService sensitiveFieldCryptoService; @InjectMocks private LoanPricingModelService loanPricingModelService; @Test void shouldContainLoanPurposeAndLoanTermInPersonalCreateDto() throws NoSuchFieldException { assertNotNull(PersonalLoanPricingCreateDTO.class.getDeclaredField("loanPurpose")); assertNotNull(PersonalLoanPricingCreateDTO.class.getDeclaredField("loanTerm")); } @Test void shouldMapLoanPurposeAndLoanTermFromPersonalDto() { PersonalLoanPricingCreateDTO dto = new PersonalLoanPricingCreateDTO(); dto.setCustIsn("CUST001"); dto.setCustName("张三"); dto.setGuarType("信用"); dto.setApplyAmt("100000"); dto.setLoanPurpose("business"); dto.setLoanTerm("3"); LoanPricingWorkflow workflow = LoanPricingConverter.toEntity(dto); assertEquals("business", workflow.getLoanPurpose()); assertEquals("3", workflow.getLoanTerm()); } @Test void shouldContainLoanTermAndLoanLoopInModelInvokeDto() throws NoSuchFieldException { assertNotNull(ModelInvokeDTO.class.getDeclaredField("loanTerm")); assertNotNull(ModelInvokeDTO.class.getDeclaredField("loanLoop")); } @Test void shouldInvokePersonalModelWithExpectedParams() { LoanPricingWorkflow workflow = new LoanPricingWorkflow(); workflow.setId(1L); workflow.setSerialNum("202604090001"); workflow.setOrgCode("892000"); workflow.setRunType("1"); workflow.setCustIsn("CUST001"); workflow.setCustType("个人"); workflow.setCustName("cipher-name"); workflow.setIdType("身份证"); workflow.setIdNum("cipher-id"); workflow.setGuarType("信用"); workflow.setApplyAmt("100000"); workflow.setLoanPurpose("business"); workflow.setLoanTerm("3"); workflow.setBizProof("true"); workflow.setLoanLoop("false"); workflow.setCollThirdParty("true"); workflow.setCollType("一类"); JSONObject response = new JSONObject(); response.put("calculateRate", "6.15"); when(loanPricingWorkflowMapper.selectById(1L)).thenReturn(workflow); when(sensitiveFieldCryptoService.decrypt("cipher-name")).thenReturn("张三"); when(sensitiveFieldCryptoService.decrypt("cipher-id")).thenReturn("110101199001011234"); when(modelService.invokeModel(any())).thenReturn(response); loanPricingModelService.invokeModelAsync(1L); verify(modelService).invokeModel(argThat((ModelInvokeDTO dto) -> Objects.equals("202604090001", dto.getSerialNum()) && Objects.equals("892000", dto.getOrgCode()) && Objects.equals("1", dto.getRunType()) && Objects.equals("CUST001", dto.getCustIsn()) && Objects.equals("个人", dto.getCustType()) && Objects.equals("张三", dto.getCustName()) && Objects.equals("身份证", dto.getIdType()) && Objects.equals("110101199001011234", dto.getIdNum()) && Objects.equals("信用", dto.getGuarType()) && Objects.equals("100000", dto.getApplyAmt()) && Objects.equals("business", dto.getLoanPurpose()) && Objects.equals("3", dto.getLoanTerm()) && Objects.equals("1", dto.getBizProof()) && Objects.equals("0", dto.getLoanLoop()) && Objects.equals("1", dto.getCollThirdParty()) && Objects.equals("一类", dto.getCollType()))); } }