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
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
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
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
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
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
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 }