package jnpf.dmsService; import jnpf.base.ActionResult; import jnpf.dmsEntity.storage.DmsTemplateNotification; import jnpf.dmsMapper.DmsTemplateNotificationMapper; import jnpf.message.SentMessageApi; import org.junit.jupiter.api.Test; import java.util.*; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; class DmsTemplateNotificationServiceTest { DmsTemplateNotificationMapper mapper = mock(DmsTemplateNotificationMapper.class); SentMessageApi api = mock(SentMessageApi.class); DmsTemplateNotificationService service = new DmsTemplateNotificationService(mapper, api); private ActionResult response(int code, boolean data) { var r = new ActionResult(); r.setCode(code); r.setData(data); return r; } DmsTemplateNotification event() { var e = new DmsTemplateNotification(); e.setTenantId("tenant"); e.setTaskId("task"); e.setTemplateId("A"); return e; } @Test void retryReadsChangedDepartmentsAndRequiresPositiveAcknowledgement() { var e = event(); when(mapper.claim(eq(e),anyString())).thenReturn(1); when(mapper.template("tenant","A")).thenReturn(Map.of("departments","[\"one\"]","name","旧模板名称"),Map.of("departments","[\"two\"]","name","最新模板名称")); when(mapper.recipients("tenant",List.of("one"))).thenReturn(List.of("u1")); when(mapper.recipients("tenant",List.of("two"))).thenReturn(List.of("u2")); when(api.sendDmsUpgrade(any())).thenReturn(response(500, false),response(200, true)); when(mapper.finish(eq(e),anyString(),any(),anyString())).thenReturn(1); service.deliver(e); service.deliver(e); verify(mapper).finish(eq(e),anyString(),contains("确认"),eq("RETRY")); verify(api).sendDmsUpgrade(argThat(m -> m.getToUserIds().equals(List.of("u2")) && "最新模板名称".equals(m.getParameters().get("TemplateName")))); verify(mapper).finish(eq(e),anyString(),isNull(),eq("SENT")); } @Test void emptyDepartmentsCompleteWithoutSendingAndMissingTemplateRetries() { var e=event(); when(mapper.claim(eq(e),anyString())).thenReturn(1); when(mapper.template("tenant","A")).thenReturn(Map.of("departments","[]"),null); when(mapper.finish(eq(e),anyString(),any(),anyString())).thenReturn(1); service.deliver(e); service.deliver(e); verifyNoInteractions(api); verify(mapper).finish(eq(e),anyString(),isNull(),eq("NO_RECIPIENTS")); verify(mapper).finish(eq(e),anyString(),contains("模板"),eq("RETRY")); } @Test void duplicateLeaseDoesNotSendAndMalformedDepartmentConfigurationFails() { service.deliver(event()); verifyNoInteractions(api); assertEquals(List.of("one"),DmsTemplateNotificationService.departmentIds("[\"one\",\"one\"]")); assertThrows(RuntimeException.class,()->DmsTemplateNotificationService.departmentIds("{}")); } }