View Javadoc
1   package com.opencsv;
2   
3   import org.junit.jupiter.api.*;
4   
5   import java.io.IOException;
6   import java.sql.*;
7   import java.text.SimpleDateFormat;
8   import java.util.Calendar;
9   import java.util.GregorianCalendar;
10  import java.util.Locale;
11  
12  import static org.junit.jupiter.api.Assertions.*;
13  import static org.mockito.Mockito.mock;
14  import static org.mockito.Mockito.when;
15  
16  /**
17   * Created by scott on 12/31/15.
18   */
19  public class ResultSetColumnNameHelperServiceTest {
20  
21      private static Locale systemLocale;
22  
23      @BeforeAll
24      public static void storeSystemLocale() {
25          systemLocale = Locale.getDefault();
26      }
27  
28      @BeforeEach
29      public void setSystemLocaleToValueNotGerman() {
30          Locale.setDefault(Locale.US);
31      }
32  
33      @AfterEach
34      public void setSystemLocaleBackToDefault() {
35          Locale.setDefault(systemLocale);
36      }
37  
38      @Test
39      public void canPrintColumnNames() throws SQLException {
40  
41          ResultSet resultSet = mock(ResultSet.class);
42  
43          String[] expectedNames = {"name1", "name2", "name3"};
44  
45          ResultSetMetaData metaData = MockResultSetMetaDataBuilder.buildMetaData(expectedNames);
46  
47          when(resultSet.getMetaData()).thenReturn(metaData);
48  
49          // end expects
50  
51          ResultSetColumnNameHelperService service = new ResultSetColumnNameHelperService();
52  
53          String[] columnNames = service.getColumnNames(resultSet);
54          assertArrayEquals(expectedNames, columnNames);
55      }
56  
57      @Test
58      public void setColumnNames() throws SQLException {
59          ResultSet resultSet = mock(ResultSet.class);
60  
61          String[] columnNames = {"name1", "name2", "name3"};
62          String[] columnHeaders = {"Column Name 1", "Column Name 2", "Column Name 3"};
63  
64          ResultSetMetaData metaData = MockResultSetMetaDataBuilder.buildMetaData(columnNames);
65  
66          when(resultSet.getMetaData()).thenReturn(metaData);
67  
68          // end expects
69  
70          ResultSetColumnNameHelperService service = new ResultSetColumnNameHelperService();
71          service.setColumnNames(columnNames, columnHeaders);
72          String[] rsColumnNames = service.getColumnNames(resultSet);
73          assertArrayEquals(columnHeaders, rsColumnNames);
74      }
75  
76      @Test
77      public void getColumnNamesWithSubsetOutOfOrder() throws SQLException {
78          ResultSet resultSet = mock(ResultSet.class);
79          String[] realColumnNames = {"name1", "name2", "name3"};
80          String[] desiredColumnNames = {"name3", "name1"};
81          String[] columnHeaders = {"Column Name 3", "Column Name 1"};
82  
83          ResultSetMetaData metaData = MockResultSetMetaDataBuilder.buildMetaData(realColumnNames);
84  
85          when(resultSet.getMetaData()).thenReturn(metaData);
86  
87          // end expects
88  
89          ResultSetColumnNameHelperService service = new ResultSetColumnNameHelperService();
90          service.setColumnNames(desiredColumnNames, columnHeaders);
91          String[] rsColumnNames = service.getColumnNames(resultSet);
92          assertArrayEquals(columnHeaders, rsColumnNames);
93      }
94  
95      @Test
96      public void numberOfColumnsNamesMustMatchNumberOfHeaders() {
97          String[] desiredColumnNames = {"name3", "name1"};
98          String[] columnHeaders = {"Column Name 1", "Column Name 2", "Column Name 3"};
99  
100         ResultSetColumnNameHelperService service = new ResultSetColumnNameHelperService();
101         String englishErrorMessage = null;
102         try {
103             service.setColumnNames(desiredColumnNames, columnHeaders);
104             fail("UnsupportedOperationException should have been thrown.");
105         }
106         catch(UnsupportedOperationException e) {
107             englishErrorMessage = e.getLocalizedMessage();
108         }
109         
110         // Now with another locale
111         service.setErrorLocale(Locale.GERMAN);
112         try {
113             service.setColumnNames(desiredColumnNames, columnHeaders);
114             fail("UnsupportedOperationException should have been thrown.");
115         }
116         catch(UnsupportedOperationException e) {
117             assertNotSame(englishErrorMessage, e.getLocalizedMessage());
118         }
119     }
120 
121     @Test
122     public void cannotHaveNullColumnName() {
123         String[] desiredColumnNames = {"name3", null, "name1"};
124         String[] columnHeaders = {"Column Name 1", "Column Name 2", "Column Name 3"};
125 
126         ResultSetColumnNameHelperService service = new ResultSetColumnNameHelperService();
127         Assertions.assertThrows(UnsupportedOperationException.class, () -> service.setColumnNames(desiredColumnNames, columnHeaders));
128     }
129 
130     @Test
131     public void cannotHaveEmptyColumnName() {
132         String[] desiredColumnNames = {"name3", "", "name1"};
133         String[] columnHeaders = {"Column Name 1", "Column Name 2", "Column Name 3"};
134 
135         ResultSetColumnNameHelperService service = new ResultSetColumnNameHelperService();
136         Assertions.assertThrows(UnsupportedOperationException.class, () -> service.setColumnNames(desiredColumnNames, columnHeaders));
137     }
138 
139     @Test
140     public void cannotHaveSpaceColumnName() {
141         String[] desiredColumnNames = {"name3", "    ", "name1"};
142         String[] columnHeaders = {"Column Name 1", "Column Name 2", "Column Name 3"};
143 
144         ResultSetColumnNameHelperService service = new ResultSetColumnNameHelperService();
145         Assertions.assertThrows(UnsupportedOperationException.class, () -> service.setColumnNames(desiredColumnNames, columnHeaders));
146     }
147 
148     @Test
149     public void cannotHaveNullHeaderName() {
150         String[] desiredColumnNames = {"name3", "name2", "name1"};
151         String[] columnHeaders = {"Column Name 1", null, "Column Name 3"};
152 
153         ResultSetColumnNameHelperService service = new ResultSetColumnNameHelperService();
154         Assertions.assertThrows(UnsupportedOperationException.class, () -> service.setColumnNames(desiredColumnNames, columnHeaders));
155     }
156 
157     @Test
158     public void cannotHaveEmptyHeaderName() {
159         String[] desiredColumnNames = {"name3", "name2", "name1"};
160         String[] columnHeaders = {"Column Name 1", "", "Column Name 3"};
161 
162         ResultSetColumnNameHelperService service = new ResultSetColumnNameHelperService();
163         Assertions.assertThrows(UnsupportedOperationException.class, () -> service.setColumnNames(desiredColumnNames, columnHeaders));
164     }
165 
166     @Test
167     public void cannotHaveSpaceHeaderName() {
168         String[] desiredColumnNames = {"name3", "name2", "name1"};
169         String[] columnHeaders = {"Column Name 1", "     ", "Column Name 3"};
170 
171         ResultSetColumnNameHelperService service = new ResultSetColumnNameHelperService();
172         Assertions.assertThrows(UnsupportedOperationException.class, () -> service.setColumnNames(desiredColumnNames, columnHeaders));
173     }
174 
175     @Test
176     public void getColumnNamesThrowsExceptionIfColumnDoesNotExist() throws SQLException {
177         String[] desiredColumnNames = {"name1", "name2", "badname"};
178         String[] columnHeaders = {"Column Name 1", "Column Name 2", "Column Name 3"};
179 
180         ResultSetColumnNameHelperService service = new ResultSetColumnNameHelperService();
181         service.setColumnNames(desiredColumnNames, columnHeaders);
182 
183         String[] realColumnNames = {"name1", "name2", "name3"};
184 
185         ResultSet resultSet = mock(ResultSet.class);
186         ResultSetMetaData metaData = MockResultSetMetaDataBuilder.buildMetaData(realColumnNames);
187 
188         when(resultSet.getMetaData()).thenReturn(metaData);
189 
190         // end expects
191 
192         Assertions.assertThrows(UnsupportedOperationException.class, () -> service.getColumnNames(resultSet));
193     }
194 
195     @Test
196     public void getBooleanFromResultSet() throws SQLException, IOException {
197         String[] expectedNames = {"true", "false", "TRUE", "FALSE", "Null"};
198         String[] realValues = {"true", "false", "TRUE", "FALSE", null};
199         String[] expectedValues = {"true", "false", "true", "false", ""};
200         int[] expectedTypes = {Types.BOOLEAN, Types.BOOLEAN, Types.BOOLEAN, Types.BOOLEAN, Types.BOOLEAN};
201 
202         ResultSetMetaData metaData = MockResultSetMetaDataBuilder.buildMetaData(expectedNames, expectedTypes);
203         ResultSet resultSet = MockResultSetBuilder.buildResultSet(metaData, realValues, expectedTypes);
204 
205         ResultSetColumnNameHelperService service = new ResultSetColumnNameHelperService();
206 
207         String[] columnValues = service.getColumnValues(resultSet);
208         assertArrayEquals(expectedValues, columnValues);
209     }
210 
211     @Test
212     public void getBooleanSubsetFromResultSet() throws SQLException, IOException {
213         String[] realColumnNames = {"true", "false", "TRUE", "FALSE", "Null"};
214         String[] realValues = {"true", "false", "TRUE", "FALSE", null};
215 
216         String[] desiredColumnNames = {"FALSE", "true"};
217         String[] desiredColumnHeaders = {"Some false", "Some true"};
218 
219         String[] expectedValues = {"false", "true"};
220         int[] expectedTypes = {Types.BOOLEAN, Types.BOOLEAN, Types.BOOLEAN, Types.BOOLEAN, Types.BOOLEAN};
221 
222         ResultSetMetaData metaData = MockResultSetMetaDataBuilder.buildMetaData(realColumnNames, expectedTypes);
223         ResultSet resultSet = MockResultSetBuilder.buildResultSet(metaData, realValues, expectedTypes);
224 
225         ResultSetColumnNameHelperService service = new ResultSetColumnNameHelperService();
226         service.setColumnNames(desiredColumnNames, desiredColumnHeaders);
227 
228         String[] columnValues = service.getColumnValues(resultSet);
229         assertArrayEquals(expectedValues, columnValues);
230     }
231 
232     @Test
233     public void getSubsetWithTrim() throws SQLException, IOException {
234 
235         String[] realColumnNames = {"longvarchar", "varchar", "char", "Null"};
236         String[] realValues = {"a", "b ", "c", null};
237 
238         String[] desiredColumnNames = {"varchar", "Null"};
239         String[] desiredColumnHeaders = {"some varchar", "expect empty string"};
240         String[] expectedValues = {"b", ""};
241         int[] expectedTypes = {Types.LONGVARCHAR, Types.VARCHAR, Types.CHAR, Types.CHAR};
242 
243         ResultSetMetaData metaData = MockResultSetMetaDataBuilder.buildMetaData(realColumnNames, expectedTypes);
244         ResultSet resultSet = MockResultSetBuilder.buildResultSet(metaData, realValues, expectedTypes);
245 
246         ResultSetColumnNameHelperService service = new ResultSetColumnNameHelperService();
247         service.setColumnNames(desiredColumnNames, desiredColumnHeaders);
248 
249         String[] columnValues = service.getColumnValues(resultSet, true);
250         assertArrayEquals(expectedValues, columnValues);
251     }
252 
253     @Test
254     public void getCharSetWithNullAndTrim() throws SQLException, IOException {
255 
256         String[] expectedNames = {"longvarchar", "varchar", "char", "Null"};
257         String[] realValues = {"a", "b ", "c", null};
258         String[] expectedValues = {"a", "b", "c", ""};
259         int[] expectedTypes = {Types.LONGVARCHAR, Types.VARCHAR, Types.CHAR, Types.CHAR};
260 
261         ResultSetMetaData metaData = MockResultSetMetaDataBuilder.buildMetaData(expectedNames, expectedTypes);
262         ResultSet resultSet = MockResultSetBuilder.buildResultSet(metaData, realValues, expectedTypes);
263 
264         ResultSetColumnNameHelperService service = new ResultSetColumnNameHelperService();
265 
266         String[] columnValues = service.getColumnValues(resultSet, true);
267         assertArrayEquals(expectedValues, columnValues);
268     }
269 
270     @Test
271     public void getTimestampFromResultSetWithCustomFormat() throws SQLException, IOException {
272         Timestamp date = new Timestamp(new GregorianCalendar(2009, Calendar.DECEMBER, 15, 12, 0, 0).getTimeInMillis());
273         long dateInMilliSeconds = date.getTime();
274         String customFormat = "mm/dd/yy HH:mm:ss";
275         SimpleDateFormat timeFormat = new SimpleDateFormat(customFormat);
276 
277         String[] expectedNames = {"Timestamp", "Null"};
278         String[] realValues = {Long.toString(dateInMilliSeconds), null};
279         String[] expectedValues = {timeFormat.format(date), ""};
280         int[] expectedTypes = {Types.TIMESTAMP, Types.TIMESTAMP};
281 
282         ResultSetMetaData metaData = MockResultSetMetaDataBuilder.buildMetaData(expectedNames, expectedTypes);
283         ResultSet resultSet = MockResultSetBuilder.buildResultSet(metaData, realValues, expectedTypes);
284 
285         ResultSetColumnNameHelperService service = new ResultSetColumnNameHelperService();
286 
287         String[] columnValues = service.getColumnValues(resultSet, false, null, customFormat);
288         assertArrayEquals(expectedValues, columnValues);
289     }
290 
291     @Test
292     public void getSubsetFromResultSetWithCustomFormat() throws SQLException, IOException {
293         Timestamp date = new Timestamp(new GregorianCalendar(2009, Calendar.DECEMBER, 15, 12, 0, 0).getTimeInMillis());
294         long dateInMilliSeconds = date.getTime();
295         String customFormat = "mm/dd/yy HH:mm:ss";
296         SimpleDateFormat timeFormat = new SimpleDateFormat(customFormat);
297 
298         String[] realColumnNames = {"Timestamp", "Null"};
299         String[] realValues = {Long.toString(dateInMilliSeconds), null};
300 
301         String[] desiredColumnNames = {"Timestamp"};
302         String[] desiredColumnHeaders = {"A timestamp"};
303 
304         String[] expectedValues = {timeFormat.format(date)};
305         int[] expectedTypes = {Types.TIMESTAMP, Types.TIMESTAMP};
306 
307         ResultSetMetaData metaData = MockResultSetMetaDataBuilder.buildMetaData(realColumnNames, expectedTypes);
308         ResultSet resultSet = MockResultSetBuilder.buildResultSet(metaData, realValues, expectedTypes);
309 
310         ResultSetColumnNameHelperService service = new ResultSetColumnNameHelperService();
311         service.setColumnNames(desiredColumnNames, desiredColumnHeaders);
312 
313         String[] columnValues = service.getColumnValues(resultSet, false, null, customFormat);
314         assertArrayEquals(expectedValues, columnValues);
315     }
316 
317     @DisplayName("Bug#215: DateTimeFormat that are set are not being used.")
318     @Test
319     public void setDateTimeFormat() throws SQLException, IOException {
320         Timestamp date = new Timestamp(new GregorianCalendar(2009, Calendar.DECEMBER, 15, 12, 0, 0).getTimeInMillis());
321         long dateInMilliSeconds = date.getTime();
322         String customFormat = "mm/dd/yy HH:mm:ss";
323         SimpleDateFormat timeFormat = new SimpleDateFormat(customFormat);
324 
325         String[] realColumnNames = {"Timestamp", "Null"};
326         String[] realValues = {Long.toString(dateInMilliSeconds), null};
327 
328         String[] desiredColumnNames = {"Timestamp"};
329         String[] desiredColumnHeaders = {"A timestamp"};
330 
331         String[] expectedValues = {timeFormat.format(date)};
332         int[] expectedTypes = {Types.TIMESTAMP, Types.TIMESTAMP};
333 
334         ResultSetMetaData metaData = MockResultSetMetaDataBuilder.buildMetaData(realColumnNames, expectedTypes);
335         ResultSet resultSet = MockResultSetBuilder.buildResultSet(metaData, realValues, expectedTypes);
336 
337         ResultSetColumnNameHelperService service = new ResultSetColumnNameHelperService();
338         service.setDateTimeFormat(customFormat);
339         service.setColumnNames(desiredColumnNames, desiredColumnHeaders);
340 
341         String[] columnValues = service.getColumnValues(resultSet, false);
342         assertArrayEquals(expectedValues, columnValues);
343     }
344 
345     @DisplayName("Bug#215: DateTime that are set are not being used.")
346     @Test
347     public void setDateFormat() throws SQLException, IOException {
348         Timestamp date = new Timestamp(new GregorianCalendar(2009, Calendar.DECEMBER, 15).getTimeInMillis());
349         long dateInMilliSeconds = date.getTime();
350         String customFormat = "mm/dd/yy";
351         SimpleDateFormat timeFormat = new SimpleDateFormat(customFormat);
352 
353         String[] realColumnNames = {"Timestamp", "Null"};
354         String[] realValues = {Long.toString(dateInMilliSeconds), null};
355 
356         String[] desiredColumnNames = {"Timestamp"};
357         String[] desiredColumnHeaders = {"A timestamp"};
358 
359         String[] expectedValues = {timeFormat.format(date)};
360         int[] expectedTypes = {Types.DATE, Types.DATE};
361 
362         ResultSetMetaData metaData = MockResultSetMetaDataBuilder.buildMetaData(realColumnNames, expectedTypes);
363         ResultSet resultSet = MockResultSetBuilder.buildResultSet(metaData, realValues, expectedTypes);
364 
365         ResultSetColumnNameHelperService service = new ResultSetColumnNameHelperService();
366         service.setDateFormat(customFormat);
367         service.setColumnNames(desiredColumnNames, desiredColumnHeaders);
368 
369         String[] columnValues = service.getColumnValues(resultSet, false);
370         assertArrayEquals(expectedValues, columnValues);
371     }
372 }