package jnpf.base.service; import jnpf.base.UserInfo; import jnpf.flowable.WorkFlowApi; import jnpf.flowable.model.filepermission.FilePermissionReader; import jnpf.flowable.model.filepermission.FilePermissionView; import jnpf.util.UserProvider; import org.junit.Before; import org.junit.Test; import org.mockito.MockedStatic; import org.springframework.beans.factory.ObjectProvider; import static org.junit.Assert.*; import static org.mockito.Mockito.*; public class UploadFilePermissionQueryTest { private WorkFlowApi workflow; private ObjectProvider local; private UploadFilePermissionQuery query; @Before @SuppressWarnings("unchecked") public void setup() { workflow = mock(WorkFlowApi.class); local = mock(ObjectProvider.class); query = new UploadFilePermissionQuery(workflow, local); } @Test public void tokenlessCallbackOwnerStaysInCurrentExecutionContext() { UserInfo owner = new UserInfo(); owner.setUserId("lease-owner"); owner.setTenantId("tenant"); assertNull(owner.getToken()); FilePermissionView result = FilePermissionView.legacy("task", "form"); when(local.getIfAvailable()).thenReturn((task, form) -> { assertSame(owner, UserProvider.getLocalLoginUser()); assertEquals("task", task); assertEquals("form", form); return result; }); try (MockedStatic users = mockStatic(UserProvider.class)) { users.when(UserProvider::getLocalLoginUser).thenReturn(owner); assertSame(result, query.current("task", "form")); } verifyNoInteractions(workflow); } @Test public void localDenialNeverFallsBackToRemoteIdentity() { FilePermissionReader reader = mock(FilePermissionReader.class); FilePermissionView denied = FilePermissionView.unavailable("task", "form", "PERMISSION_UNAVAILABLE"); when(local.getIfAvailable()).thenReturn(reader); when(reader.current("task", "form")).thenReturn(denied); assertSame(denied, query.current("task", "form")); verifyNoInteractions(workflow); } @Test public void localFailureNeverFallsBackToRemoteIdentity() { FilePermissionReader reader = mock(FilePermissionReader.class); when(local.getIfAvailable()).thenReturn(reader); when(reader.current("task", "form")).thenThrow(new IllegalStateException("unavailable")); try { query.current("task", "form"); fail("local failure must stop the action"); } catch (IllegalStateException expected) { assertEquals("unavailable", expected.getMessage()); } verifyNoInteractions(workflow); } @Test public void separateDeploymentRetainsCurrentUserRemoteQuery() { FilePermissionView result = FilePermissionView.legacy("task", "form"); when(workflow.filePermissions("task", "form")).thenReturn(result); assertSame(result, query.current("task", "form")); verify(workflow).filePermissions("task", "form"); } @Test public void publishedFormReuseKeepsLocalDenialAndRemoteDeploymentBoundary() { FilePermissionReader reader = mock(FilePermissionReader.class); FilePermissionView denied = FilePermissionView.unavailable("task", "form", "PERMISSION_UNAVAILABLE"); when(local.getIfAvailable()).thenReturn(reader); when(reader.currentWithPublishedForm("task","form","{}" )).thenReturn(denied); assertSame(denied,query.currentWithPublishedForm("task","form","{}")); verifyNoInteractions(workflow); when(local.getIfAvailable()).thenReturn(null); when(workflow.filePermissions("task","form")).thenReturn(denied); assertSame(denied,query.currentWithPublishedForm("task","form","{}")); verify(workflow).filePermissions("task","form"); } }