package jnpf.flowable.service.dev; import jnpf.base.UserInfo; import jnpf.exception.WorkFlowException; import jnpf.flowable.mapper.DevApprovalSignatureMapper; import jnpf.util.UserProvider; import org.junit.BeforeClass; import org.junit.Test; import org.mockito.MockedStatic; import java.util.Date; import static org.junit.Assert.*; import static org.mockito.Mockito.*; public class DevApprovalSignaturesTest { @BeforeClass public static void context() { jnpf.util.context.SpringContext.setApplicationContext(mock(org.springframework.context.ApplicationContext.class)); } @Test public void bindsRealSignerTenantInstanceAgeAndUnconsumedEvidence() throws Exception { DevApprovalSignatureMapper mapper = mock(DevApprovalSignatureMapper.class); DevApprovalSignatures service = new DevApprovalSignatures(mapper); UserInfo user = new UserInfo(); user.setUserId("signer"); user.setTenantId("tenant"); DevApprovalSignature sign = new DevApprovalSignature(); sign.setId("sign"); sign.setUserId("signer"); sign.setCreatedAt(new Date()); sign.setMetaData("{\"biz_module\":\"workflow-dev-approval\",\"biz_data\":[\"task\"]}"); when(mapper.find("sign", "tenant")).thenReturn(sign); try (MockedStatic users = mockStatic(UserProvider.class)) { users.when(UserProvider::getUser).thenReturn(user); users.when(UserProvider::getLoginUserId).thenReturn("signer"); assertSame(sign, service.require("task", "sign")); assertSame(sign, service.require("task", "sign")); // same run can sign multiple nodes reject(() -> service.require("other-task", "sign")); reject(() -> service.require("task", "missing")); reject(() -> service.require("task", "")); sign.setUserId("somebody-else"); reject(() -> service.require("task", "sign")); sign.setUserId("signer"); sign.setCreatedAt(new Date(System.currentTimeMillis() - 31 * 60 * 1000)); reject(() -> service.require("task", "sign")); sign.setCreatedAt(new Date()); sign.setExtraJson("{}"); reject(() -> service.require("task", "sign")); sign.setExtraJson(null); sign.setMetaData("{}"); reject(() -> service.require("task", "sign")); user.setTenantId("other"); reject(() -> service.require("task", "sign")); } } interface Operation { void run() throws WorkFlowException; } private static void reject(Operation op) throws Exception { try { op.run(); fail("must reject invalid evidence"); } catch (WorkFlowException expected) { } } }