package cn.iocoder.yudao.module.ums.service.application; import cn.iocoder.yudao.framework.test.core.ut.BaseMockitoUnitTest; import cn.iocoder.yudao.module.ums.dal.dataobject.application.UmsApplicationDO; import cn.iocoder.yudao.module.ums.dal.mysql.application.UmsApplicationMapper; import org.flowable.engine.runtime.ProcessInstance; import org.flowable.task.api.Task; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Mock; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; class UmsApplicationApprovalValidatorTest extends BaseMockitoUnitTest { @InjectMocks private UmsApplicationApprovalValidator validator; @Mock private UmsApplicationMapper mapper; @Mock private ProcessInstance instance; @Mock private Task task; @Test void requiresConfirmedFeeBeforeApproval() { when(instance.getProcessDefinitionKey()).thenReturn("ums_membership_approve"); when(instance.getBusinessKey()).thenReturn("12"); when(mapper.selectById(12L)).thenReturn(new UmsApplicationDO()); assertThrows(RuntimeException.class, () -> validator.validate(1L, task, instance)); } @Test void permitsExplicitUnpaid() { when(instance.getProcessDefinitionKey()).thenReturn("ums_membership_approve"); when(instance.getBusinessKey()).thenReturn("12"); when(mapper.selectById(12L)).thenReturn(new UmsApplicationDO().setFeePaid(false)); assertDoesNotThrow(() -> validator.validate(1L, task, instance)); } @Test void ignoresOtherProcesses() { when(instance.getProcessDefinitionKey()).thenReturn("other"); validator.validate(1L, task, instance); verifyNoInteractions(mapper); } @Test void permitsAutomaticSubmissionOfStarterNode() { when(instance.getProcessDefinitionKey()).thenReturn("ums_membership_approve"); when(task.getTaskDefinitionKey()).thenReturn("StartUserNode"); validator.validate(1L, task, instance); verifyNoInteractions(mapper); } }