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}