TimeCardSummaryServiceTest.java 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  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.dingtalk.DDR_New;
  6. import com.malk.server.workhours.TimeCardDuplicateCleanupRequest;
  7. import com.malk.server.workhours.TimeCardDuplicateCleanupResult;
  8. import com.malk.server.workhours.TimeCardSummaryUpsertRequest;
  9. import com.malk.server.workhours.WHConf;
  10. import com.malk.service.aliwork.YDClient;
  11. import org.junit.jupiter.api.Test;
  12. import org.mockito.ArgumentCaptor;
  13. import org.springframework.test.util.ReflectionTestUtils;
  14. import java.util.Arrays;
  15. import java.util.Collections;
  16. import java.util.LinkedHashMap;
  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.junit.jupiter.api.Assertions.assertTrue;
  21. import static org.mockito.ArgumentMatchers.any;
  22. import static org.mockito.ArgumentMatchers.eq;
  23. import static org.mockito.Mockito.mock;
  24. import static org.mockito.Mockito.never;
  25. import static org.mockito.Mockito.verify;
  26. import static org.mockito.Mockito.when;
  27. class TimeCardSummaryServiceTest {
  28. @Test
  29. void shouldUpsertBySubmitterIdAndDayText() {
  30. YDClient ydClient = mock(YDClient.class);
  31. WHConf whConf = new WHConf();
  32. whConf.setYidaAppType("APP");
  33. whConf.setYidaSystemToken("TOKEN");
  34. whConf.setFormUuidWorkHoursSummary("FORM-SUMMARY");
  35. TimeCardSummaryService service = new TimeCardSummaryService();
  36. ReflectionTestUtils.setField(service, "ydClient", ydClient);
  37. ReflectionTestUtils.setField(service, "whConf", whConf);
  38. TimeCardSummaryUpsertRequest request = new TimeCardSummaryUpsertRequest();
  39. request.setSubmitterUserId("user-1");
  40. request.setDayText("20260716");
  41. request.setFormData(Collections.singletonMap("numberField_hours", 8));
  42. assertTrue(service.upsert(request));
  43. ArgumentCaptor<YDParam> captor = ArgumentCaptor.forClass(YDParam.class);
  44. verify(ydClient).operateData(captor.capture(), eq(YDConf.FORM_OPERATION.upsert));
  45. YDParam param = captor.getValue();
  46. Map<String, Object> condition = JSON.parseObject(param.getSearchCondition(), Map.class);
  47. Map<String, Object> formData = JSON.parseObject(param.getFormDataJson(), Map.class);
  48. assertEquals("user-1", condition.get("textField_mmbffvd9"));
  49. assertEquals("20260716", condition.get("textField_mmbffvdb"));
  50. assertEquals("user-1", formData.get("textField_mmbffvd9"));
  51. assertEquals("20260716", formData.get("textField_mmbffvdb"));
  52. assertEquals(8, ((Number) formData.get("numberField_hours")).intValue());
  53. }
  54. @Test
  55. void shouldValidateDuplicateCleanupWithoutDeletingInDryRun() {
  56. YDClient ydClient = mock(YDClient.class);
  57. WHConf whConf = new WHConf();
  58. whConf.setYidaAppType("APP");
  59. whConf.setYidaSystemToken("TOKEN");
  60. whConf.setFormUuidWorkHoursSummary("FORM-SUMMARY");
  61. TimeCardSummaryService service = new TimeCardSummaryService();
  62. ReflectionTestUtils.setField(service, "ydClient", ydClient);
  63. ReflectionTestUtils.setField(service, "whConf", whConf);
  64. DDR_New queryResult = mock(DDR_New.class);
  65. when(queryResult.getData()).thenReturn(Arrays.asList(
  66. summaryItem("DELETE-ID", "user-1", "20260507"),
  67. summaryItem("KEEP-ID", "user-1", "20260507")));
  68. when(ydClient.queryData(
  69. any(YDParam.class),
  70. eq(YDConf.FORM_QUERY.retrieve_search_form)))
  71. .thenReturn(queryResult);
  72. TimeCardDuplicateCleanupResult result =
  73. service.cleanupDuplicates(cleanupRequest(true));
  74. assertEquals(1, result.getValidated());
  75. assertEquals(0, result.getDeleted());
  76. verify(ydClient, never()).operateData(
  77. any(YDParam.class),
  78. eq(YDConf.FORM_OPERATION.delete_batch));
  79. }
  80. @Test
  81. void shouldRejectCleanupWhenCurrentDuplicateSetChanged() {
  82. TimeCardDuplicateCleanupRequest.Target target =
  83. cleanupRequest(true).getTargets().get(0);
  84. assertThrows(
  85. RuntimeException.class,
  86. () -> TimeCardSummaryService.validateCleanupTarget(
  87. target, Collections.singletonList("KEEP-ID")));
  88. }
  89. @Test
  90. void shouldDeleteValidatedTargetAndVerifyKeeper() {
  91. YDClient ydClient = mock(YDClient.class);
  92. WHConf whConf = new WHConf();
  93. whConf.setYidaAppType("APP");
  94. whConf.setYidaSystemToken("TOKEN");
  95. whConf.setFormUuidWorkHoursSummary("FORM-SUMMARY");
  96. TimeCardSummaryService service = new TimeCardSummaryService();
  97. ReflectionTestUtils.setField(service, "ydClient", ydClient);
  98. ReflectionTestUtils.setField(service, "whConf", whConf);
  99. DDR_New duplicateResult = mock(DDR_New.class);
  100. when(duplicateResult.getData()).thenReturn(Arrays.asList(
  101. summaryItem("DELETE-ID", "user-1", "20260507"),
  102. summaryItem("KEEP-ID", "user-1", "20260507")));
  103. DDR_New keeperResult = mock(DDR_New.class);
  104. when(keeperResult.getData()).thenReturn(Collections.singletonList(
  105. summaryItem("KEEP-ID", "user-1", "20260507")));
  106. when(ydClient.queryData(
  107. any(YDParam.class),
  108. eq(YDConf.FORM_QUERY.retrieve_search_form)))
  109. .thenReturn(duplicateResult, keeperResult);
  110. TimeCardDuplicateCleanupResult result =
  111. service.cleanupDuplicates(cleanupRequest(false));
  112. ArgumentCaptor<YDParam> captor = ArgumentCaptor.forClass(YDParam.class);
  113. verify(ydClient).operateData(
  114. captor.capture(),
  115. eq(YDConf.FORM_OPERATION.delete_batch));
  116. assertEquals(Collections.singletonList("DELETE-ID"),
  117. captor.getValue().getFormInstanceIdList());
  118. assertEquals(1, result.getDeleted());
  119. assertEquals(1, result.getVerified());
  120. }
  121. private static TimeCardDuplicateCleanupRequest cleanupRequest(boolean dryRun) {
  122. TimeCardDuplicateCleanupRequest.Target target =
  123. new TimeCardDuplicateCleanupRequest.Target();
  124. target.setUserId("user-1");
  125. target.setDayText("20260507");
  126. target.setDeleteInstanceId("DELETE-ID");
  127. target.setKeepInstanceId("KEEP-ID");
  128. TimeCardDuplicateCleanupRequest request =
  129. new TimeCardDuplicateCleanupRequest();
  130. request.setDryRun(dryRun);
  131. request.setTargets(Collections.singletonList(target));
  132. return request;
  133. }
  134. private static Map<String, Object> summaryItem(String instanceId,
  135. String userId,
  136. String dayText) {
  137. Map<String, Object> formData = new LinkedHashMap<>();
  138. formData.put("textField_mmbffvd9", userId);
  139. formData.put("textField_mmbffvdb", dayText);
  140. Map<String, Object> item = new LinkedHashMap<>();
  141. item.put("formInstanceId", instanceId);
  142. item.put("formData", formData);
  143. return item;
  144. }
  145. }