[audit] P6.2 F9 embed/url 支持 mode=task 直跳任务办理页(taskId 必填,无 token CAS 页;front-url fail-fast 纪律不变)

This commit is contained in:
chenxing
2026-10-18 08:11:28 +08:00
parent 448c8d36f4
commit ad87005169
3 changed files with 103 additions and 6 deletions
@@ -0,0 +1,77 @@
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 分支:宁可拒绝也不发打不开的地址");
}
}