diff --git a/jeecg-boot-module/jeecg-module-flow/src/test/java/org/jeecg/inspectcloseout/InspectCloseoutFlowTest.java b/jeecg-boot-module/jeecg-module-flow/src/test/java/org/jeecg/inspectcloseout/InspectCloseoutFlowTest.java new file mode 100644 index 0000000..f59cc2e --- /dev/null +++ b/jeecg-boot-module/jeecg-module-flow/src/test/java/org/jeecg/inspectcloseout/InspectCloseoutFlowTest.java @@ -0,0 +1,319 @@ +package org.jeecg.inspectcloseout; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +import com.alibaba.fastjson.JSONObject; +import com.jeecg.weibo.exception.BusinessException; +import org.jeecg.common.system.api.ISysBaseAPI; +import org.jeecg.inspectcloseout.InspectCloseoutConfig.InspectCloseoutProperties; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.Collections; +import java.util.List; + +@ExtendWith(MockitoExtension.class) +class InspectCloseoutFlowTest { + + @Mock + private InspectCloseoutConfig inspectCloseoutConfig; + + @Mock + private ISysBaseAPI iSysBaseAPI; + + private InspectCloseoutFlow flow; + private InspectCloseoutProperties props; + + @BeforeEach + void setUp() { + props = new InspectCloseoutProperties(); + props.setBusinessKey("businessKey"); + props.setJsonDataKey("jsonDataKey"); + props.setFormUrl("formUrl"); + props.setFlowCode("flowCode"); + props.setApplicantKey("applicantKey"); + props.setApproverKey("approverKey"); + props.setRectifyItemKey("rectifyItemKey"); + props.setCloseoutDescKey("closeoutDescKey"); + props.setCompletionStatusKey("completionStatusKey"); + lenient().when(inspectCloseoutConfig.getInspectCloseout()).thenReturn(props); + + // FlowNodeExpression 未使用,传 null + flow = new InspectCloseoutFlow(inspectCloseoutConfig, null, iSysBaseAPI); + } + + // ==================== 部门角色用户查询 ==================== + + @Nested + class DeptRoleUserQuery { + + @Test + void getJJDeptLdUserIdList_shouldReturnUserList() { + List users = List.of("user1", "user2"); + when(iSysBaseAPI.getUsersListByDeptIdAndRoleIdLocalApi( + InspectCloseoutConstant.JJ_DEPT_ID, InspectCloseoutConstant.JJ_DEPT_LEADER_ROLE_ID)) + .thenReturn(users); + + assertEquals(users, flow.getJJDeptLdUserIdList()); + } + + @Test + void getJJDeptLdUserIdList_shouldReturnEmptyList() { + when(iSysBaseAPI.getUsersListByDeptIdAndRoleIdLocalApi( + InspectCloseoutConstant.JJ_DEPT_ID, InspectCloseoutConstant.JJ_DEPT_LEADER_ROLE_ID)) + .thenReturn(Collections.emptyList()); + + assertEquals(Collections.emptyList(), flow.getJJDeptLdUserIdList()); + } + + @Test + void getJJDeptLdUserIdListLength_shouldReturnCount() { + when(iSysBaseAPI.getUsersListByDeptIdAndRoleIdLocalApi( + InspectCloseoutConstant.JJ_DEPT_ID, InspectCloseoutConstant.JJ_DEPT_LEADER_ROLE_ID)) + .thenReturn(List.of("user1", "user2", "user3")); + + assertEquals(3, flow.getJJDeptLdUserIdListLength()); + } + + @Test + void getJJDeptLdUserIdListLength_shouldReturnZeroWhenEmpty() { + when(iSysBaseAPI.getUsersListByDeptIdAndRoleIdLocalApi( + InspectCloseoutConstant.JJ_DEPT_ID, InspectCloseoutConstant.JJ_DEPT_LEADER_ROLE_ID)) + .thenReturn(Collections.emptyList()); + + assertEquals(0, flow.getJJDeptLdUserIdListLength()); + } + + @Test + void getJJDeptLdWorkerIdList_shouldReturnUserList() { + List users = List.of("worker1"); + when(iSysBaseAPI.getUsersListByDeptIdAndRoleIdLocalApi( + InspectCloseoutConstant.JJ_DEPT_ID, InspectCloseoutConstant.JJ_DEPT_WORKER_ROLE_ID)) + .thenReturn(users); + + assertEquals(users, flow.getJJDeptLdWorkerIdList()); + } + + @Test + void getJJDeptLdWorkerIdListLength_shouldReturnCount() { + when(iSysBaseAPI.getUsersListByDeptIdAndRoleIdLocalApi( + InspectCloseoutConstant.JJ_DEPT_ID, InspectCloseoutConstant.JJ_DEPT_LEADER_ROLE_ID)) + .thenReturn(List.of("user1", "user2")); + + assertEquals(2, flow.getJJDeptLdWorkerIdListLength()); + } + + @Test + void getDqDeptLdUserIdList_shouldReturnUserList() { + List users = List.of("dq_user1"); + when(iSysBaseAPI.getUsersListByDeptIdAndRoleIdLocalApi( + InspectCloseoutConstant.DQ_DEPT_ID, InspectCloseoutConstant.DQ_DEPT_WORKER_ROLE_ID)) + .thenReturn(users); + + assertEquals(users, flow.getDqDeptLdUserIdList()); + } + + @Test + void getDqDeptLdUserIdListLength_shouldReturnCount() { + when(iSysBaseAPI.getUsersListByDeptIdAndRoleIdLocalApi( + InspectCloseoutConstant.DQ_DEPT_ID, InspectCloseoutConstant.DQ_DEPT_WORKER_ROLE_ID)) + .thenReturn(List.of("user1", "user2")); + + assertEquals(2, flow.getDqDeptLdUserIdListLength()); + } + + @Test + void getDqDeptLdUserIdListLength_shouldReturnZeroWhenEmpty() { + when(iSysBaseAPI.getUsersListByDeptIdAndRoleIdLocalApi( + InspectCloseoutConstant.DQ_DEPT_ID, InspectCloseoutConstant.DQ_DEPT_WORKER_ROLE_ID)) + .thenReturn(Collections.emptyList()); + + assertEquals(0, flow.getDqDeptLdUserIdListLength()); + } + } + + // ==================== JWSJ用户查询 ==================== + + @Nested + class JWSJUserQuery { + + @Test + void getJWSJUser_shouldReturnUniqueUser() { + when(iSysBaseAPI.getUsersListByDeptIdAndRoleIdLocalApi( + InspectCloseoutConstant.SLD_DEPT_ID, InspectCloseoutConstant.SLD_JWSJ_ROLE_ID)) + .thenReturn(List.of("jwsj_user")); + + assertEquals("jwsj_user", flow.getJWSJUser()); + } + + @Test + void getJWSJUser_shouldThrowWhenEmpty() { + when(iSysBaseAPI.getUsersListByDeptIdAndRoleIdLocalApi( + InspectCloseoutConstant.SLD_DEPT_ID, InspectCloseoutConstant.SLD_JWSJ_ROLE_ID)) + .thenReturn(Collections.emptyList()); + + assertThrows(BusinessException.class, () -> flow.getJWSJUser()); + } + + @Test + void getJWSJUser_shouldThrowWhenMultipleUsers() { + when(iSysBaseAPI.getUsersListByDeptIdAndRoleIdLocalApi( + InspectCloseoutConstant.SLD_DEPT_ID, InspectCloseoutConstant.SLD_JWSJ_ROLE_ID)) + .thenReturn(List.of("user1", "user2")); + + assertThrows(BusinessException.class, () -> flow.getJWSJUser()); + } + } + + // ==================== JSON 数据解析 ==================== + + @Nested + class JsonDataParsing { + + @Test + void getApproverList_shouldParseCommaSeparated() { + JSONObject json = new JSONObject(); + json.put("approverKey", "user1,user2,user3"); + + List result = flow.getApproverList(json); + + assertEquals(3, result.size()); + assertTrue(result.contains("user1")); + assertTrue(result.contains("user2")); + assertTrue(result.contains("user3")); + } + + @Test + void getApproverList_shouldHandleJsonString() { + String jsonStr = "{\"approverKey\":\"user1,user2\"}"; + + List result = flow.getApproverList(jsonStr); + + assertEquals(2, result.size()); + } + + @Test + void getApproverList_shouldReturnEmptyWhenFieldMissing() { + JSONObject json = new JSONObject(); + + List result = flow.getApproverList(json); + + assertTrue(result.isEmpty()); + } + + @Test + void getApproverList_shouldReturnEmptyWhenValueBlank() { + JSONObject json = new JSONObject(); + json.put("approverKey", ""); + + List result = flow.getApproverList(json); + + assertTrue(result.isEmpty()); + } + + @Test + void getApproverList_shouldReturnEmptyWhenJsonDataNull() { + List result = flow.getApproverList(null); + + assertTrue(result.isEmpty()); + } + + @Test + void getApproverListLength_shouldReturnCount() { + JSONObject json = new JSONObject(); + json.put("approverKey", "user1,user2,user3"); + + assertEquals(3, flow.getApproverListLength(json)); + } + + @Test + void getApproverListLength_shouldReturnZeroWhenEmpty() { + JSONObject json = new JSONObject(); + + assertEquals(0, flow.getApproverListLength(json)); + } + + @Test + void getApplicant_shouldReturnApplicantValue() { + JSONObject json = new JSONObject(); + json.put("applicantKey", "zhangsan"); + + assertEquals("zhangsan", flow.getApplicant(json)); + } + + @Test + void getApplicant_shouldHandleJsonString() { + String jsonStr = "{\"applicantKey\":\"lisi\"}"; + + assertEquals("lisi", flow.getApplicant(jsonStr)); + } + + @Test + void getApplicant_shouldReturnNullWhenMissing() { + JSONObject json = new JSONObject(); + + assertNull(flow.getApplicant(json)); + } + + @Test + void getApplicant_shouldReturnNullWhenJsonDataNull() { + assertNull(flow.getApplicant(null)); + } + + @Test + void getRectifyItemId_shouldReturnRectifyItemId() { + JSONObject json = new JSONObject(); + json.put("rectifyItemKey", "item-001"); + + assertEquals("item-001", flow.getRectifyItemId(json)); + } + + @Test + void getRectifyItemId_shouldHandleJsonString() { + String jsonStr = "{\"rectifyItemKey\":\"item-002\"}"; + + assertEquals("item-002", flow.getRectifyItemId(jsonStr)); + } + + @Test + void getRectifyItemId_shouldReturnNullWhenMissing() { + JSONObject json = new JSONObject(); + + assertNull(flow.getRectifyItemId(json)); + } + + @Test + void getRectifyItemId_shouldReturnNullWhenJsonDataNull() { + assertNull(flow.getRectifyItemId(null)); + } + } + + // ==================== 工具方法 ==================== + + @Nested + class UtilityMethods { + + @Test + void getListSize_shouldCountCommaSeparated() { + assertEquals(3, flow.getListSize("a,b,c")); + assertEquals(1, flow.getListSize("single")); + assertEquals(0, flow.getListSize("")); + assertEquals(0, flow.getListSize(null)); + } + + @Test + void getListSize_shouldHandleSpaces() { + assertEquals(2, flow.getListSize(" a , b ")); + } + + @Test + void getListSize_shouldFilterEmptyElements() { + assertEquals(2, flow.getListSize("a,,b")); + } + } +} diff --git a/jeecg-boot-module/jeecg-module-flow/src/test/java/org/jeecg/inspectcloseout/listener/AfterCloseoutApprovedListenerTest.java b/jeecg-boot-module/jeecg-module-flow/src/test/java/org/jeecg/inspectcloseout/listener/AfterCloseoutApprovedListenerTest.java new file mode 100644 index 0000000..463abbc --- /dev/null +++ b/jeecg-boot-module/jeecg-module-flow/src/test/java/org/jeecg/inspectcloseout/listener/AfterCloseoutApprovedListenerTest.java @@ -0,0 +1,73 @@ +package org.jeecg.inspectcloseout.listener; + +import static org.mockito.Mockito.*; + +import org.flowable.task.service.delegate.DelegateTask; +import org.jeecg.inspectcloseout.InspectCloseoutConfig; +import org.jeecg.inspectcloseout.InspectCloseoutConfig.InspectCloseoutProperties; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +@ExtendWith(MockitoExtension.class) +class AfterCloseoutApprovedListenerTest { + + @Mock + private InspectCloseoutConfig inspectCloseoutConfig; + + @Mock + private DelegateTask delegateTask; + + private AfterCloseoutApprovedListener listener; + private InspectCloseoutProperties props; + + @BeforeEach + void setUp() { + props = new InspectCloseoutProperties(); + props.setBusinessKey("businessKey"); + when(inspectCloseoutConfig.getInspectCloseout()).thenReturn(props); + + listener = new AfterCloseoutApprovedListener(inspectCloseoutConfig); + } + + @Test + void shouldProcessWhenBusinessKeyExists() { + when(delegateTask.getVariable("businessKey")).thenReturn("biz-001"); + + listener.notify(delegateTask); + + // 无异常即成功 — 当前实现仅记录日志 + } + + @Test + void shouldSkipWhenBusinessKeyIsNull() { + when(delegateTask.getVariable("businessKey")).thenReturn(null); + when(delegateTask.getId()).thenReturn("task-001"); + + listener.notify(delegateTask); + + // 无异常即成功 + } + + @Test + void shouldSkipWhenBusinessKeyIsEmpty() { + when(delegateTask.getVariable("businessKey")).thenReturn(""); + when(delegateTask.getId()).thenReturn("task-001"); + + listener.notify(delegateTask); + + // 无异常即成功 + } + + @Test + void shouldSkipWhenBusinessKeyIsBlank() { + when(delegateTask.getVariable("businessKey")).thenReturn(" "); + when(delegateTask.getId()).thenReturn("task-001"); + + listener.notify(delegateTask); + + // 无异常即成功 + } +}