View Javadoc
1   /*
2    * Copyright (c) 2002-2018, Mairie de 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.plugins.directory.modules.multiview.business.record.column.querypart;
35  
36  import static org.hamcrest.CoreMatchers.is;
37  import static org.hamcrest.CoreMatchers.not;
38  import static org.hamcrest.CoreMatchers.nullValue;
39  import static org.junit.Assert.assertThat;
40  
41  import java.util.ArrayList;
42  import java.util.Arrays;
43  import java.util.List;
44  import java.util.Map;
45  
46  import org.apache.commons.lang3.StringUtils;
47  
48  import fr.paris.lutece.plugins.directory.modules.multiview.business.record.column.IRecordColumn;
49  import fr.paris.lutece.plugins.directory.modules.multiview.business.record.column.RecordColumnCell;
50  import fr.paris.lutece.plugins.directory.modules.multiview.business.record.column.impl.RecordColumnEntry;
51  import fr.paris.lutece.plugins.directory.modules.multiview.business.record.column.querypart.impl.RecordColumnEntryQueryPart;
52  import fr.paris.lutece.plugins.directory.modules.multiview.business.record.column.querypart.mock.DAOUtilMock;
53  import fr.paris.lutece.portal.service.util.AppException;
54  import fr.paris.lutece.test.LuteceTestCase;
55  import fr.paris.lutece.util.sql.DAOUtil;
56  
57  /**
58   * Test of the implementation of the IRecordColumnQueryPart for the EntryRecordField column
59   */
60  public class RecordColumnEntryRecordFieldQueryPartTest extends LuteceTestCase
61  {
62      /**
63       * {@inheritDoc}
64       */
65      @Override
66      protected void setUp( ) throws Exception
67      {
68          super.setUp( );
69      }
70  
71      /**
72       * {@inheritDoc}
73       */
74      @Override
75      protected void tearDown( ) throws Exception
76      {
77          super.tearDown( );
78      }
79  
80      /**
81       * Test for the {@link IRecordColumnQueryPart#getRecordColumnCell(fr.paris.lutece.util.sql.DAOUtil)}
82       */
83      public void testGetRecordColumnCellEntryRecordField( )
84      {
85          String strRecordEntryRecordFieldValueToRetrieve = "entry record field value";
86          DAOUtil daoUtil = new DAOUtilMock( StringUtils.EMPTY, "column_1_value", strRecordEntryRecordFieldValueToRetrieve );
87  
88          IRecordColumn recordColumn = new RecordColumnEntry( 1, "Entry Record Field", new ArrayList<String>( ) );
89          RecordColumnEntryQueryPart recordColumnEntryRecordFieldQueryPart = new RecordColumnEntryQueryPart( );
90          recordColumnEntryRecordFieldQueryPart.setRecordColumn( recordColumn );
91  
92          RecordColumnCell recordColumnCell = recordColumnEntryRecordFieldQueryPart.getRecordColumnCell( daoUtil );
93          assertThat( recordColumnCell, is( not( nullValue( ) ) ) );
94  
95          Map<String, Object> mapRecordColumnCellValues = recordColumnCell.getRecordColumnCellValues( );
96          assertThat( mapRecordColumnCellValues, is( not( nullValue( ) ) ) );
97          assertThat( mapRecordColumnCellValues.size( ), is( 1 ) );
98  
99          Object objDirectoryResult = recordColumnCell.getRecordColumnCellValueByName( "column_1_value" );
100         assertThat( objDirectoryResult, is( not( nullValue( ) ) ) );
101         assertThat( String.valueOf( objDirectoryResult ), is( strRecordEntryRecordFieldValueToRetrieve ) );
102     }
103 
104     /**
105      * Test for the {@link IRecordColumnQueryPart#getRecordColumnCell(fr.paris.lutece.util.sql.DAOUtil)} using a column that doesn't exist
106      */
107     public void testGetRecordColumnCellEntryRecordFieldWithWrongColumnName( )
108     {
109         String strRecordEntryRecordFieldValueToRetrieve = "entry record field value";
110         DAOUtil daoUtil = new DAOUtilMock( StringUtils.EMPTY, "colonne", strRecordEntryRecordFieldValueToRetrieve );
111 
112         IRecordColumn recordColumn = new RecordColumnEntry( 1, "Entry Record Field", new ArrayList<String>( ) );
113         RecordColumnEntryQueryPart recordColumnEntryRecordFieldQueryPart = new RecordColumnEntryQueryPart( );
114         recordColumnEntryRecordFieldQueryPart.setRecordColumn( recordColumn );
115 
116         try
117         {
118             recordColumnEntryRecordFieldQueryPart.getRecordColumnCell( daoUtil );
119             fail( "Test fail : AppException hasn't been thrown !" );
120         }
121         catch( AppException exception )
122         {
123 
124         }
125     }
126 
127     /**
128      * Test for the {@link RecordColumnEntryQueryPart#getRecordColumnJoinQueries()} method with a column which have no Entry title
129      */
130     public void testGetRecordColumnJoinQueriesWithoutEntryTitle( )
131     {
132         String strJoinQueryExpected = "LEFT JOIN ( SELECT record_1.id_record AS id_record_1, record_field_1.record_field_value AS "
133                 + "column_1_value FROM directory_record_field AS record_field_1 INNER JOIN directory_record AS record_1 ON "
134                 + "record_field_1.id_record = record_1.id_record INNER JOIN directory_entry AS entry_1 ON entry_1.id_entry = "
135                 + "record_field_1.id_entry WHERE entry_1.title IN ( ) ) AS column_1 ON column_1.id_record_1 = record.id_record";
136 
137         IRecordColumn recordColumn = new RecordColumnEntry( 1, "Titre", new ArrayList<>( ) );
138         RecordColumnEntryQueryPart recordColumnEntryQueryPart = new RecordColumnEntryQueryPart( );
139         recordColumnEntryQueryPart.setRecordColumn( recordColumn );
140 
141         List<String> listRecordColumnJoinQueries = recordColumnEntryQueryPart.getRecordColumnJoinQueries( );
142         assertThat( listRecordColumnJoinQueries, is( not( nullValue( ) ) ) );
143         assertThat( listRecordColumnJoinQueries.size( ), is( 1 ) );
144 
145         String strRecordColumnJoinQuery = removeQuerySpaces( listRecordColumnJoinQueries.get( 0 ) );
146         assertThat( strRecordColumnJoinQuery, is( strJoinQueryExpected ) );
147     }
148 
149     /**
150      * Test for the {@link RecordColumnEntryQueryPart#getRecordColumnJoinQueries()} method with a column which have no Entry title and no position
151      */
152     public void testGetRecordColumnJoinQueriesWithoutEntryTitleAndColumnPosition( )
153     {
154         String strJoinQueryExpected = "LEFT JOIN ( SELECT record_-1.id_record AS id_record_-1, record_field_-1.record_field_value AS "
155                 + "column_-1_value FROM directory_record_field AS record_field_-1 INNER JOIN directory_record AS record_-1 ON "
156                 + "record_field_-1.id_record = record_-1.id_record INNER JOIN directory_entry AS entry_-1 ON entry_-1.id_entry = "
157                 + "record_field_-1.id_entry WHERE entry_-1.title IN ( ) ) AS column_-1 ON column_-1.id_record_-1 = record.id_record";
158 
159         RecordColumnEntryQueryPart recordColumnEntryQueryPart = new RecordColumnEntryQueryPart( );
160 
161         List<String> listRecordColumnJoinQueries = recordColumnEntryQueryPart.getRecordColumnJoinQueries( );
162         assertThat( listRecordColumnJoinQueries, is( not( nullValue( ) ) ) );
163         assertThat( listRecordColumnJoinQueries.size( ), is( 1 ) );
164 
165         String strRecordColumnJoinQuery = removeQuerySpaces( listRecordColumnJoinQueries.get( 0 ) );
166         assertThat( strRecordColumnJoinQuery, is( strJoinQueryExpected ) );
167     }
168 
169     /**
170      * Test for the {@link RecordColumnEntryQueryPart#getRecordColumnJoinQueries()} method
171      */
172     public void testGetRecordColumnJoinQueries( )
173     {
174         String strJoinQueryExpected = "LEFT JOIN ( SELECT record_5.id_record AS id_record_5, record_field_5.record_field_value AS "
175                 + "column_5_value FROM directory_record_field AS record_field_5 INNER JOIN directory_record AS record_5 ON "
176                 + "record_field_5.id_record = record_5.id_record INNER JOIN directory_entry AS entry_5 ON entry_5.id_entry = "
177                 + "record_field_5.id_entry WHERE entry_5.title IN ( 'FirstName', 'LastName' ) ) AS column_5 ON column_5.id_record_5 " + "= record.id_record";
178 
179         List<String> listEntryTitle = Arrays.asList( "FirstName", "LastName" );
180         IRecordColumn recordColumn = new RecordColumnEntry( 5, "Titre", listEntryTitle );
181 
182         RecordColumnEntryQueryPart recordColumnEntryQueryPart = new RecordColumnEntryQueryPart( );
183         recordColumnEntryQueryPart.setRecordColumn( recordColumn );
184 
185         List<String> listRecordColumnJoinQueries = recordColumnEntryQueryPart.getRecordColumnJoinQueries( );
186         assertThat( listRecordColumnJoinQueries, is( not( nullValue( ) ) ) );
187         assertThat( listRecordColumnJoinQueries.size( ), is( 1 ) );
188 
189         String strRecordColumnJoinQuery = removeQuerySpaces( listRecordColumnJoinQueries.get( 0 ) );
190         assertThat( strRecordColumnJoinQuery, is( strJoinQueryExpected ) );
191     }
192 
193     /**
194      * Remove all the unnecessary spaces of a query
195      * 
196      * @param strQuery
197      *            The query to remove the spaces
198      * @return the given query without all unnecessary spaces
199      */
200     private String removeQuerySpaces( String strQuery )
201     {
202         String strQueryResult = StringUtils.EMPTY;
203 
204         if ( StringUtils.isNotBlank( strQuery ) )
205         {
206             strQueryResult = strQuery.trim( ).replaceAll( " +", " " );
207             strQueryResult = strQueryResult.replaceAll( " +,", "," );
208         }
209 
210         return strQueryResult;
211     }
212 }