/** * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. */ package com.liferay.portal.workflow.task.web.internal.permission; import com.liferay.asset.kernel.model.AssetRenderer; import com.liferay.portal.kernel.exception.PortalException; import com.liferay.portal.kernel.model.Group; import com.liferay.portal.kernel.model.Role; import com.liferay.portal.kernel.model.User; import com.liferay.portal.kernel.security.permission.PermissionChecker; import com.liferay.portal.kernel.service.GroupLocalServiceUtil; import com.liferay.portal.kernel.test.util.RandomTestUtil; import com.liferay.portal.kernel.workflow.WorkflowHandler; import com.liferay.portal.kernel.workflow.WorkflowHandlerRegistryUtil; import com.liferay.portal.kernel.workflow.WorkflowTask; import com.liferay.portal.kernel.workflow.WorkflowTaskAssignee; import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Matchers; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.core.classloader.annotations.SuppressStaticInitializationFor; import org.powermock.modules.junit4.PowerMockRunner; /** * @author Adam Brandizzi */ @PrepareForTest( {GroupLocalServiceUtil.class, WorkflowHandlerRegistryUtil.class} ) @RunWith(PowerMockRunner.class) @SuppressStaticInitializationFor( { "com.liferay.portal.kernel.service.GroupLocalServiceUtil", "com.liferay.portal.kernel.workflow.WorkflowHandlerRegistryUtil" } ) public class WorkflowTaskPermissionCheckerTest extends PowerMockito { @Before public void setUp() throws PortalException { setUpGroupLocalServiceUtil(); setUpWorkflowHandlerRegistryUtil(); } @Test public void testCompanyAdminHasPermission() { Assert.assertTrue( _workflowTaskPermissionChecker.hasPermission( RandomTestUtil.randomLong(), mockWorkflowTask(), mockCompanyAdminPermissionChecker())); } @Test public void testContentReviewerHasPermission() { PermissionChecker permissionChecker = mockContentReviewerPermissionChecker(RandomTestUtil.randomLong()); WorkflowTask workflowTask = mockWorkflowTask( User.class.getName(), permissionChecker.getUserId()); Assert.assertTrue( _workflowTaskPermissionChecker.hasPermission( RandomTestUtil.randomLong(), workflowTask, permissionChecker)); } @Test public void testContentReviewerRoleHasPermission() { long[] permissionCheckerRoleIds = randomPermissionCheckerRoleIds(); WorkflowTask workflowTask = mockWorkflowTask( Role.class.getName(), permissionCheckerRoleIds[0]); PermissionChecker permissionChecker = mockContentReviewerPermissionChecker( RandomTestUtil.randomLong(), permissionCheckerRoleIds); Assert.assertTrue( _workflowTaskPermissionChecker.hasPermission( RandomTestUtil.randomLong(), workflowTask, permissionChecker)); } @Test public void testContentReviewerRoleWithAssetViewPermissionHasPermission() throws PortalException { long[] permissionCheckerRoleIds = randomPermissionCheckerRoleIds(); WorkflowTask workflowTask = mockWorkflowTask( Role.class.getName(), permissionCheckerRoleIds[0]); PermissionChecker permissionChecker = mockPermissionChecker( RandomTestUtil.randomLong(), permissionCheckerRoleIds, false, false, false); mockAssetRendererHasViewPermission(true); Assert.assertTrue( _workflowTaskPermissionChecker.hasPermission( RandomTestUtil.randomLong(), workflowTask, permissionChecker)); } @Test public void testNotAssigneeHasNoPermission() { long assigneeUserId = RandomTestUtil.randomLong(); WorkflowTask workflowTask = mockWorkflowTask( User.class.getName(), assigneeUserId); long permissionCheckerUserId = RandomTestUtil.randomLong(); PermissionChecker permissionChecker = mockContentReviewerPermissionChecker(permissionCheckerUserId); Assert.assertFalse( _workflowTaskPermissionChecker.hasPermission( assigneeUserId, workflowTask, permissionChecker)); } @Test public void testNotAssigneeRoleHasNoPermission() { long assigneeRoleId = RandomTestUtil.randomLong(); WorkflowTask workflowTask = mockWorkflowTask( Role.class.getName(), assigneeRoleId); PermissionChecker permissionChecker = mockContentReviewerPermissionChecker(RandomTestUtil.randomLong()); Assert.assertFalse( _workflowTaskPermissionChecker.hasPermission( assigneeRoleId, workflowTask, permissionChecker)); } @Test public void testNotContentReviewerHasNoPermission() { PermissionChecker permissionChecker = mockPermissionChecker( RandomTestUtil.randomLong(), new long[0], false, false, false); Assert.assertFalse( _workflowTaskPermissionChecker.hasPermission( RandomTestUtil.randomLong(), mockWorkflowTask(), permissionChecker)); } @Test public void testNotContentReviewerWithAssetViewPermissionHasNoPermission() throws PortalException { PermissionChecker permissionChecker = mockPermissionChecker( RandomTestUtil.randomLong(), new long[0], false, false, false); mockAssetRendererHasViewPermission(true); Assert.assertFalse( _workflowTaskPermissionChecker.hasPermission( RandomTestUtil.randomLong(), mockWorkflowTask(), permissionChecker)); } @Test public void testNotContentReviewerWithAssetViewPermissionHasPermission() throws PortalException { // Checks permission on completed workflow task PermissionChecker permissionChecker = mockPermissionChecker( RandomTestUtil.randomLong(), new long[0], false, false, false); mockAssetRendererHasViewPermission(true); Assert.assertTrue( _workflowTaskPermissionChecker.hasPermission( RandomTestUtil.randomLong(), mockCompletedWorkflowTask(), permissionChecker)); } @Test public void testNotContentReviewerWithNoAssetViewPermissionHasNoPermission() throws PortalException { long[] permissionCheckerRoleIds = randomPermissionCheckerRoleIds(); WorkflowTask workflowTask = mockWorkflowTask( Role.class.getName(), permissionCheckerRoleIds[0]); PermissionChecker permissionChecker = mockPermissionChecker( RandomTestUtil.randomLong(), permissionCheckerRoleIds, false, false, false); mockAssetRendererHasViewPermission(false); Assert.assertFalse( _workflowTaskPermissionChecker.hasPermission( RandomTestUtil.randomLong(), workflowTask, permissionChecker)); } @Test public void testNotContentReviewerWithoutAssetViewPermissionHasNoPermission() throws PortalException { // Checks permission on completed workflow task PermissionChecker permissionChecker = mockPermissionChecker( RandomTestUtil.randomLong(), new long[0], false, false, false); mockAssetRendererHasViewPermission(false); Assert.assertFalse( _workflowTaskPermissionChecker.hasPermission( RandomTestUtil.randomLong(), mockCompletedWorkflowTask(), permissionChecker)); } @Test public void testOmniadminHasPermission() { Assert.assertTrue( _workflowTaskPermissionChecker.hasPermission( RandomTestUtil.randomLong(), mockWorkflowTask(), mockOmniadminPermissionChecker())); } protected void mockAssetRendererHasViewPermission( boolean hasAssetViewPermission) throws PortalException { WorkflowHandler workflowHandler = mock(WorkflowHandler.class); when( WorkflowHandlerRegistryUtil.getWorkflowHandler(Matchers.anyString()) ).thenReturn( workflowHandler ); AssetRenderer assetRenderer = mock(AssetRenderer.class); when( workflowHandler.getAssetRenderer(Matchers.anyLong()) ).thenReturn( assetRenderer ); when( assetRenderer.hasViewPermission( Matchers.any(PermissionChecker.class)) ).thenReturn( hasAssetViewPermission ); } protected PermissionChecker mockCompanyAdminPermissionChecker() { return mockPermissionChecker( RandomTestUtil.randomLong(), new long[0], true, false, false); } protected WorkflowTask mockCompletedWorkflowTask() { return mockWorkflowTask( Role.class.getName(), RandomTestUtil.randomLong(), true); } protected PermissionChecker mockContentReviewerPermissionChecker( long userId) { return mockPermissionChecker(userId, new long[0], false, true, false); } protected PermissionChecker mockContentReviewerPermissionChecker( long userId, long[] roleIds) { return mockPermissionChecker(userId, roleIds, false, true, false); } protected PermissionChecker mockOmniadminPermissionChecker() { return mockPermissionChecker( RandomTestUtil.randomLong(), new long[0], false, false, true); } protected PermissionChecker mockPermissionChecker( long userId, long[] roleIds, boolean companyAdmin, boolean contentReviewer, boolean omniadmin) { PermissionChecker permissionChecker = mock(PermissionChecker.class); when( permissionChecker.getUserId() ).thenReturn( userId ); when( permissionChecker.getRoleIds(Matchers.anyLong(), Matchers.anyLong()) ).thenReturn( roleIds ); when( permissionChecker.isCompanyAdmin() ).thenReturn( companyAdmin ); when( permissionChecker.isContentReviewer( Matchers.anyLong(), Matchers.anyLong()) ).thenReturn( contentReviewer ); when( permissionChecker.isOmniadmin() ).thenReturn( omniadmin ); return permissionChecker; } protected WorkflowTask mockWorkflowTask() { return mockWorkflowTask( Role.class.getName(), RandomTestUtil.randomLong()); } protected WorkflowTask mockWorkflowTask( String assigneeClassName, long assigneeClassPK) { return mockWorkflowTask(assigneeClassName, assigneeClassPK, false); } protected WorkflowTask mockWorkflowTask( String assigneeClassName, long assigneeClassPK, boolean completed) { WorkflowTaskAssignee workflowTaskAssignee = mockWorkflowTaskAssignee( assigneeClassName, assigneeClassPK); WorkflowTask workflowTask = mock(WorkflowTask.class); List<WorkflowTaskAssignee> workflowTaskAssignees = new ArrayList<>(); workflowTaskAssignees.add(workflowTaskAssignee); when( workflowTask.getOptionalAttributes() ).thenReturn( new HashMap<String, Serializable>() ); when( workflowTask.getWorkflowTaskAssignees() ).thenReturn( workflowTaskAssignees ); when( workflowTask.isCompleted() ).thenReturn( completed ); return workflowTask; } protected WorkflowTaskAssignee mockWorkflowTaskAssignee( String className, long classPK) { WorkflowTaskAssignee workflowTaskAssignee = mock( WorkflowTaskAssignee.class); when( workflowTaskAssignee.getAssigneeClassName() ).thenReturn( className ); when( workflowTaskAssignee.getAssigneeClassPK() ).thenReturn( classPK ); return workflowTaskAssignee; } protected long[] randomPermissionCheckerRoleIds() { return new long[] {RandomTestUtil.randomLong()}; } protected void setUpGroupLocalServiceUtil() throws PortalException { mockStatic(GroupLocalServiceUtil.class); Group group = mock(Group.class); when( GroupLocalServiceUtil.getGroup(Matchers.anyLong()) ).thenReturn( group ); } protected void setUpWorkflowHandlerRegistryUtil() { mockStatic(WorkflowHandlerRegistryUtil.class); } private final WorkflowTaskPermissionChecker _workflowTaskPermissionChecker = new WorkflowTaskPermissionChecker(); }