View Javadoc
1   package org.dbunit.database;
2   
3   import static org.assertj.core.api.Assertions.assertThat;
4   
5   import org.dbunit.AbstractDatabaseIT;
6   import org.dbunit.DdlExecutor;
7   import org.dbunit.dataset.Column;
8   import org.dbunit.dataset.Columns;
9   import org.dbunit.dataset.IDataSet;
10  import org.dbunit.testutil.TestUtils;
11  import org.junit.jupiter.api.Test;
12  
13  /**
14   * @author gommma (gommma AT users.sourceforge.net)
15   * @author Last changed by: $Author$
16   * @version $Revision$ $Date$
17   * @since 2.4.0
18   */
19  class ResultSetTableMetaDataIT extends AbstractDatabaseIT
20  {
21  
22      /**
23       * Replaces {@code _connection} with a fresh connection after test tables
24       * have been dropped, so that {@code AbstractDatabaseIT.tearDown()} uses an
25       * up-to-date dataset that does not include the dropped tables.
26       *
27       * @throws Exception
28       */
29      private void refreshConnection() throws Exception
30      {
31          _connection.close();
32          _connection = getDatabaseTester().getConnection();
33          setUpDatabaseConfig(_connection.getConfig());
34      }
35  
36      protected IDataSet createDataSet() throws Exception
37      {
38          return _connection.createDataSet();
39      }
40  
41      /**
42       * Tests the pattern-like column retrieval from the database. DbUnit should
43       * not interpret any table names as regex patterns.
44       *
45       * @throws Exception
46       */
47      @Test
48      void testGetColumns_withPatternLikeTableName_doesNotInterpretUnderscoreAsPattern() throws Exception
49      {
50          DdlExecutor.dropTables(_connection.getConnection(),
51                  "PATTERN_LIKE_TABLE_XX", "PATTERN_LIKE_TABLE_X_");
52          DdlExecutor.executeDdlFile(
53                  TestUtils.getFile("sql/hypersonic_dataset_pattern_test.sql"),
54                  _connection.getConnection(), false);
55          try
56          {
57              final String tableName = "PATTERN_LIKE_TABLE_X_";
58              final String[] columnNames = {"VARCHAR_COL_XUNDERSCORE"};
59  
60              final String sql = "select * from " + tableName;
61              final ForwardOnlyResultSetTable resultSetTable =
62                      new ForwardOnlyResultSetTable(tableName, sql, _connection);
63              final ResultSetTableMetaData metaData =
64                      (ResultSetTableMetaData) resultSetTable.getTableMetaData();
65  
66              final Column[] columns = metaData.getColumns();
67  
68              assertThat(columns).as("column count").hasSize(columnNames.length);
69  
70              for (int i = 0; i < columnNames.length; i++)
71              {
72                  final Column column =
73                          Columns.getColumn(columnNames[i], columns);
74                  assertThat(column.getColumnName()).as(columnNames[i])
75                          .isEqualToIgnoringCase(columnNames[i]);
76              }
77          }
78          finally
79          {
80              // Close the old connection first to release the open ResultSet cursor
81              // held by ForwardOnlyResultSetTable; otherwise Derby refuses DROP TABLE.
82              refreshConnection();
83              DdlExecutor.dropTables(_connection.getConnection(),
84                      "PATTERN_LIKE_TABLE_XX", "PATTERN_LIKE_TABLE_X_");
85          }
86      }
87  
88  }