package jnpf.dmsService;
|
|
import jnpf.dmsEntity.DmsWenjianBanbenEntity;
|
import jnpf.dmsEntity.DmsWenjianZiyuanEntity;
|
import jnpf.dmsEntity.download.entity.DmsWenjianXiazaiShenqingDetailEntity;
|
import jnpf.dmsEntity.download.entity.DmsWenjianXiazaiShenqingEntity;
|
import jnpf.dmsEntity.download.form.DmsWorkflowDownloadAuthorizeForm;
|
import jnpf.dmsEntity.download.vo.DmsWorkflowDownloadAuthorizationVO;
|
import jnpf.dmsEntity.permission.entity.DmsFilePermissionEntity;
|
import jnpf.dmsEntity.permission.entity.DmsFileVersionEntity;
|
import jnpf.dmsMapper.DmsWenjianXiazaiShenqingDetailMapper;
|
import jnpf.dmsMapper.DmsWenjianXiazaiShenqingMapper;
|
import jnpf.exception.DataException;
|
import jnpf.flowable.WorkFlowApi;
|
import jnpf.flowable.entity.TaskEntity;
|
import jnpf.flowable.enums.TaskStatusEnum;
|
import org.junit.jupiter.api.Test;
|
|
import java.util.Collections;
|
import java.util.UUID;
|
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertThrows;
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
import static org.mockito.ArgumentMatchers.any;
|
import static org.mockito.ArgumentMatchers.eq;
|
import static org.mockito.Mockito.mock;
|
import static org.mockito.Mockito.never;
|
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.when;
|
|
class DmsWorkflowDownloadAuthorizationServiceTest {
|
private static final String TENANT_ID = "tenant-1";
|
private static final String FLOW_ID = "flow-1";
|
private static final String TASK_ID = "task-1";
|
private static final String REQUEST_ID = "request-1";
|
private static final String DETAIL_ID = "detail-1";
|
private static final String APPLICANT_ID = "user-1";
|
private static final UUID DOCUMENT_ID =
|
UUID.fromString("018f0000-0000-7000-8000-000000000801");
|
private static final UUID FILE_VERSION_ID =
|
UUID.fromString("018f0000-0000-7000-8000-000000000802");
|
private static final UUID PERMISSION_ID =
|
UUID.fromString("018f0000-0000-7000-8000-000000000803");
|
|
@Test
|
void grantsSingleUseDownloadForApprovedRequestApplicant() {
|
Fixture fixture = new Fixture();
|
DmsWorkflowDownloadAuthorizeForm form = form();
|
when(fixture.workFlowApi.getInfoSubmit(TASK_ID)).thenReturn(passedTask());
|
when(fixture.requestMapper.selectByFlowForUpdate(TENANT_ID, FLOW_ID, TASK_ID))
|
.thenReturn(Collections.singletonList(request()));
|
when(fixture.detailMapper.selectByRequestForUpdate(TENANT_ID, REQUEST_ID))
|
.thenReturn(Collections.singletonList(detail()));
|
when(fixture.fileResolutionService.resolve(TENANT_ID, DETAIL_ID, "number-detail-1",
|
"QM-001", "质量手册", null)).thenReturn(
|
new DmsWorkflowFileResolutionService.ResolvedFile(
|
businessFile(), businessVersion(), fileVersion()));
|
DmsFilePermissionEntity permission = new DmsFilePermissionEntity();
|
permission.setId(PERMISSION_ID);
|
permission.setResourceId(FILE_VERSION_ID);
|
when(fixture.permissionGrantService.ensureWorkflowDownloadPermissions(
|
eq(TENANT_ID), eq("download-request:" + REQUEST_ID + ":" + DETAIL_ID), eq(APPLICANT_ID),
|
eq(Collections.singletonList(FILE_VERSION_ID)), eq(DmsDownloadDeadline.resolve("1", DETAIL_ID)), eq("jnpf-file"), any()))
|
.thenReturn(Collections.singletonList(permission));
|
|
DmsWorkflowDownloadAuthorizationVO result = fixture.service.authorize(
|
TENANT_ID, form, "jnpf-file");
|
|
assertTrue(result.getCompleted());
|
assertEquals(APPLICANT_ID, result.getApplicantUserId());
|
assertEquals(1, result.getFiles().size());
|
assertEquals(FILE_VERSION_ID, result.getFiles().get(0).getFileVersionId());
|
assertEquals(PERMISSION_ID, result.getFiles().get(0).getPermissionId());
|
assertEquals(Boolean.FALSE, result.getFiles().get(0).getPermanent());
|
}
|
|
@Test
|
void rejectsTaskThatHasNotPassedBeforeReadingApplication() {
|
Fixture fixture = new Fixture();
|
TaskEntity running = passedTask();
|
running.setStatus(TaskStatusEnum.RUNNING.getCode());
|
when(fixture.workFlowApi.getInfoSubmit(TASK_ID)).thenReturn(running);
|
|
DataException exception = assertThrows(DataException.class,
|
() -> fixture.service.authorize(TENANT_ID, form(), "jnpf-file"));
|
|
assertEquals("流程任务尚未审核通过,不能授予下载权限", exception.getMessage());
|
verify(fixture.requestMapper, never()).selectByFlowForUpdate(any(), any(), any());
|
}
|
|
private static DmsWorkflowDownloadAuthorizeForm form() {
|
DmsWorkflowDownloadAuthorizeForm form = new DmsWorkflowDownloadAuthorizeForm();
|
form.setSourceId(FLOW_ID);
|
form.setTaskId(TASK_ID);
|
return form;
|
}
|
|
private static TaskEntity passedTask() {
|
TaskEntity task = new TaskEntity();
|
task.setId(TASK_ID);
|
task.setFlowId(FLOW_ID);
|
task.setStatus(TaskStatusEnum.PASSED.getCode());
|
return task;
|
}
|
|
private static DmsWenjianXiazaiShenqingEntity request() {
|
DmsWenjianXiazaiShenqingEntity request = new DmsWenjianXiazaiShenqingEntity();
|
request.setId(REQUEST_ID);
|
request.setApplicantUserId(APPLICANT_ID);
|
request.setFlowState(TaskStatusEnum.PASSED.getCode());
|
request.setBizSign("request-sign-1");
|
return request;
|
}
|
|
private static DmsWenjianXiazaiShenqingDetailEntity detail() {
|
DmsWenjianXiazaiShenqingDetailEntity detail = new DmsWenjianXiazaiShenqingDetailEntity();
|
detail.setId(DETAIL_ID);
|
detail.setXiazaiShixian("1");
|
detail.setFileReferenceId("number-detail-1");
|
detail.setFileNumber("QM-001");
|
detail.setFileName("质量手册");
|
return detail;
|
}
|
|
private static DmsWenjianZiyuanEntity businessFile() {
|
DmsWenjianZiyuanEntity file = new DmsWenjianZiyuanEntity();
|
file.setId("business-file-1");
|
file.setWenjianBianhao("QM-001");
|
file.setWenjianMingcheng("质量手册");
|
file.setDangqianBanbenId("business-version-1");
|
file.setWenjianZhongxinWenjianId(DOCUMENT_ID.toString());
|
return file;
|
}
|
|
private static DmsWenjianBanbenEntity businessVersion() {
|
DmsWenjianBanbenEntity version = new DmsWenjianBanbenEntity();
|
version.setId("business-version-1");
|
version.setWenjianId("business-file-1");
|
version.setWenjianZhongxinBanbenId(FILE_VERSION_ID.toString());
|
return version;
|
}
|
|
private static DmsFileVersionEntity fileVersion() {
|
DmsFileVersionEntity version = new DmsFileVersionEntity();
|
version.setId(FILE_VERSION_ID);
|
version.setDocumentId(DOCUMENT_ID);
|
version.setFileName("quality-manual.docx");
|
version.setMimeType("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
|
version.setSizeBytes(2048L);
|
return version;
|
}
|
|
private static final class Fixture {
|
private final WorkFlowApi workFlowApi = mock(WorkFlowApi.class);
|
private final DmsWenjianXiazaiShenqingMapper requestMapper =
|
mock(DmsWenjianXiazaiShenqingMapper.class);
|
private final DmsWenjianXiazaiShenqingDetailMapper detailMapper =
|
mock(DmsWenjianXiazaiShenqingDetailMapper.class);
|
private final DmsWorkflowFileResolutionService fileResolutionService =
|
mock(DmsWorkflowFileResolutionService.class);
|
private final DmsPermissionGrantService permissionGrantService =
|
mock(DmsPermissionGrantService.class);
|
private final DmsWorkflowDownloadAuthorizationService service =
|
new DmsWorkflowDownloadAuthorizationService(workFlowApi, requestMapper, detailMapper,
|
fileResolutionService, permissionGrantService);
|
}
|
}
|