/** * 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.blogs.portlet.test; import com.liferay.arquillian.extension.junit.bridge.junit.Arquillian; import com.liferay.blogs.model.BlogsEntry; import com.liferay.portal.kernel.exception.NoSuchLayoutException; import com.liferay.portal.kernel.model.Group; import com.liferay.portal.kernel.model.Layout; import com.liferay.portal.kernel.model.PortletInstance; import com.liferay.portal.kernel.model.User; import com.liferay.portal.kernel.model.impl.VirtualLayout; import com.liferay.portal.kernel.portlet.BasePortletLayoutFinder; import com.liferay.portal.kernel.portlet.PortletLayoutFinder; import com.liferay.portal.kernel.portlet.PortletProvider; import com.liferay.portal.kernel.portlet.PortletProviderUtil; import com.liferay.portal.kernel.security.permission.PermissionChecker; import com.liferay.portal.kernel.security.permission.PermissionCheckerFactoryUtil; import com.liferay.portal.kernel.security.permission.PermissionThreadLocal; import com.liferay.portal.kernel.test.ReflectionTestUtil; import com.liferay.portal.kernel.test.rule.AggregateTestRule; import com.liferay.portal.kernel.test.rule.DeleteAfterTestRun; import com.liferay.portal.kernel.test.rule.Sync; import com.liferay.portal.kernel.test.rule.SynchronousDestinationTestRule; import com.liferay.portal.kernel.test.util.GroupTestUtil; import com.liferay.portal.kernel.test.util.TestPropsValues; import com.liferay.portal.kernel.theme.ThemeDisplay; import com.liferay.portal.kernel.util.WebKeys; import com.liferay.portal.struts.BaseFindActionHelper; import com.liferay.portal.test.rule.LiferayIntegrationTestRule; import com.liferay.portal.util.test.LayoutTestUtil; import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.ClassRule; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.mock.web.MockHttpServletRequest; /** * @author Julio Camarero * @author Laszlo Csontos * @author Eduardo Garcia */ @RunWith(Arquillian.class) @Sync public class PortletLayoutFinderTest { @ClassRule @Rule public static final AggregateTestRule aggregateTestRule = new AggregateTestRule( new LiferayIntegrationTestRule(), SynchronousDestinationTestRule.INSTANCE); @Before public void setUp() throws Exception { _portletIds = new String[] { PortletProviderUtil.getPortletId( BlogsEntry.class.getName(), PortletProvider.Action.MANAGE), PortletProviderUtil.getPortletId( BlogsEntry.class.getName(), PortletProvider.Action.VIEW) }; _portletLayoutFinder = new BasePortletLayoutFinder() { @Override protected String[] getPortletIds() { return _portletIds; } }; User user = TestPropsValues.getUser(); PermissionChecker permissionChecker = PermissionCheckerFactoryUtil.create(user); _originalPermissionChecker = PermissionThreadLocal.getPermissionChecker(); PermissionThreadLocal.setPermissionChecker(permissionChecker); } @After public void tearDown() { PermissionThreadLocal.setPermissionChecker(_originalPermissionChecker); } @Test public void testGetPlidAndPortletIdViewInContext() throws Exception { addLayouts(true, false); PortletLayoutFinder.Result result = _portletLayoutFinder.find( getThemeDisplay(), _blogsEntryGroupId); Assert.assertEquals(_blogLayout.getPlid(), result.getPlid()); String portletId = PortletProviderUtil.getPortletId( BlogsEntry.class.getName(), PortletProvider.Action.VIEW); Assert.assertEquals(portletId, result.getPortletId()); } @Test public void testGetPlidAndPortletIdWhenPortletDoesNotExist() throws Exception { addLayouts(false, false); try { _portletLayoutFinder.find(getThemeDisplay(), _blogsEntryGroupId); Assert.fail(); } catch (NoSuchLayoutException nsle) { } } @Test public void testSetTargetGroupWithDifferentGroup() throws Exception { addLayouts(true, true); HttpServletRequest request = getHttpServletRequest(); ReflectionTestUtil.invoke( BaseFindActionHelper.class, "setTargetLayout", new Class<?>[] {HttpServletRequest.class, long.class, long.class}, request, _blogsEntryGroupId, _blogLayout.getPlid()); Layout layout = (Layout)request.getAttribute(WebKeys.LAYOUT); Assert.assertTrue(layout instanceof VirtualLayout); Assert.assertNotEquals(_group.getGroupId(), layout.getGroupId()); } @Test public void testSetTargetGroupWithSameGroup() throws Exception { addLayouts(true, false); HttpServletRequest request = getHttpServletRequest(); ReflectionTestUtil.invoke( BaseFindActionHelper.class, "setTargetLayout", new Class<?>[] {HttpServletRequest.class, long.class, long.class}, request, _blogsEntryGroupId, _blogLayout.getPlid()); Layout layout = (Layout)request.getAttribute(WebKeys.LAYOUT); Assert.assertNull(layout); } protected void addLayouts( boolean portletExists, boolean blogEntryWithDifferentGroup) throws Exception { _group = GroupTestUtil.addGroup(); _blogLayout = LayoutTestUtil.addLayout(_group); _assetLayout = LayoutTestUtil.addLayout(_group); if (portletExists) { String portletId = PortletProviderUtil.getPortletId( BlogsEntry.class.getName(), PortletProvider.Action.VIEW); LayoutTestUtil.addPortletToLayout(_blogLayout, portletId); } Map<String, String[]> preferenceMap = new HashMap<>(); preferenceMap.put("assetLinkBehavior", new String[] {"viewInPortlet"}); PortletInstance portletInstance = new PortletInstance( "com_liferay_hello_world_web_portlet_HelloWorldPortlet"); _testPortletId = portletInstance.getPortletInstanceKey(); LayoutTestUtil.addPortletToLayout( TestPropsValues.getUserId(), _assetLayout, _testPortletId, "column-1", preferenceMap); Group group = _group; if (blogEntryWithDifferentGroup) { group = GroupTestUtil.addGroup(); } _blogsEntryGroupId = group.getGroupId(); } protected HttpServletRequest getHttpServletRequest() throws Exception { HttpServletRequest request = new MockHttpServletRequest(); ThemeDisplay themeDisplay = getThemeDisplay(); request.setAttribute(WebKeys.THEME_DISPLAY, themeDisplay); return request; } protected ThemeDisplay getThemeDisplay() throws Exception { ThemeDisplay themeDisplay = new ThemeDisplay(); themeDisplay.setScopeGroupId(_group.getGroupId()); PermissionChecker permissionChecker = PermissionCheckerFactoryUtil.create(TestPropsValues.getUser()); themeDisplay.setPermissionChecker(permissionChecker); themeDisplay.setPlid(_assetLayout.getPlid()); return themeDisplay; } private static String[] _portletIds; private Layout _assetLayout; private Layout _blogLayout; private long _blogsEntryGroupId; @DeleteAfterTestRun private Group _group; private PermissionChecker _originalPermissionChecker; private PortletLayoutFinder _portletLayoutFinder; private String _testPortletId; }