View Javadoc
1   /*
2    *
3    * The DbUnit Database Testing Framework
4    * Copyright (C)2002-2004, DbUnit.org
5    *
6    * This library is free software; you can redistribute it and/or
7    * modify it under the terms of the GNU Lesser General Public
8    * License as published by the Free Software Foundation; either
9    * version 2.1 of the License, or (at your option) any later version.
10   *
11   * This library is distributed in the hope that it will be useful,
12   * but WITHOUT ANY WARRANTY; without even the implied warranty of
13   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14   * Lesser General Public License for more details.
15   *
16   * You should have received a copy of the GNU Lesser General Public
17   * License along with this library; if not, write to the Free Software
18   * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19   *
20   */
21  package org.dbunit.operation;
22  
23  import static org.assertj.core.api.Assertions.assertThat;
24  import static org.junit.jupiter.api.Assertions.assertThrows;
25  
26  import java.io.Reader;
27  
28  import org.dbunit.AbstractDatabaseIT;
29  import org.dbunit.dataset.Column;
30  import org.dbunit.dataset.Columns;
31  import org.dbunit.dataset.DataSetUtils;
32  import org.dbunit.dataset.IDataSet;
33  import org.dbunit.dataset.ITable;
34  import org.dbunit.dataset.ITableMetaData;
35  import org.dbunit.dataset.NoSuchColumnException;
36  import org.dbunit.dataset.xml.XmlDataSet;
37  import org.dbunit.testutil.TestUtils;
38  import org.junit.jupiter.api.Test;
39  
40  /**
41   * @author Manuel Laflamme
42   * @version $Revision$
43   * @since May 7, 2002
44   */
45  class AbstractBatchOperationIT extends AbstractDatabaseIT
46  {
47  
48      @Test
49      void testGetOperationMetaData_withMissingDataSetColumns_returnsMetaDataFromDatabase() throws Exception
50      {
51          final Reader in = TestUtils.getFileReader("xml/missingColumnTest.xml");
52          final IDataSet xmlDataSet = new XmlDataSet(in);
53  
54          final ITable[] xmlTables = DataSetUtils.getTables(xmlDataSet);
55          for (int i = 0; i < xmlTables.length; i++)
56          {
57              final ITable xmlTable = xmlTables[i];
58              final ITableMetaData xmlMetaData = xmlTable.getTableMetaData();
59              final String tableName = xmlMetaData.getTableName();
60  
61              final ITable databaseTable =
62                      _connection.createDataSet().getTable(tableName);
63              final ITableMetaData databaseMetaData =
64                      databaseTable.getTableMetaData();
65  
66              // ensure xml table is missing some columns present in database
67              // table
68              assertThat(xmlMetaData.getColumns())
69                      .as(tableName + " missing columns")
70                      .hasSizeLessThan(databaseMetaData.getColumns().length);
71  
72              final ITableMetaData resultMetaData = AbstractBatchOperation
73                      .getOperationMetaData(_connection, xmlMetaData);
74  
75              // result metadata must contains database columns matching the xml
76              // columns
77              final Column[] resultColumns = resultMetaData.getColumns();
78              assertThat(resultColumns).as("result columns count")
79                      .hasSameSizeAs(xmlMetaData.getColumns());
80              for (int j = 0; j < resultColumns.length; j++)
81              {
82                  final Column resultColumn = resultColumns[j];
83                  final Column databaseColumn =
84                          Columns.getColumn(resultColumn.getColumnName(),
85                                  databaseMetaData.getColumns());
86                  final Column xmlColumn = xmlMetaData.getColumns()[j];
87  
88                  assertThat(resultColumn.getColumnName()).as("column name")
89                          .isEqualTo(convertString(xmlColumn.getColumnName()));
90                  assertThat(databaseColumn).as("column instance")
91                          .isSameAs(resultColumn);
92              }
93  
94              // result metadata must contains database primary keys
95              final Column[] resultPrimaryKeys = resultMetaData.getPrimaryKeys();
96              assertThat(resultPrimaryKeys).as("key count")
97                      .hasSameSizeAs(databaseMetaData.getPrimaryKeys());
98              for (int j = 0; j < resultPrimaryKeys.length; j++)
99              {
100                 final Column resultPrimaryKey = resultPrimaryKeys[j];
101                 final Column databasePrimaryKey =
102                         databaseMetaData.getPrimaryKeys()[j];
103                 assertThat(resultPrimaryKey).as("key instance")
104                         .isSameAs(databasePrimaryKey);
105             }
106         }
107     }
108 
109     @Test
110     void testGetOperationMetaData_withUnknownColumn_throwsNoSuchColumnException() throws Exception
111     {
112         final String tableName = "PK_TABLE";
113         final Reader in = TestUtils.getFileReader("xml/unknownColumnTest.xml");
114         final IDataSet xmlDataSet = new XmlDataSet(in);
115 
116         final ITable xmlTable = xmlDataSet.getTable(tableName);
117 
118         assertThrows(NoSuchColumnException.class,
119                 () -> AbstractBatchOperation.getOperationMetaData(_connection,
120                         xmlTable.getTableMetaData()),
121                 "Should throw a NoSuchColumnException");
122     }
123 
124 }