001package org.apache.turbine.services.urlmapper; 002 003/* 004 * Licensed to the Apache Software Foundation (ASF) under one 005 * or more contributor license agreements. See the NOTICE file 006 * distributed with this work for additional information 007 * regarding copyright ownership. The ASF licenses this file 008 * to you under the Apache License, Version 2.0 (the 009 * "License"); you may not use this file except in compliance 010 * with the License. You may obtain a copy of the License at 011 * 012 * http://www.apache.org/licenses/LICENSE-2.0 013 * 014 * Unless required by applicable law or agreed to in writing, 015 * software distributed under the License is distributed on an 016 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 017 * KIND, either express or implied. See the License for the 018 * specific language governing permissions and limitations 019 * under the License. 020 */ 021import static org.junit.jupiter.api.Assertions.assertEquals; 022import static org.junit.jupiter.api.Assertions.assertNotNull; 023import static org.junit.jupiter.api.Assertions.assertTrue; 024import static org.mockito.Mockito.mock; 025 026import javax.servlet.ServletConfig; 027import javax.servlet.http.HttpServletRequest; 028import javax.servlet.http.HttpServletResponse; 029 030import org.apache.fulcrum.parser.ParameterParser; 031import org.apache.logging.log4j.LogManager; 032import org.apache.logging.log4j.Logger; 033import org.apache.turbine.Turbine; 034import org.apache.turbine.pipeline.PipelineData; 035import org.apache.turbine.services.TurbineServices; 036import org.apache.turbine.test.BaseTestCase; 037import org.apache.turbine.util.RunData; 038import org.apache.turbine.util.TurbineConfig; 039import org.apache.turbine.util.uri.TemplateURI; 040import org.junit.jupiter.api.AfterAll; 041import org.junit.jupiter.api.BeforeAll; 042import org.junit.jupiter.api.BeforeEach; 043import org.junit.jupiter.api.Test; 044import org.mockito.Mockito; 045 046public class TurbineURLMapperJSONServiceTest extends BaseTestCase 047{ 048 049 private static TurbineConfig tc = null; 050 051 private static URLMapperService urlMapper = null; 052 053 private RunData data; 054 055 Logger log = LogManager.getLogger(); 056 057 @BeforeAll 058 public static void setUp() throws Exception 059 { 060 tc = new TurbineConfig( ".", "/conf/test/TurbineURLMapperJSONServiceTest.properties" ); 061 tc.initialize(); 062 063 urlMapper = (URLMapperService) TurbineServices.getInstance().getService( URLMapperService.SERVICE_NAME ); 064 } 065 066 @AfterAll 067 public static void tearDown() throws Exception 068 { 069 if (tc != null) 070 { 071 tc.dispose(); 072 } 073 } 074 075 @BeforeEach 076 public void init() throws Exception 077 { 078 079 ServletConfig config = tc.getTurbine().getServletConfig(); 080 // mock(ServletConfig.class); 081 HttpServletRequest request = getMockRequest(); 082 HttpServletResponse response = mock( HttpServletResponse.class ); 083 084 data = getRunData( request, response, config ); 085 086 Mockito.when( response.encodeURL( Mockito.anyString() ) ) 087 .thenAnswer( invocation -> invocation.getArgument( 0 ) ); 088 } 089 090 @Test 091 public void testDetailParameterForShortURL() throws Exception 092 { 093 094 PipelineData pipelineData = data; 095 096 assertNotNull( urlMapper ); 097 098 ParameterParser pp = pipelineData.get( Turbine.class, ParameterParser.class ); 099 assertNotNull( pp ); 100 assertTrue( pp.keySet().isEmpty() ); 101 pp.clear(); 102 103 urlMapper.mapFromURL( "/app/context/contact", pp ); 104 105 log.info( "parameters: {}", pp ); 106 assertEquals( 2, pp.keySet().size() ); 107 assertEquals( "anon", pp.getString( "role" ) ); 108 assertEquals( "Contact", pp.getString( "page" ) ); 109 110 TemplateURI uri2 = new TemplateURI( pipelineData.getRunData() ); 111 uri2.clearResponse(); 112 uri2.addPathInfo( pp ); 113 114 // this is an artifical url 115 assertEquals( "scheme://bob/wow/damn2/page/Contact/role/anon", uri2.getAbsoluteLink() ); 116 117 uri2.addPathInfo( "language", "en" ); 118 uri2.addQueryData( "kind", "4" ); 119 assertEquals( "scheme://bob/wow/damn2/page/Contact/role/anon/language/en?kind=4", uri2.getAbsoluteLink() ); 120 121 urlMapper.mapToURL( uri2 ); 122// String expectedMappedURL = "/wow/damn2/contact/4"; 123 // not ignored 124 String expectedMappedURL = "/wow/damn2/contact/4/en"; 125 126 assertEquals( expectedMappedURL, uri2.getRelativeLink() ); 127 128 pp.clear(); 129 130// 131 // scheme://bob/wow/damn2/contact/4/de 132 log.info( "relative uri is now {}", uri2.getRelativeLink() ); 133 urlMapper.mapFromURL( uri2.getRelativeLink(), pp ); 134 135 log.info( "parameters: {}", pp ); 136 assertEquals( 4, pp.keySet().size() ); 137 assertEquals( "anon", pp.getString( "role" ) ); 138 assertEquals( "Contact", pp.getString( "page" ) ); 139 assertEquals( "4", pp.getString( "kind" ) ); 140 // not ignored 141 assertEquals( "en", pp.getString( "language" ) ); 142 143 uri2 = new TemplateURI( pipelineData.getRunData() ); 144 uri2.clearResponse(); 145 uri2.addPathInfo( pp ); 146 147 urlMapper.mapToURL( uri2 ); 148 assertEquals( expectedMappedURL, uri2.getRelativeLink() ); 149 150 } 151 152 @Test 153 public void testIgnoreParameterForShortURL() throws Exception 154 { 155 156 PipelineData pipelineData = data; 157 158 assertNotNull( urlMapper ); 159 160 ParameterParser pp = pipelineData.get( Turbine.class, ParameterParser.class ); 161 assertNotNull( pp ); 162 assertTrue( pp.keySet().isEmpty() ); 163 pp.clear(); 164 165 urlMapper.mapFromURL( "/app/context/info", pp ); 166 167 log.info( "parameters: {}", pp ); 168 assertEquals( 2, pp.keySet().size() ); 169 assertEquals( "anon", pp.getString( "role" ) ); 170 assertEquals( "Info", pp.getString( "page" ) ); 171 172 TemplateURI uri2 = new TemplateURI( pipelineData.getRunData() ); 173 uri2.clearResponse(); 174 uri2.addPathInfo( pp ); 175 176 // this is an artifical url 177 assertEquals( "scheme://bob/wow/damn2/page/Info/role/anon", uri2.getAbsoluteLink() ); 178 179 uri2.addPathInfo( "language", "en" ); 180 uri2.addQueryData( "kind", "4" ); 181 assertEquals( "scheme://bob/wow/damn2/page/Info/role/anon/language/en?kind=4", uri2.getAbsoluteLink() ); 182 183 urlMapper.mapToURL( uri2 ); 184 185 // ignored 186 String expectedMappedURL = "/wow/damn2/info/4"; 187 188 assertEquals( expectedMappedURL, uri2.getRelativeLink() ); 189 190 pp.clear(); 191 192 uri2.addPathInfo( "de", "" ); 193 // scheme://bob/wow/damn2/info/4/de/ 194 log.info( "relative uri is now {}", uri2.getRelativeLink() ); 195 urlMapper.mapFromURL( uri2.getRelativeLink(), pp ); 196 197 log.info( "parameters: {}", pp ); 198 assertEquals( 3, pp.keySet().size() ); 199 assertEquals( "anon", pp.getString( "role" ) ); 200 assertEquals( "Info", pp.getString( "page" ) ); 201 assertEquals( "4", pp.getString( "kind" ) ); 202 // language ignored 203 204 uri2 = new TemplateURI( pipelineData.getRunData() ); 205 uri2.clearResponse(); 206 uri2.addPathInfo( pp ); 207 208 urlMapper.mapToURL( uri2 ); 209 assertEquals( expectedMappedURL, uri2.getRelativeLink() ); 210 211 } 212 213 214 @Test 215 public void testNonOptionalParameterForShortURL() throws Exception 216 { 217 218 PipelineData pipelineData = data; 219 220 assertNotNull( urlMapper ); 221 222 ParameterParser pp = pipelineData.get( Turbine.class, ParameterParser.class ); 223 assertNotNull( pp ); 224 assertTrue( pp.keySet().isEmpty() ); 225 pp.clear(); 226 227 urlMapper.mapFromURL( "/wow/damn2/register", pp ); 228 229 log.info( "parameters: {}", pp ); 230 assertEquals( 2, pp.keySet().size() ); 231 assertEquals( "anon", pp.getString( "role" ) ); 232 assertEquals( "Register", pp.getString( "page" ) ); 233 234 TemplateURI uri2 = new TemplateURI( pipelineData.getRunData() ); 235 uri2.clearResponse(); 236 uri2.addPathInfo( pp ); 237 238 // this is an artifical url 239 assertEquals( "scheme://bob/wow/damn2/page/Register/role/anon", uri2.getAbsoluteLink() ); 240 241 uri2.addPathInfo( "language", "en" ); 242 assertEquals( "scheme://bob/wow/damn2/page/Register/role/anon/language/en", uri2.getAbsoluteLink() ); 243 244 urlMapper.mapToURL( uri2 ); 245 String expectedMappedURL = "/wow/damn2/en/register"; 246 assertEquals( expectedMappedURL, uri2.getRelativeLink() ); 247 248 pp.clear(); 249 urlMapper.mapFromURL( uri2.getRelativeLink(), pp ); 250 251 log.info( "parameters: {}", pp ); 252 assertEquals( 3, pp.keySet().size() ); 253 assertEquals( "anon", pp.getString( "role" ) ); 254 assertEquals( "Register", pp.getString( "page" ) ); 255 assertEquals( "en", pp.getString( "language" ) ); 256 257 uri2 = new TemplateURI( pipelineData.getRunData() ); 258 uri2.clearResponse(); 259 uri2.addPathInfo( pp ); 260 261 urlMapper.mapToURL( uri2 ); 262 assertEquals( expectedMappedURL, uri2.getRelativeLink() ); 263 264 } 265 266}