package com.yunhai.flowcenter.service; import com.fasterxml.jackson.databind.ObjectMapper; import com.yunhai.flowcenter.engine.AssigneeResolver; import com.yunhai.flowcenter.engine.FlowEngine; import com.yunhai.flowcenter.model.OapiModels; import com.yunhai.flowcenter.repository.FlwCallbackRegRepository; import com.yunhai.flowcenter.repository.FlwCcRepository; import com.yunhai.flowcenter.repository.FlwDefRepository; import com.yunhai.flowcenter.repository.FlwInstanceRepository; import com.yunhai.flowcenter.repository.FlwTaskRepository; import com.yunhai.platform.apistd.BizException; import com.yunhai.platform.openapi.base.OpenApiAppClient; import com.yunhai.platform.openapi.base.OpenApiUserClient; import com.yunhai.platform.utils.exception.ErrorCode; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.mockito.Mockito; import org.springframework.beans.factory.ObjectProvider; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; /** * F9 mode=task 直跳任务办理页(P6.2):pageUrl = front-url + #/task/{taskId}(无 token); * taskId 缺失 PARAM_ERROR;front-url 未配置沿用 fail-fast 纪律(先于一切定位)。 */ @DisplayName("embed/url mode=task(F9 任务页直跳)") class OapiFlowEmbedTaskUrlTest { private OapiFlowService service; @BeforeEach void setUp() { service = new OapiFlowService(Mockito.mock(FlwDefRepository.class), Mockito.mock(FlwInstanceRepository.class), Mockito.mock(FlwTaskRepository.class), Mockito.mock(FlwCcRepository.class), Mockito.mock(FlwCallbackRegRepository.class), Mockito.mock(FlowInstanceService.class), Mockito.mock(FlowTaskService.class), Mockito.mock(FlowEngine.class), Mockito.mock(AssigneeResolver.class), new ObjectMapper(), Mockito.mock(OpenApiUserClient.class), Mockito.mock(OpenApiAppClient.class), Mockito.mock(DiagramTokenService.class), Mockito.mock(ObjectProvider.class)); } private void frontUrl(String value) { org.springframework.test.util.ReflectionTestUtils.setField(service, "embedFrontUrl", value); } @Test void taskModeIssuesCenterTaskPageUrlWithoutToken() { frontUrl("http://fc.local/flow-center"); OapiModels.EmbedUrlVo vo = service.embedUrl(1L, null, null, null, "task", 88L); assertEquals("http://fc.local/flow-center/#/task/88", vo.getPageUrl(), "pageUrl = front-url(补尾斜杠)+ #/task/{taskId}"); assertEquals(0L, vo.getExpiresIn(), "无 token 模式无有效期,expiresIn=0"); } @Test void taskModeWithoutTaskIdRejected() { frontUrl("http://fc.local/flow-center"); BizException e = assertThrows(BizException.class, () -> service.embedUrl(1L, null, null, null, "task", null)); assertEquals(ErrorCode.PARAM_ERROR, e.getErrorCode(), "缺 taskId 是参数错误"); assertTrue(e.getMessage().contains("taskId"), "报错须点名缺失参数"); } @Test void missingFrontUrlStillFailsFastEvenForTaskMode() { frontUrl(" "); BizException e = assertThrows(BizException.class, () -> service.embedUrl(1L, null, null, null, "task", 88L)); assertEquals(ErrorCode.INTERNAL_SERVER_ERROR, e.getErrorCode(), "配置缺失优先于 mode 分支:宁可拒绝也不发打不开的地址"); } }