/** * 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.friendly.url.servlet.test; import com.liferay.arquillian.extension.junit.bridge.junit.Arquillian; import com.liferay.friendly.url.servlet.FriendlyURLServlet; import com.liferay.portal.kernel.exception.NoSuchGroupException; import com.liferay.portal.kernel.language.LanguageUtil; import com.liferay.portal.kernel.model.Group; import com.liferay.portal.kernel.model.Layout; import com.liferay.portal.kernel.service.ServiceContext; import com.liferay.portal.kernel.service.ServiceContextThreadLocal; import com.liferay.portal.kernel.test.rule.AggregateTestRule; import com.liferay.portal.kernel.test.rule.DeleteAfterTestRun; import com.liferay.portal.kernel.test.util.GroupTestUtil; import com.liferay.portal.kernel.test.util.ServiceContextTestUtil; import com.liferay.portal.kernel.util.CharPool; import com.liferay.portal.kernel.util.GetterUtil; import com.liferay.portal.kernel.util.LocaleUtil; import com.liferay.portal.kernel.util.Portal; import com.liferay.portal.kernel.util.PropsKeys; import com.liferay.portal.kernel.util.PropsUtil; import com.liferay.portal.kernel.util.StringPool; import com.liferay.portal.kernel.util.Validator; import com.liferay.portal.kernel.util.WebKeys; import com.liferay.portal.servlet.I18nServlet; import com.liferay.portal.test.rule.LiferayIntegrationTestRule; import com.liferay.portal.util.PropsValues; import com.liferay.portal.util.test.LayoutTestUtil; import com.liferay.registry.Filter; import com.liferay.registry.Registry; import com.liferay.registry.RegistryUtil; import com.liferay.registry.ServiceTracker; import java.util.Arrays; import java.util.List; import java.util.Locale; import java.util.Objects; import javax.servlet.Servlet; 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 László Csontos */ @RunWith(Arquillian.class) public class FriendlyURLServletTest { @ClassRule @Rule public static final AggregateTestRule aggregateTestRule = new LiferayIntegrationTestRule(); @Before public void setUp() throws Exception { PropsValues.LOCALES_ENABLED = new String[] {"en_US", "hu_HU", "de_DE"}; PropsValues.LOCALE_USE_DEFAULT_IF_NOT_AVAILABLE = true; LanguageUtil.init(); ServiceContext serviceContext = ServiceContextTestUtil.getServiceContext(); ServiceContextThreadLocal.pushServiceContext(serviceContext); _group = GroupTestUtil.addGroup(); _layout = LayoutTestUtil.addLayout(_group); List<Locale> availableLocales = Arrays.asList( LocaleUtil.US, LocaleUtil.GERMANY, LocaleUtil.HUNGARY); GroupTestUtil.updateDisplaySettings( _group.getGroupId(), availableLocales, LocaleUtil.US); Registry registry = RegistryUtil.getRegistry(); Filter filter = registry.getFilter( "(&(servlet.type=friendly-url)(servlet.init.private=false)" + "(objectClass=" + Servlet.class.getName() + "))"); _serviceTracker = registry.trackServices(filter); _serviceTracker.open(); _friendlyURLServlet = (FriendlyURLServlet)_serviceTracker.getService(); } @After public void tearDown() throws Exception { ServiceContextThreadLocal.popServiceContext(); PropsValues.LOCALES_ENABLED = PropsUtil.getArray( PropsKeys.LOCALES_ENABLED); PropsValues.LOCALE_USE_DEFAULT_IF_NOT_AVAILABLE = GetterUtil.getBoolean( PropsUtil.get(PropsKeys.LOCALE_USE_DEFAULT_IF_NOT_AVAILABLE)); LanguageUtil.init(); _serviceTracker.close(); } @Test public void testGetRedirectWithExistentSite() throws Exception { MockHttpServletRequest mockHttpServletRequest = new MockHttpServletRequest(); mockHttpServletRequest.setPathInfo(StringPool.SLASH); testGetRedirect( mockHttpServletRequest, getPath(_group, _layout), Portal.PATH_MAIN, new FriendlyURLServlet.Redirect(getURL(_layout))); } @Test public void testGetRedirectWithI18nPath() throws Exception { testGetI18nRedirect("/fr", "/en"); testGetI18nRedirect("/hu", "/hu"); testGetI18nRedirect("/en", "/en"); testGetI18nRedirect("/de_DE", "/de_DE"); testGetI18nRedirect("/en_US", "/en_US"); } @Test(expected = NoSuchGroupException.class) public void testGetRedirectWithNonexistentSite() throws Exception { MockHttpServletRequest mockHttpServletRequest = new MockHttpServletRequest(); mockHttpServletRequest.setPathInfo(StringPool.SLASH); testGetRedirect( mockHttpServletRequest, "/nonexistent-site/home", Portal.PATH_MAIN, null); } protected String getI18nLanguageId(HttpServletRequest request) { String path = GetterUtil.getString(request.getPathInfo()); if (Validator.isNull(path)) { return null; } String i18nLanguageId = request.getServletPath(); int pos = i18nLanguageId.lastIndexOf(CharPool.SLASH); i18nLanguageId = i18nLanguageId.substring(pos + 1); if (Validator.isNull(i18nLanguageId)) { return null; } Locale locale = LocaleUtil.fromLanguageId(i18nLanguageId, true, false); String i18nLanguageCode = i18nLanguageId; if ((locale == null) || Validator.isNull(locale.getCountry())) { locale = LanguageUtil.getLocale(i18nLanguageCode); } if (locale != null) { i18nLanguageId = LocaleUtil.toLanguageId(locale); } if (!PropsValues.LOCALE_USE_DEFAULT_IF_NOT_AVAILABLE && !LanguageUtil.isAvailableLocale(i18nLanguageId)) { return null; } return i18nLanguageId; } protected String getPath(Group group, Layout layout) { return group.getFriendlyURL() + layout.getFriendlyURL(); } protected String getURL(Layout layout) { return "/c/portal/layout?p_l_id=" + layout.getPlid() + "&p_v_l_s_g_id=0"; } protected void testGetI18nRedirect(String i18nPath, String expectedI18nPath) throws Exception { MockHttpServletRequest mockHttpServletRequest = new MockHttpServletRequest(); mockHttpServletRequest.setPathInfo(StringPool.SLASH); mockHttpServletRequest.setServletPath(i18nPath); String i18nLanguageId = getI18nLanguageId(mockHttpServletRequest); mockHttpServletRequest.setAttribute( WebKeys.I18N_LANGUAGE_ID, i18nLanguageId); String requestURI = PropsValues.LAYOUT_FRIENDLY_URL_PUBLIC_SERVLET_MAPPING + getPath(_group, _layout); mockHttpServletRequest.setRequestURI(requestURI); FriendlyURLServlet.Redirect expectedRedirect = null; if (!Objects.equals(i18nPath, expectedI18nPath)) { expectedRedirect = new FriendlyURLServlet.Redirect( expectedI18nPath + requestURI, true, true); } else { expectedRedirect = new FriendlyURLServlet.Redirect(getURL(_layout)); } testGetRedirect( mockHttpServletRequest, _group.getFriendlyURL(), Portal.PATH_MAIN, expectedRedirect); testGetRedirect( mockHttpServletRequest, getPath(_group, _layout), Portal.PATH_MAIN, expectedRedirect); } protected void testGetRedirect( HttpServletRequest request, String path, String mainPath, FriendlyURLServlet.Redirect expectedRedirect) throws Exception { FriendlyURLServlet.Redirect actualRedirect = _friendlyURLServlet.getRedirect(request, path); Assert.assertEquals(expectedRedirect, actualRedirect); } private FriendlyURLServlet _friendlyURLServlet; @DeleteAfterTestRun private Group _group; private final I18nServlet _i18nServlet = new I18nServlet(); private Layout _layout; private ServiceTracker<Servlet, Servlet> _serviceTracker; }