| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- package com.malk.service.workhours;
- import com.alibaba.fastjson.JSON;
- import com.malk.server.aliwork.YDConf;
- import com.malk.server.aliwork.YDParam;
- import com.malk.server.common.McException;
- import com.malk.server.dingtalk.DDR_New;
- import com.malk.server.workhours.WHConf;
- import com.malk.service.aliwork.YDClient;
- import com.malk.service.aliwork.YDService;
- import org.junit.jupiter.api.BeforeEach;
- import org.junit.jupiter.api.Test;
- import java.util.ArrayList;
- import java.util.Arrays;
- import java.util.Collections;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import static org.junit.jupiter.api.Assertions.assertEquals;
- import static org.junit.jupiter.api.Assertions.assertThrows;
- import static org.mockito.ArgumentMatchers.any;
- import static org.mockito.ArgumentMatchers.eq;
- import static org.mockito.Mockito.mock;
- import static org.mockito.Mockito.verify;
- import static org.mockito.Mockito.when;
- class ChangeProjectManagerLookupServiceTest {
- private YDClient ydClient;
- private YDService ydService;
- private ChangeProjectManagerLookupService service;
- @BeforeEach
- void setUp() {
- ydClient = mock(YDClient.class);
- ydService = mock(YDService.class);
- WHConf conf = new WHConf();
- conf.setYidaAppType("APP_TEST");
- conf.setYidaSystemToken("test-token");
- conf.setFormUuidProject("FORM_PROJECT");
- service = new ChangeProjectManagerLookupService(ydClient, ydService, conf);
- }
- @Test
- void mergesManagersFromChangedProjectsAndSkipsZeroHourRows() {
- Map<String, Object> change = new HashMap<>();
- change.put("employeeField_mmacxew4_id", Collections.singletonList("worker"));
- change.put("employeeField_mmacxew4", Collections.singletonList("Worker"));
- change.put("tableField_mmczo634", Arrays.asList(
- row("textField_mmd25ngw", "P1", "numberField_mmd25ngz", 2),
- row("textField_mmd25ngw", "P0", "numberField_mmd25ngz", 0)));
- change.put("tableField_mmecojwk", Collections.singletonList(
- row("textField_mmecojwe", "P2", "numberField_mmecojwh", -1)));
- when(ydClient.queryData(any(YDParam.class), eq(YDConf.FORM_QUERY.retrieve_search_process_id)))
- .thenReturn(process(change));
- when(ydClient.queryData(any(YDParam.class), eq(YDConf.FORM_QUERY.retrieve_search_form)))
- .thenAnswer(invocation -> {
- YDParam param = invocation.getArgument(0);
- String code = JSON.parseObject(param.getSearchFieldJson()).getString("textField_mkov5ozb");
- if ("P1".equals(code)) return project("P1", "worker", "manager-a");
- if ("P2".equals(code)) return project("P2", "worker", "manager-a", "manager-b");
- throw new AssertionError("不应查询 0 工时项目: " + code);
- });
- assertEquals(Arrays.asList("manager-a", "manager-b"), service.lookup("process-1"));
- }
- @Test
- void readsMemberBeyondInlineFiftyRows() {
- Map<String, Object> change = new HashMap<>();
- change.put("employeeField_mmacxew4_id", Collections.singletonList("worker"));
- change.put("employeeField_mmacxew4", Collections.singletonList("Worker"));
- change.put("tableField_mmczo634", Collections.singletonList(
- row("textField_mmd25ngw", "P1", "numberField_mmd25ngz", 3)));
- when(ydClient.queryData(any(YDParam.class), eq(YDConf.FORM_QUERY.retrieve_search_process_id)))
- .thenReturn(process(change));
- DDR_New project = project("P1", "other", "manager-other");
- Map projectRow = (Map) ((List) project.getData()).get(0);
- Map projectData = (Map) projectRow.get("formData");
- List<Map> inline = new ArrayList<>();
- for (int i = 0; i < 50; i++) inline.add(member("other-" + i, "manager-other"));
- projectData.put("tableField_mkowyn6d", inline);
- when(ydClient.queryData(any(YDParam.class), eq(YDConf.FORM_QUERY.retrieve_search_form)))
- .thenReturn(project);
- List<Map> full = new ArrayList<>(inline);
- full.add(member("worker", "manager-a"));
- when(ydService.queryDetails(any(YDParam.class))).thenReturn(full);
- assertEquals(Collections.singletonList("manager-a"), service.lookup("process-2"));
- verify(ydService).queryDetails(any(YDParam.class));
- }
- @Test
- void rejectsChangedProjectWithoutSubmitterMember() {
- Map<String, Object> change = new HashMap<>();
- change.put("employeeField_mmacxew4_id", Collections.singletonList("worker"));
- change.put("employeeField_mmacxew4", Collections.singletonList("Worker"));
- change.put("tableField_mmczo634", Collections.singletonList(
- row("textField_mmd25ngw", "P1", "numberField_mmd25ngz", 1)));
- when(ydClient.queryData(any(YDParam.class), eq(YDConf.FORM_QUERY.retrieve_search_process_id)))
- .thenReturn(process(change));
- when(ydClient.queryData(any(YDParam.class), eq(YDConf.FORM_QUERY.retrieve_search_form)))
- .thenReturn(project("P1", "other", "manager-other"));
- assertThrows(McException.class, () -> service.lookup("process-3"));
- }
- private static DDR_New process(Map<String, Object> data) {
- DDR_New result = new DDR_New();
- result.setData(data);
- return result;
- }
- private static DDR_New project(String code, String memberId, String... managerIds) {
- Map<String, Object> formData = new HashMap<>();
- formData.put("textField_mkov5ozb", code);
- formData.put("tableField_mkowyn6d", Collections.singletonList(member(memberId, managerIds)));
- Map<String, Object> item = new HashMap<>();
- item.put("formInstanceId", "FINST-1");
- item.put("formData", formData);
- DDR_New result = new DDR_New();
- result.setData(Collections.singletonList(item));
- result.setTotalCount(1);
- return result;
- }
- private static Map<String, Object> member(String memberId, String... managerIds) {
- Map<String, Object> row = new HashMap<>();
- row.put("employeeField_mmbfe0ij_id", Collections.singletonList(memberId));
- row.put("employeeField_mkoxpswf_id", Arrays.asList(managerIds));
- return row;
- }
- private static Map<String, Object> row(String firstKey, Object firstValue,
- String secondKey, Object secondValue) {
- Map<String, Object> row = new HashMap<>();
- row.put(firstKey, firstValue);
- row.put(secondKey, secondValue);
- return row;
- }
- }
|