刘光辉
118 分钟以前 06f314545ac3514d7ce28939920866ae8188d31c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package jnpf.flowable.service.dev;
 
import jnpf.base.model.flow.FlowFormDataModel;
import jnpf.exception.WorkFlowException;
import jnpf.flowable.entity.*;
import jnpf.flowable.model.task.FlowModel;
import jnpf.flowable.model.templatenode.nodejson.NodeModel;
import jnpf.flowable.model.util.*;
import jnpf.flowable.service.OperatorService;
import jnpf.flowable.util.*;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import java.util.*;
import static org.junit.Assert.*;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
 
public class DevApprovalStepTest {
    @Test public void savesThroughNativeFormBeforeAuditAndAlwaysCleansActorScope() throws Exception {
        OperatorUtil engine = mock(OperatorUtil.class); ServiceUtil forms = mock(ServiceUtil.class);
        OperatorService operators = mock(OperatorService.class);
        DevApprovalStep step = new DevApprovalStep(engine, forms, operators);
        OperatorEntity operator = new OperatorEntity(); operator.setId("op"); operator.setTaskId("task"); operator.setNodeCode("node");
        TaskEntity task = new TaskEntity(); task.setId("task"); task.setFlowId("flow");
        TemplateNodeEntity definition = new TemplateNodeEntity(); definition.setNodeCode("node"); definition.setFormId("form");
        NodeModel node = new NodeModel(); node.setFormOperates(List.of(Map.of("id", "reason", "required", true, "write", false)));
        FlowModel model = new FlowModel(); model.setTaskEntity(task); model.setNodes(Map.of("node", node)); model.setNodeEntityList(List.of(definition));
        Map<String,Object> values = new HashMap<>(Map.of("biz_sign", "real-sign", "reason", "已输入")); model.setFormData(values);
        when(forms.infoData("form", "task")).thenReturn(values);
        doAnswer(call -> {
            assertTrue(DevApprovalActor.isActing("op", "signer"));
            assertFalse(DevApprovalActor.isActing("other", "signer"));
            return null;
        }).when(forms).saveOrUpdateFormData(any());
        try {
            step.approve(operator, model, "signer");
            assertFalse(DevApprovalActor.active());
            var order = inOrder(forms, engine);
            ArgumentCaptor<FlowFormDataModel> capture = ArgumentCaptor.forClass(FlowFormDataModel.class);
            order.verify(forms).saveOrUpdateFormData(capture.capture());
            order.verify(forms).infoData("form", "task");
            order.verify(engine).audit(operator, model);
            order.verify(forms).handleFormData("flow", true);
            assertEquals("op", capture.getValue().getWorkflowOperatorId());
            assertFalse(Boolean.TRUE.equals(capture.getValue().getSkipRequiredValidation()));
            assertEquals(true, capture.getValue().getFormOperates().get(0).get("write"));
            assertEquals(false, node.getFormOperates().get(0).get("write"));
            reset(engine); doThrow(new WorkFlowException("native failure")).when(forms).saveOrUpdateFormData(any());
            try { step.approve(operator, model, "signer"); fail(); } catch (WorkFlowException expected) { }
            verifyNoInteractions(engine); assertFalse(DevApprovalActor.active());
        } finally { FlowContextHolder.clearAll(); }
    }
}