|
|
@@ -0,0 +1,217 @@
|
|
|
+package com.malk.minglei.service.impl.approval;
|
|
|
+
|
|
|
+import com.fasterxml.jackson.databind.ObjectMapper;
|
|
|
+import com.malk.minglei.dto.ApprovalDepartmentManagers;
|
|
|
+import com.malk.minglei.service.approval.DingTalkApprovalClient;
|
|
|
+import com.malk.minglei.service.yida.MingleiDocumentService;
|
|
|
+import com.malk.service.dingtalk.DDClient;
|
|
|
+import org.junit.jupiter.api.Test;
|
|
|
+import org.mockito.ArgumentCaptor;
|
|
|
+
|
|
|
+import java.util.Arrays;
|
|
|
+import java.util.Collections;
|
|
|
+import java.util.LinkedHashMap;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+
|
|
|
+import static org.junit.jupiter.api.Assertions.assertEquals;
|
|
|
+import static org.junit.jupiter.api.Assertions.assertNull;
|
|
|
+import static org.junit.jupiter.api.Assertions.assertThrows;
|
|
|
+import static org.junit.jupiter.api.Assertions.assertTrue;
|
|
|
+import static org.mockito.ArgumentMatchers.anyString;
|
|
|
+import static org.mockito.BDDMockito.given;
|
|
|
+import static org.mockito.Mockito.mock;
|
|
|
+import static org.mockito.Mockito.verify;
|
|
|
+
|
|
|
+class ApprovalTransferDepartmentServiceImplTest {
|
|
|
+
|
|
|
+ private static final String TRANSFER_DEPARTMENT_EXT_VALUE =
|
|
|
+ "[{\"deptName\":\"合作伙伴\",\"itemId\":\"972414534\",\"name\":\"合作伙伴\",\"id\":\"972414534\"}]";
|
|
|
+
|
|
|
+ @Test
|
|
|
+ void findTransferDepartmentManagersResolvesDepartmentManagers() {
|
|
|
+ DingTalkApprovalClient approvalClient = mock(DingTalkApprovalClient.class);
|
|
|
+ MingleiDocumentService documentService = mock(MingleiDocumentService.class);
|
|
|
+ given(approvalClient.getProcessInstanceDetail("access-token", "instance-001"))
|
|
|
+ .willReturn(instanceDetail(transferDepartmentComponent(TRANSFER_DEPARTMENT_EXT_VALUE)));
|
|
|
+ given(documentService.queryDepartmentManagersByDepartmentId(anyString()))
|
|
|
+ .willReturn(matrix("manager-1", "manager-2", "manager-3", "manager-4", "manager-head", "manager-5"));
|
|
|
+
|
|
|
+ ApprovalDepartmentManagers managers = service(approvalClient, documentService)
|
|
|
+ .findTransferDepartmentManagers("instance-001");
|
|
|
+
|
|
|
+ assertEquals("972414534", managers.getDepartmentId());
|
|
|
+ assertEquals("合作伙伴", managers.getDepartmentName());
|
|
|
+ assertEquals("manager-1", managers.getFirstLevelManagerUserId());
|
|
|
+ assertEquals("manager-2", managers.getSecondLevelManagerUserId());
|
|
|
+ assertEquals("manager-3", managers.getThirdLevelManagerUserId());
|
|
|
+ assertEquals("manager-4", managers.getFourthLevelManagerUserId());
|
|
|
+ assertEquals("manager-head", managers.getDepartmentHeadUserId());
|
|
|
+ assertEquals("manager-5", managers.getDepartmentLeaderUserId());
|
|
|
+ assertEquals(Arrays.asList("manager-1", "manager-2", "manager-3", "manager-4", "manager-head", "manager-5"),
|
|
|
+ managers.getAllManagerUserIds());
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ void findTransferDepartmentManagersQueriesMatrixByTransferDepartmentId() {
|
|
|
+ DingTalkApprovalClient approvalClient = mock(DingTalkApprovalClient.class);
|
|
|
+ MingleiDocumentService documentService = mock(MingleiDocumentService.class);
|
|
|
+ given(approvalClient.getProcessInstanceDetail("access-token", "instance-001"))
|
|
|
+ .willReturn(instanceDetail(transferDepartmentComponent(TRANSFER_DEPARTMENT_EXT_VALUE)));
|
|
|
+ given(documentService.queryDepartmentManagersByDepartmentId(anyString()))
|
|
|
+ .willReturn(matrix("manager-1", "manager-2", "manager-3", "manager-4", "manager-head", "manager-5"));
|
|
|
+
|
|
|
+ service(approvalClient, documentService).findTransferDepartmentManagers("instance-001");
|
|
|
+
|
|
|
+ verify(documentService).queryDepartmentManagersByDepartmentId("972414534");
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ void findTransferDepartmentManagersAcceptsNumericDepartmentId() {
|
|
|
+ DingTalkApprovalClient approvalClient = mock(DingTalkApprovalClient.class);
|
|
|
+ MingleiDocumentService documentService = mock(MingleiDocumentService.class);
|
|
|
+ given(approvalClient.getProcessInstanceDetail("access-token", "instance-002"))
|
|
|
+ .willReturn(instanceDetail(transferDepartmentComponent(
|
|
|
+ "[{\"itemId\":1003297198,\"name\":\"钉钉顾问\",\"id\":1003297198}]")));
|
|
|
+ given(documentService.queryDepartmentManagersByDepartmentId(anyString()))
|
|
|
+ .willReturn(matrix("manager-3", null, null, null, null, null));
|
|
|
+
|
|
|
+ ApprovalDepartmentManagers managers = service(approvalClient, documentService)
|
|
|
+ .findTransferDepartmentManagers("instance-002");
|
|
|
+
|
|
|
+ assertEquals("1003297198", managers.getDepartmentId());
|
|
|
+ assertEquals("钉钉顾问", managers.getDepartmentName());
|
|
|
+ assertEquals("manager-3", managers.getFirstLevelManagerUserId());
|
|
|
+ assertNull(managers.getSecondLevelManagerUserId());
|
|
|
+ assertEquals(Collections.singletonList("manager-3"), managers.getAllManagerUserIds());
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ void findTransferDepartmentManagersFallsBackToDepartmentAlias() {
|
|
|
+ DingTalkApprovalClient approvalClient = mock(DingTalkApprovalClient.class);
|
|
|
+ MingleiDocumentService documentService = mock(MingleiDocumentService.class);
|
|
|
+ Map<String, Object> component = new LinkedHashMap<String, Object>();
|
|
|
+ component.put("componentType", "DepartmentField");
|
|
|
+ component.put("name", "调动部门");
|
|
|
+ component.put("bizAlias", "transferDepartment");
|
|
|
+ component.put("extValue", TRANSFER_DEPARTMENT_EXT_VALUE);
|
|
|
+ given(approvalClient.getProcessInstanceDetail("access-token", "instance-003"))
|
|
|
+ .willReturn(instanceDetail(component));
|
|
|
+ given(documentService.queryDepartmentManagersByDepartmentId(anyString()))
|
|
|
+ .willReturn(matrix("manager-1", "manager-2", "manager-3", "manager-4", "manager-head", "manager-5"));
|
|
|
+
|
|
|
+ ApprovalDepartmentManagers managers = service(approvalClient, documentService)
|
|
|
+ .findTransferDepartmentManagers("instance-003");
|
|
|
+
|
|
|
+ assertEquals("972414534", managers.getDepartmentId());
|
|
|
+ assertEquals("manager-1", managers.getFirstLevelManagerUserId());
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ void findTransferDepartmentManagersReturnsNullFieldsWhenMatrixHasNoMatch() {
|
|
|
+ DingTalkApprovalClient approvalClient = mock(DingTalkApprovalClient.class);
|
|
|
+ MingleiDocumentService documentService = mock(MingleiDocumentService.class);
|
|
|
+ given(approvalClient.getProcessInstanceDetail("access-token", "instance-004"))
|
|
|
+ .willReturn(instanceDetail(transferDepartmentComponent(TRANSFER_DEPARTMENT_EXT_VALUE)));
|
|
|
+ given(documentService.queryDepartmentManagersByDepartmentId(anyString()))
|
|
|
+ .willReturn(Collections.<String, Object>emptyMap());
|
|
|
+
|
|
|
+ ApprovalDepartmentManagers managers = service(approvalClient, documentService)
|
|
|
+ .findTransferDepartmentManagers("instance-004");
|
|
|
+
|
|
|
+ assertEquals("972414534", managers.getDepartmentId());
|
|
|
+ assertNull(managers.getFirstLevelManagerUserId());
|
|
|
+ assertNull(managers.getDepartmentLeaderUserId());
|
|
|
+ assertTrue(managers.getAllManagerUserIds().isEmpty());
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ void findTransferDepartmentManagersRejectsBlankProcessInstanceId() {
|
|
|
+ ApprovalTransferDepartmentServiceImpl service = service(mock(DingTalkApprovalClient.class), mock(MingleiDocumentService.class));
|
|
|
+
|
|
|
+ assertThrows(IllegalArgumentException.class, () -> service.findTransferDepartmentManagers(" "));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ void findTransferDepartmentManagersRejectsMissingTransferDepartmentField() {
|
|
|
+ DingTalkApprovalClient approvalClient = mock(DingTalkApprovalClient.class);
|
|
|
+ Map<String, Object> component = new LinkedHashMap<String, Object>();
|
|
|
+ component.put("name", "原部门");
|
|
|
+ component.put("value", "钉钉顾问");
|
|
|
+ given(approvalClient.getProcessInstanceDetail("access-token", "instance-005"))
|
|
|
+ .willReturn(instanceDetail(component));
|
|
|
+
|
|
|
+ ApprovalTransferDepartmentServiceImpl service = service(approvalClient, mock(MingleiDocumentService.class));
|
|
|
+
|
|
|
+ assertThrows(IllegalArgumentException.class, () -> service.findTransferDepartmentManagers("instance-005"));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ void findTransferDepartmentManagersRejectsExtValueWithoutDepartmentId() {
|
|
|
+ DingTalkApprovalClient approvalClient = mock(DingTalkApprovalClient.class);
|
|
|
+ given(approvalClient.getProcessInstanceDetail("access-token", "instance-006"))
|
|
|
+ .willReturn(instanceDetail(transferDepartmentComponent("[{\"name\":\"合作伙伴\"}]")));
|
|
|
+
|
|
|
+ ApprovalTransferDepartmentServiceImpl service = service(approvalClient, mock(MingleiDocumentService.class));
|
|
|
+
|
|
|
+ assertThrows(IllegalArgumentException.class, () -> service.findTransferDepartmentManagers("instance-006"));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ void findTransferDepartmentManagersReturnsNullFieldsForUnmatchedDepartmentId() {
|
|
|
+ DingTalkApprovalClient approvalClient = mock(DingTalkApprovalClient.class);
|
|
|
+ MingleiDocumentService documentService = mock(MingleiDocumentService.class);
|
|
|
+ given(approvalClient.getProcessInstanceDetail("access-token", "instance-007"))
|
|
|
+ .willReturn(instanceDetail(transferDepartmentComponent("[{\"id\":\"NOT_A_DEPARTMENT\"}]")));
|
|
|
+
|
|
|
+ ApprovalDepartmentManagers managers = service(approvalClient, documentService)
|
|
|
+ .findTransferDepartmentManagers("instance-007");
|
|
|
+
|
|
|
+ assertEquals("NOT_A_DEPARTMENT", managers.getDepartmentId());
|
|
|
+ assertNull(managers.getFirstLevelManagerUserId());
|
|
|
+ assertNull(managers.getDepartmentLeaderUserId());
|
|
|
+ assertTrue(managers.getAllManagerUserIds().isEmpty());
|
|
|
+ }
|
|
|
+
|
|
|
+ private ApprovalTransferDepartmentServiceImpl service(DingTalkApprovalClient approvalClient,
|
|
|
+ MingleiDocumentService documentService) {
|
|
|
+ DDClient dingTalkClient = mock(DDClient.class);
|
|
|
+ given(dingTalkClient.getAccessToken()).willReturn("access-token");
|
|
|
+ return new ApprovalTransferDepartmentServiceImpl(dingTalkClient, approvalClient, documentService, new ObjectMapper());
|
|
|
+ }
|
|
|
+
|
|
|
+ private static Map<String, Object> matrix(String first, String second, String third, String fourth, String head, String leader) {
|
|
|
+ Map<String, Object> managers = new LinkedHashMap<String, Object>();
|
|
|
+ managers.put("firstLevelManagerUserId", first);
|
|
|
+ managers.put("secondLevelManagerUserId", second);
|
|
|
+ managers.put("thirdLevelManagerUserId", third);
|
|
|
+ managers.put("fourthLevelManagerUserId", fourth);
|
|
|
+ managers.put("departmentHeadUserId", head);
|
|
|
+ managers.put("departmentLeaderUserId", leader);
|
|
|
+ return managers;
|
|
|
+ }
|
|
|
+
|
|
|
+ private static Map<String, Object> instanceDetail(Map<String, Object> component) {
|
|
|
+ return mapOf("success", Boolean.TRUE,
|
|
|
+ "result", mapOf("title", "刘飞翔提交的公司内调动流程",
|
|
|
+ "formComponentValues", Collections.singletonList(component)));
|
|
|
+ }
|
|
|
+
|
|
|
+ private static Map<String, Object> transferDepartmentComponent(String extValue) {
|
|
|
+ Map<String, Object> component = new LinkedHashMap<String, Object>();
|
|
|
+ component.put("componentType", "DepartmentField");
|
|
|
+ component.put("name", "转入部门");
|
|
|
+ component.put("bizAlias", "transferDepartment");
|
|
|
+ component.put("value", "合作伙伴");
|
|
|
+ component.put("extValue", extValue);
|
|
|
+ return component;
|
|
|
+ }
|
|
|
+
|
|
|
+ private static Map<String, Object> mapOf(Object... keyValues) {
|
|
|
+ Map<String, Object> map = new LinkedHashMap<String, Object>();
|
|
|
+ for (int index = 0; index < keyValues.length; index += 2) {
|
|
|
+ map.put((String) keyValues[index], keyValues[index + 1]);
|
|
|
+ }
|
|
|
+ return map;
|
|
|
+ }
|
|
|
+}
|