View Javadoc
1   /*
2    * Copyright (c) 2002-2025, City of Paris
3    * All rights reserved.
4    *
5    * Redistribution and use in source and binary forms, with or without
6    * modification, are permitted provided that the following conditions
7    * are met:
8    *
9    *  1. Redistributions of source code must retain the above copyright notice
10   *     and the following disclaimer.
11   *
12   *  2. Redistributions in binary form must reproduce the above copyright notice
13   *     and the following disclaimer in the documentation and/or other materials
14   *     provided with the distribution.
15   *
16   *  3. Neither the name of 'Mairie de Paris' nor 'Lutece' nor the names of its
17   *     contributors may be used to endorse or promote products derived from
18   *     this software without specific prior written permission.
19   *
20   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21   * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23   * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
24   * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25   * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26   * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27   * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28   * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30   * POSSIBILITY OF SUCH DAMAGE.
31   *
32   * License 1.0
33   */
34  package fr.paris.lutece.portal.web.style;
35  
36  import java.io.IOException;
37  import java.math.BigInteger;
38  import java.security.SecureRandom;
39  import java.util.ArrayList;
40  import java.util.Collections;
41  import java.util.HashMap;
42  import java.util.List;
43  import java.util.Map;
44  import java.util.Random;
45  
46  import org.apache.commons.fileupload.FileItem;
47  import org.apache.commons.fileupload.disk.DiskFileItemFactory;
48  import org.apache.commons.lang3.StringUtils;
49  import org.springframework.mock.web.MockHttpServletRequest;
50  
51  import fr.paris.lutece.portal.business.style.PageTemplate;
52  import fr.paris.lutece.portal.business.style.PageTemplateHome;
53  import fr.paris.lutece.portal.business.user.AdminUser;
54  import fr.paris.lutece.portal.service.admin.AccessDeniedException;
55  import fr.paris.lutece.portal.service.message.AdminMessage;
56  import fr.paris.lutece.portal.service.message.AdminMessageService;
57  import fr.paris.lutece.portal.service.security.SecurityTokenService;
58  import fr.paris.lutece.portal.web.constants.Parameters;
59  import fr.paris.lutece.portal.web.upload.MultipartHttpServletRequest;
60  import fr.paris.lutece.test.LuteceTestCase;
61  import fr.paris.lutece.test.Utils;
62  
63  /**
64   * PageTemplatesJspBeanTest Test Class
65   *
66   */
67  public class PageTemplatesJspBeanTest extends LuteceTestCase
68  {
69      private static final String TEST_PAGE_TEMPLATE_ID = "1"; // Page template one column
70      private MockHttpServletRequest request;
71      private PageTemplatesJspBean instance;
72  
73      @Override
74      protected void setUp( ) throws Exception
75      {
76          super.setUp( );
77          request = new MockHttpServletRequest( );
78          Utils.registerAdminUserWithRigth( request, new AdminUser( ), PageTemplatesJspBean.RIGHT_MANAGE_PAGE_TEMPLATES );
79          instance = new PageTemplatesJspBean( );
80          instance.init( request, PageTemplatesJspBean.RIGHT_MANAGE_PAGE_TEMPLATES );
81      }
82  
83      /**
84       * Test of getManagePageTemplate method, of class fr.paris.lutece.portal.web.style.PageTemplatesJspBean.
85       */
86      public void testGetManagePageTemplate( ) throws AccessDeniedException
87      {
88          assertTrue( StringUtils.isNotEmpty( instance.getManagePageTemplate( request ) ) );
89      }
90  
91      /**
92       * Test of getCreatePageTemplate method, of class fr.paris.lutece.portal.web.style.PageTemplatesJspBean.
93       */
94      public void testGetCreatePageTemplate( ) throws AccessDeniedException
95      {
96          assertTrue( StringUtils.isNotEmpty( instance.getCreatePageTemplate( request ) ) );
97      }
98  
99      /**
100      * Test of doCreatePageTemplate method, of fr.paris.lutece.portal.web.style.PageTemplatesJspBean.
101      * 
102      * @throws AccessDeniedException
103      * @throws IOException
104      */
105     public void testDoCreatePageTemplate( ) throws AccessDeniedException, IOException
106     {
107         final String desc = getRandomName( );
108         Map<String, String [ ]> parameters = new HashMap<>( );
109         parameters.put( Parameters.PAGE_TEMPLATE_DESCRIPTION, new String [ ] {
110                 desc
111         } );
112         parameters.put( SecurityTokenService.PARAMETER_TOKEN, new String [ ] {
113                 SecurityTokenService.getInstance( ).getToken( request, "admin/style/create_page_template.html" )
114         } );
115         DiskFileItemFactory fileItemFactory = new DiskFileItemFactory( );
116         Map<String, List<FileItem>> files = new HashMap<>( );
117         List<FileItem> pageTemplateFiles = new ArrayList<>( );
118         FileItem pageTemplateFile = fileItemFactory.createItem( "page_template_file", "text/html", false, "junit.html" );
119         pageTemplateFile.getOutputStream( ).write( new byte [ 1] );
120         pageTemplateFiles.add( pageTemplateFile );
121         files.put( "page_template_file", pageTemplateFiles );
122         List<FileItem> pageTemplatePictures = new ArrayList<>( );
123         FileItem pageTemplatePicture = fileItemFactory.createItem( "page_template_picture", "image/jpg", false, "junit.jpg" );
124         pageTemplatePicture.getOutputStream( ).write( new byte [ 1] );
125         pageTemplatePictures.add( pageTemplatePicture );
126         files.put( "page_template_picture", pageTemplatePictures );
127         MultipartHttpServletRequest multipartRequest = new MultipartHttpServletRequest( request, files, parameters );
128         try
129         {
130             instance.doCreatePageTemplate( multipartRequest );
131             assertTrue( PageTemplateHome.getPageTemplatesList( ).stream( ).anyMatch( t -> t.getDescription( ).equals( desc ) ) );
132         }
133         finally
134         {
135             PageTemplateHome.getPageTemplatesList( ).stream( ).filter( t -> t.getDescription( ).equals( desc ) )
136                     .forEach( t -> PageTemplateHome.remove( t.getId( ) ) );
137         }
138     }
139 
140     public void testDoCreatePageTemplateInvalidToken( ) throws AccessDeniedException, IOException
141     {
142         final String desc = getRandomName( );
143         Map<String, String [ ]> parameters = new HashMap<>( );
144         parameters.put( Parameters.PAGE_TEMPLATE_DESCRIPTION, new String [ ] {
145                 desc
146         } );
147         parameters.put( SecurityTokenService.PARAMETER_TOKEN, new String [ ] {
148                 SecurityTokenService.getInstance( ).getToken( request, "admin/style/create_page_template.html" ) + "b"
149         } );
150         DiskFileItemFactory fileItemFactory = new DiskFileItemFactory( );
151         Map<String, List<FileItem>> files = new HashMap<>( );
152         List<FileItem> pageTemplateFiles = new ArrayList<>( );
153         FileItem pageTemplateFile = fileItemFactory.createItem( "page_template_file", "text/html", false, "junit.html" );
154         pageTemplateFile.getOutputStream( ).write( new byte [ 1] );
155         pageTemplateFiles.add( pageTemplateFile );
156         files.put( "page_template_file", pageTemplateFiles );
157         List<FileItem> pageTemplatePictures = new ArrayList<>( );
158         FileItem pageTemplatePicture = fileItemFactory.createItem( "page_template_picture", "image/jpg", false, "junit.jpg" );
159         pageTemplatePicture.getOutputStream( ).write( new byte [ 1] );
160         pageTemplatePictures.add( pageTemplatePicture );
161         files.put( "page_template_picture", pageTemplatePictures );
162         MultipartHttpServletRequest multipartRequest = new MultipartHttpServletRequest( request, files, parameters );
163         try
164         {
165             instance.doCreatePageTemplate( multipartRequest );
166             fail( "Should have thrown" );
167         }
168         catch( AccessDeniedException e )
169         {
170             assertFalse( PageTemplateHome.getPageTemplatesList( ).stream( ).anyMatch( t -> t.getDescription( ).equals( desc ) ) );
171         }
172         finally
173         {
174             PageTemplateHome.getPageTemplatesList( ).stream( ).filter( t -> t.getDescription( ).equals( desc ) )
175                     .forEach( t -> PageTemplateHome.remove( t.getId( ) ) );
176         }
177     }
178 
179     public void testDoCreatePageTemplateNoToken( ) throws AccessDeniedException, IOException
180     {
181         final String desc = getRandomName( );
182         Map<String, String [ ]> parameters = new HashMap<>( );
183         parameters.put( Parameters.PAGE_TEMPLATE_DESCRIPTION, new String [ ] {
184                 desc
185         } );
186         DiskFileItemFactory fileItemFactory = new DiskFileItemFactory( );
187         Map<String, List<FileItem>> files = new HashMap<>( );
188         List<FileItem> pageTemplateFiles = new ArrayList<>( );
189         FileItem pageTemplateFile = fileItemFactory.createItem( "page_template_file", "text/html", false, "junit.html" );
190         pageTemplateFile.getOutputStream( ).write( new byte [ 1] );
191         pageTemplateFiles.add( pageTemplateFile );
192         files.put( "page_template_file", pageTemplateFiles );
193         List<FileItem> pageTemplatePictures = new ArrayList<>( );
194         FileItem pageTemplatePicture = fileItemFactory.createItem( "page_template_picture", "image/jpg", false, "junit.jpg" );
195         pageTemplatePicture.getOutputStream( ).write( new byte [ 1] );
196         pageTemplatePictures.add( pageTemplatePicture );
197         files.put( "page_template_picture", pageTemplatePictures );
198         MultipartHttpServletRequest multipartRequest = new MultipartHttpServletRequest( request, files, parameters );
199         try
200         {
201             instance.doCreatePageTemplate( multipartRequest );
202             fail( "Should have thrown" );
203         }
204         catch( AccessDeniedException e )
205         {
206             assertFalse( PageTemplateHome.getPageTemplatesList( ).stream( ).anyMatch( t -> t.getDescription( ).equals( desc ) ) );
207         }
208         finally
209         {
210             PageTemplateHome.getPageTemplatesList( ).stream( ).filter( t -> t.getDescription( ).equals( desc ) )
211                     .forEach( t -> PageTemplateHome.remove( t.getId( ) ) );
212         }
213     }
214 
215     /**
216      * Test of getModifyPageTemplate method, of class fr.paris.lutece.portal.web.style.PageTemplatesJspBean.
217      */
218     public void testGetModifyPageTemplate( ) throws AccessDeniedException
219     {
220         request.addParameter( Parameters.PAGE_TEMPLATE_ID, TEST_PAGE_TEMPLATE_ID );
221         assertTrue( StringUtils.isNotEmpty( instance.getModifyPageTemplate( request ) ) );
222     }
223 
224     /**
225      * Test of doModifyPageTemplate method, of fr.paris.lutece.portal.web.style.PageTemplatesJspBean.
226      * 
227      * @throws AccessDeniedException
228      */
229     public void testDoModifyPageTemplate( ) throws AccessDeniedException
230     {
231         final String desc = getRandomName( );
232         PageTemplate pageTemplate = new PageTemplate( );
233         pageTemplate.setDescription( desc );
234         PageTemplateHome.create( pageTemplate );
235 
236         Map<String, String [ ]> parameters = new HashMap<>( );
237         parameters.put( Parameters.PAGE_TEMPLATE_ID, new String [ ] {
238                 Integer.toString( pageTemplate.getId( ) )
239         } );
240         parameters.put( Parameters.PAGE_TEMPLATE_DESCRIPTION, new String [ ] {
241                 desc + "mod"
242         } );
243         parameters.put( SecurityTokenService.PARAMETER_TOKEN, new String [ ] {
244                 SecurityTokenService.getInstance( ).getToken( request, "admin/style/modify_page_template.html" )
245         } );
246         MultipartHttpServletRequest multipartRequest = new MultipartHttpServletRequest( request, Collections.emptyMap( ), parameters );
247         try
248         {
249             assertEquals( desc, PageTemplateHome.findByPrimaryKey( pageTemplate.getId( ) ).getDescription( ) );
250             instance.doModifyPageTemplate( multipartRequest );
251             assertEquals( desc + "mod", PageTemplateHome.findByPrimaryKey( pageTemplate.getId( ) ).getDescription( ) );
252         }
253         finally
254         {
255             PageTemplateHome.remove( pageTemplate.getId( ) );
256         }
257     }
258 
259     public void testDoModifyPageTemplateInvalidToken( ) throws AccessDeniedException
260     {
261         final String desc = getRandomName( );
262         PageTemplate pageTemplate = new PageTemplate( );
263         pageTemplate.setDescription( desc );
264         PageTemplateHome.create( pageTemplate );
265 
266         Map<String, String [ ]> parameters = new HashMap<>( );
267         parameters.put( Parameters.PAGE_TEMPLATE_ID, new String [ ] {
268                 Integer.toString( pageTemplate.getId( ) )
269         } );
270         parameters.put( Parameters.PAGE_TEMPLATE_DESCRIPTION, new String [ ] {
271                 desc + "mod"
272         } );
273         parameters.put( SecurityTokenService.PARAMETER_TOKEN, new String [ ] {
274                 SecurityTokenService.getInstance( ).getToken( request, "admin/style/modify_page_template.html" ) + "b"
275         } );
276         MultipartHttpServletRequest multipartRequest = new MultipartHttpServletRequest( request, Collections.emptyMap( ), parameters );
277         try
278         {
279             assertEquals( desc, PageTemplateHome.findByPrimaryKey( pageTemplate.getId( ) ).getDescription( ) );
280             instance.doModifyPageTemplate( multipartRequest );
281             fail( "Should have thrown" );
282         }
283         catch( AccessDeniedException e )
284         {
285             assertEquals( desc, PageTemplateHome.findByPrimaryKey( pageTemplate.getId( ) ).getDescription( ) );
286         }
287         finally
288         {
289             PageTemplateHome.remove( pageTemplate.getId( ) );
290         }
291     }
292 
293     public void testDoModifyPageTemplateNoToken( ) throws AccessDeniedException
294     {
295         final String desc = getRandomName( );
296         PageTemplate pageTemplate = new PageTemplate( );
297         pageTemplate.setDescription( desc );
298         PageTemplateHome.create( pageTemplate );
299 
300         Map<String, String [ ]> parameters = new HashMap<>( );
301         parameters.put( Parameters.PAGE_TEMPLATE_ID, new String [ ] {
302                 Integer.toString( pageTemplate.getId( ) )
303         } );
304         parameters.put( Parameters.PAGE_TEMPLATE_DESCRIPTION, new String [ ] {
305                 desc + "mod"
306         } );
307         MultipartHttpServletRequest multipartRequest = new MultipartHttpServletRequest( request, Collections.emptyMap( ), parameters );
308         try
309         {
310             assertEquals( desc, PageTemplateHome.findByPrimaryKey( pageTemplate.getId( ) ).getDescription( ) );
311             instance.doModifyPageTemplate( multipartRequest );
312             fail( "Should have thrown" );
313         }
314         catch( AccessDeniedException e )
315         {
316             assertEquals( desc, PageTemplateHome.findByPrimaryKey( pageTemplate.getId( ) ).getDescription( ) );
317         }
318         finally
319         {
320             PageTemplateHome.remove( pageTemplate.getId( ) );
321         }
322     }
323 
324     public void testGetConfirmRemovePageTemplate( )
325     {
326         request.addParameter( Parameters.PAGE_TEMPLATE_ID, TEST_PAGE_TEMPLATE_ID );
327         instance.getConfirmRemovePageTemplate( request );
328         AdminMessage message = AdminMessageService.getMessage( request );
329         assertNotNull( message );
330         if ( message.getRequestParameters( ) != null )
331         {
332             assertNotNull( message.getRequestParameters( ).get( SecurityTokenService.PARAMETER_TOKEN ) );
333             assertEquals( TEST_PAGE_TEMPLATE_ID, message.getRequestParameters( ).get( Parameters.PAGE_TEMPLATE_ID ) );
334         }
335     }
336 
337     public void testDoRemovePageTemplate( ) throws AccessDeniedException
338     {
339         final String desc = getRandomName( );
340         PageTemplate pageTemplate = new PageTemplate( );
341         pageTemplate.setDescription( desc );
342         pageTemplate.setFile( "junit" );
343         pageTemplate.setPicture( "junit" );
344         PageTemplateHome.create( pageTemplate );
345 
346         request.addParameter( Parameters.PAGE_TEMPLATE_ID, Integer.toString( pageTemplate.getId( ) ) );
347         request.addParameter( SecurityTokenService.PARAMETER_TOKEN,
348                 SecurityTokenService.getInstance( ).getToken( request, "jsp/admin/style/DoRemovePageTemplate.jsp" ) );
349         try
350         {
351             instance.doRemovePageTemplate( request );
352             assertNull( PageTemplateHome.findByPrimaryKey( pageTemplate.getId( ) ) );
353         }
354         finally
355         {
356             PageTemplateHome.remove( pageTemplate.getId( ) );
357         }
358     }
359 
360     public void testDoRemovePageTemplateInvalidToken( ) throws AccessDeniedException
361     {
362         final String desc = getRandomName( );
363         PageTemplate pageTemplate = new PageTemplate( );
364         pageTemplate.setDescription( desc );
365         pageTemplate.setFile( "junit" );
366         pageTemplate.setPicture( "junit" );
367         PageTemplateHome.create( pageTemplate );
368 
369         request.addParameter( Parameters.PAGE_TEMPLATE_ID, Integer.toString( pageTemplate.getId( ) ) );
370         request.addParameter( SecurityTokenService.PARAMETER_TOKEN,
371                 SecurityTokenService.getInstance( ).getToken( request, "jsp/admin/style/DoRemovePageTemplate.jsp" ) + "b" );
372         try
373         {
374             instance.doRemovePageTemplate( request );
375             fail( "Should have thrown" );
376         }
377         catch( AccessDeniedException e )
378         {
379             assertNotNull( PageTemplateHome.findByPrimaryKey( pageTemplate.getId( ) ) );
380         }
381         finally
382         {
383             PageTemplateHome.remove( pageTemplate.getId( ) );
384         }
385     }
386 
387     public void testDoRemovePageTemplateNoToken( ) throws AccessDeniedException
388     {
389         final String desc = getRandomName( );
390         PageTemplate pageTemplate = new PageTemplate( );
391         pageTemplate.setDescription( desc );
392         pageTemplate.setFile( "junit" );
393         pageTemplate.setPicture( "junit" );
394         PageTemplateHome.create( pageTemplate );
395 
396         request.addParameter( Parameters.PAGE_TEMPLATE_ID, Integer.toString( pageTemplate.getId( ) ) );
397         try
398         {
399             instance.doRemovePageTemplate( request );
400             fail( "Should have thrown" );
401         }
402         catch( AccessDeniedException e )
403         {
404             assertNotNull( PageTemplateHome.findByPrimaryKey( pageTemplate.getId( ) ) );
405         }
406         finally
407         {
408             PageTemplateHome.remove( pageTemplate.getId( ) );
409         }
410     }
411 
412     private String getRandomName( )
413     {
414         Random rand = new SecureRandom( );
415         BigInteger bigInt = new BigInteger( 128, rand );
416         return "junit" + bigInt.toString( 36 );
417     }
418 }