package jnpf.flowable.service; import jnpf.flowable.entity.TemplateNodeEntity; import jnpf.flowable.model.filepermission.FilePermissionNativeState; import jnpf.flowable.model.filepermission.FilePermissionPolicy.Action; import jnpf.flowable.model.filepermission.FilePermissionView; import jnpf.flowable.util.filepermission.FilePermissionRuntime; import jnpf.flowable.util.filepermission.FilePermissionSnapshot; import org.junit.Test; import java.util.List; import java.util.Map; import static org.junit.Assert.*; /** 同事务提交不得用尚未生成节点/经办的 RUNNING 状态核验原生表单。 */ public class DmsSubmissionFilePermissionStateTest { @Test public void draftCanSaveButIncompleteRunningStateMustStillFailClosed() { for (int status : List.of(0, 8, 9)) { FilePermissionView view = resolve(status, "creator", true); assertEquals("ready", view.getStatus()); assertTrue(view.allows("files", Action.REPLACE)); } FilePermissionView transitioning = resolve(1, "creator", true); assertEquals("RUNTIME_UNAVAILABLE", transitioning.getReason()); assertFalse(transitioning.allows("files", Action.REPLACE)); } @Test public void preSubmissionValidationRetainsFieldAndIdentityRestrictions() { assertFalse(resolve(0, "creator", false).allows("files", Action.REPLACE)); assertFalse(resolve(0, "stranger", true).allows("files", Action.REPLACE)); } private FilePermissionView resolve(int status, String user, boolean writable) { Map rule = Map.of("id", "rule", "formId", "form", "field", "files", "subject", "CREATOR", "trigger", "COMPLETED", "actions", Map.of("REPLACE", "DENY")); FilePermissionSnapshot snapshot = FilePermissionSnapshot.read(FilePermissionSnapshot.create("0", "task", "flow", Map.of("version", 1, "rules", List.of(rule))), "0", "task"); FilePermissionNativeState state = new FilePermissionNativeState(); state.setTaskId("task"); state.setFlowId("flow"); state.setFlowType(1); state.setCreatorId("creator"); state.setStatus(status); TemplateNodeEntity start = new TemplateNodeEntity(); start.setNodeCode("start"); start.setNodeType("start"); start.setFormId("form"); start.setNodeJson("{\"formOperates\":[{\"id\":\"files\",\"read\":true,\"write\":" + writable + "}]}"); Map form = Map.of("fields", List.of(Map.of("__vModel__", "files", "__config__", Map.of("jnpfKey", "uploadFile")))); return FilePermissionRuntime.resolve(snapshot.getRules(), NativeFilePermissionRuntimeSource.project( "0", "form", user, snapshot, state, List.of(start), form)); } }