ChangeProjectManagerLookupServiceTest.java 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. package com.malk.service.workhours;
  2. import com.alibaba.fastjson.JSON;
  3. import com.malk.server.aliwork.YDConf;
  4. import com.malk.server.aliwork.YDParam;
  5. import com.malk.server.common.McException;
  6. import com.malk.server.dingtalk.DDR_New;
  7. import com.malk.server.workhours.WHConf;
  8. import com.malk.service.aliwork.YDClient;
  9. import com.malk.service.aliwork.YDService;
  10. import org.junit.jupiter.api.BeforeEach;
  11. import org.junit.jupiter.api.Test;
  12. import java.util.ArrayList;
  13. import java.util.Arrays;
  14. import java.util.Collections;
  15. import java.util.HashMap;
  16. import java.util.List;
  17. import java.util.Map;
  18. import static org.junit.jupiter.api.Assertions.assertEquals;
  19. import static org.junit.jupiter.api.Assertions.assertThrows;
  20. import static org.mockito.ArgumentMatchers.any;
  21. import static org.mockito.ArgumentMatchers.eq;
  22. import static org.mockito.Mockito.mock;
  23. import static org.mockito.Mockito.verify;
  24. import static org.mockito.Mockito.when;
  25. class ChangeProjectManagerLookupServiceTest {
  26. private YDClient ydClient;
  27. private YDService ydService;
  28. private ChangeProjectManagerLookupService service;
  29. @BeforeEach
  30. void setUp() {
  31. ydClient = mock(YDClient.class);
  32. ydService = mock(YDService.class);
  33. WHConf conf = new WHConf();
  34. conf.setYidaAppType("APP_TEST");
  35. conf.setYidaSystemToken("test-token");
  36. conf.setFormUuidProject("FORM_PROJECT");
  37. service = new ChangeProjectManagerLookupService(ydClient, ydService, conf);
  38. }
  39. @Test
  40. void mergesManagersFromChangedProjectsAndSkipsZeroHourRows() {
  41. Map<String, Object> change = new HashMap<>();
  42. change.put("employeeField_mmacxew4_id", Collections.singletonList("worker"));
  43. change.put("employeeField_mmacxew4", Collections.singletonList("Worker"));
  44. change.put("tableField_mmczo634", Arrays.asList(
  45. row("textField_mmd25ngw", "P1", "numberField_mmd25ngz", 2),
  46. row("textField_mmd25ngw", "P0", "numberField_mmd25ngz", 0)));
  47. change.put("tableField_mmecojwk", Collections.singletonList(
  48. row("textField_mmecojwe", "P2", "numberField_mmecojwh", -1)));
  49. when(ydClient.queryData(any(YDParam.class), eq(YDConf.FORM_QUERY.retrieve_search_process_id)))
  50. .thenReturn(process(change));
  51. when(ydClient.queryData(any(YDParam.class), eq(YDConf.FORM_QUERY.retrieve_search_form)))
  52. .thenAnswer(invocation -> {
  53. YDParam param = invocation.getArgument(0);
  54. String code = JSON.parseObject(param.getSearchFieldJson()).getString("textField_mkov5ozb");
  55. if ("P1".equals(code)) return project("P1", "worker", "manager-a");
  56. if ("P2".equals(code)) return project("P2", "worker", "manager-a", "manager-b");
  57. throw new AssertionError("不应查询 0 工时项目: " + code);
  58. });
  59. assertEquals(Arrays.asList("manager-a", "manager-b"), service.lookup("process-1"));
  60. }
  61. @Test
  62. void readsMemberBeyondInlineFiftyRows() {
  63. Map<String, Object> change = new HashMap<>();
  64. change.put("employeeField_mmacxew4_id", Collections.singletonList("worker"));
  65. change.put("employeeField_mmacxew4", Collections.singletonList("Worker"));
  66. change.put("tableField_mmczo634", Collections.singletonList(
  67. row("textField_mmd25ngw", "P1", "numberField_mmd25ngz", 3)));
  68. when(ydClient.queryData(any(YDParam.class), eq(YDConf.FORM_QUERY.retrieve_search_process_id)))
  69. .thenReturn(process(change));
  70. DDR_New project = project("P1", "other", "manager-other");
  71. Map projectRow = (Map) ((List) project.getData()).get(0);
  72. Map projectData = (Map) projectRow.get("formData");
  73. List<Map> inline = new ArrayList<>();
  74. for (int i = 0; i < 50; i++) inline.add(member("other-" + i, "manager-other"));
  75. projectData.put("tableField_mkowyn6d", inline);
  76. when(ydClient.queryData(any(YDParam.class), eq(YDConf.FORM_QUERY.retrieve_search_form)))
  77. .thenReturn(project);
  78. List<Map> full = new ArrayList<>(inline);
  79. full.add(member("worker", "manager-a"));
  80. when(ydService.queryDetails(any(YDParam.class))).thenReturn(full);
  81. assertEquals(Collections.singletonList("manager-a"), service.lookup("process-2"));
  82. verify(ydService).queryDetails(any(YDParam.class));
  83. }
  84. @Test
  85. void rejectsChangedProjectWithoutSubmitterMember() {
  86. Map<String, Object> change = new HashMap<>();
  87. change.put("employeeField_mmacxew4_id", Collections.singletonList("worker"));
  88. change.put("employeeField_mmacxew4", Collections.singletonList("Worker"));
  89. change.put("tableField_mmczo634", Collections.singletonList(
  90. row("textField_mmd25ngw", "P1", "numberField_mmd25ngz", 1)));
  91. when(ydClient.queryData(any(YDParam.class), eq(YDConf.FORM_QUERY.retrieve_search_process_id)))
  92. .thenReturn(process(change));
  93. when(ydClient.queryData(any(YDParam.class), eq(YDConf.FORM_QUERY.retrieve_search_form)))
  94. .thenReturn(project("P1", "other", "manager-other"));
  95. assertThrows(McException.class, () -> service.lookup("process-3"));
  96. }
  97. private static DDR_New process(Map<String, Object> data) {
  98. DDR_New result = new DDR_New();
  99. result.setData(data);
  100. return result;
  101. }
  102. private static DDR_New project(String code, String memberId, String... managerIds) {
  103. Map<String, Object> formData = new HashMap<>();
  104. formData.put("textField_mkov5ozb", code);
  105. formData.put("tableField_mkowyn6d", Collections.singletonList(member(memberId, managerIds)));
  106. Map<String, Object> item = new HashMap<>();
  107. item.put("formInstanceId", "FINST-1");
  108. item.put("formData", formData);
  109. DDR_New result = new DDR_New();
  110. result.setData(Collections.singletonList(item));
  111. result.setTotalCount(1);
  112. return result;
  113. }
  114. private static Map<String, Object> member(String memberId, String... managerIds) {
  115. Map<String, Object> row = new HashMap<>();
  116. row.put("employeeField_mmbfe0ij_id", Collections.singletonList(memberId));
  117. row.put("employeeField_mkoxpswf_id", Arrays.asList(managerIds));
  118. return row;
  119. }
  120. private static Map<String, Object> row(String firstKey, Object firstValue,
  121. String secondKey, Object secondValue) {
  122. Map<String, Object> row = new HashMap<>();
  123. row.put(firstKey, firstValue);
  124. row.put(secondKey, secondValue);
  125. return row;
  126. }
  127. }