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  import static org.junit.jupiter.api.Assertions.fail;
26  
27  import java.io.Reader;
28  
29  import org.dbunit.AbstractDatabaseIT;
30  import org.dbunit.Assertion;
31  import org.dbunit.database.DatabaseConfig;
32  import org.dbunit.database.MockDatabaseConnection;
33  import org.dbunit.database.statement.MockBatchStatement;
34  import org.dbunit.database.statement.MockStatementFactory;
35  import org.dbunit.dataset.Column;
36  import org.dbunit.dataset.DefaultDataSet;
37  import org.dbunit.dataset.DefaultTable;
38  import org.dbunit.dataset.DefaultTableMetaData;
39  import org.dbunit.dataset.ForwardOnlyDataSet;
40  import org.dbunit.dataset.IDataSet;
41  import org.dbunit.dataset.ITable;
42  import org.dbunit.dataset.LowerCaseDataSet;
43  import org.dbunit.dataset.NoPrimaryKeyException;
44  import org.dbunit.dataset.NoSuchColumnException;
45  import org.dbunit.dataset.datatype.DataType;
46  import org.dbunit.dataset.xml.FlatXmlDataSetBuilder;
47  import org.dbunit.testutil.TestUtils;
48  import org.junit.jupiter.api.Test;
49  
50  /**
51   * @author Manuel Laflamme
52   * @version $Revision$
53   * @since Feb 19, 2002
54   */
55  class RefreshOperationIT extends AbstractDatabaseIT
56  {
57  
58      @Test
59      void testExecute_withFlatXmlDataSet_upsertsRows() throws Exception
60      {
61          final Reader reader =
62                  TestUtils.getFileReader("xml/refreshOperationTest.xml");
63          final IDataSet dataSet = new FlatXmlDataSetBuilder().build(reader);
64  
65          testExecute(dataSet);
66      }
67  
68      @Test
69      void testExecute_withLowerCaseDataSet_upsertsRows() throws Exception
70      {
71          final Reader reader =
72                  TestUtils.getFileReader("xml/refreshOperationTest.xml");
73          final IDataSet dataSet = new FlatXmlDataSetBuilder().build(reader);
74  
75          testExecute(new LowerCaseDataSet(dataSet));
76      }
77  
78      @Test
79      void testExecute_withForwardOnlyDataSet_upsertsRows() throws Exception
80      {
81          final Reader reader =
82                  TestUtils.getFileReader("xml/refreshOperationTest.xml");
83          final IDataSet dataSet = new FlatXmlDataSetBuilder().build(reader);
84  
85          testExecute(new ForwardOnlyDataSet(dataSet));
86      }
87  
88      private void testExecute(final IDataSet dataSet) throws Exception
89      {
90          final String[] tableNames = {"PK_TABLE", "ONLY_PK_TABLE"};
91          final int[] tableRowCount = {3, 1};
92          final String primaryKey = "PK0";
93  
94          // verify table before
95          assertThat(tableRowCount).as("array lenght").hasSameSizeAs(tableNames);
96          for (int i = 0; i < tableNames.length; i++)
97          {
98              final ITable tableBefore =
99                      createOrderedTable(tableNames[i], primaryKey);
100             assertThat(tableBefore.getRowCount()).as("row count before")
101                     .isEqualTo(tableRowCount[i]);
102         }
103 
104         DatabaseOperation.REFRESH.execute(_connection, dataSet);
105 
106         // verify table after
107         final IDataSet expectedDataSet =
108                 new FlatXmlDataSetBuilder().build(TestUtils
109                         .getFileReader("xml/refreshOperationTestExpected.xml"));
110 
111         for (int i = 0; i < tableNames.length; i++)
112         {
113             final ITable expectedTable =
114                     expectedDataSet.getTable(tableNames[i]);
115             final ITable tableAfter =
116                     createOrderedTable(tableNames[i], primaryKey);
117             Assertion.assertEquals(expectedTable, tableAfter);
118         }
119     }
120 
121     @Test
122     void testExecute_withTableHavingNoPrimaryKey_throwsNoPrimaryKeyException() throws Exception
123     {
124         final String tableName = "TEST_TABLE";
125 
126         final Reader reader =
127                 TestUtils.getFileReader("xml/refreshOperationNoPKTest.xml");
128         final IDataSet dataSet = new FlatXmlDataSetBuilder().build(reader);
129 
130         // verify table before
131         assertThat(_connection.getRowCount(tableName)).as("row count before")
132                 .isEqualTo(6);
133 
134         assertThrows(NoPrimaryKeyException.class,
135                 () -> DatabaseOperation.REFRESH.execute(_connection, dataSet),
136                 "Should not be here!");
137 
138         // verify table after
139         assertThat(_connection.getRowCount(tableName)).as("row count before")
140                 .isEqualTo(6);
141     }
142 
143     @Test
144     void testExecute_withBatchedStatements_refreshesAllRows() throws Exception
145     {
146         final Reader reader =
147                 TestUtils.getFileReader("xml/refreshOperationTest.xml");
148         final IDataSet dataSet = new FlatXmlDataSetBuilder().build(reader);
149 
150         _connection.getConfig().setFeature(DatabaseConfig.FEATURE_BATCHED_STATEMENTS, true);
151 
152         testExecute(dataSet);
153     }
154 
155     @Test
156     void testExecute_withEmptyTable_noStatementCreated() throws Exception
157     {
158         final Column[] columns = {new Column("c1", DataType.VARCHAR)};
159         final ITable table = new DefaultTable(
160                 new DefaultTableMetaData("name", columns, columns));
161         final IDataSet dataSet = new DefaultDataSet(table);
162 
163         // setup mock objects
164         final MockStatementFactory factory = new MockStatementFactory();
165         factory.setExpectedCreatePreparedStatementCalls(0);
166 
167         final MockDatabaseConnection connection = new MockDatabaseConnection();
168         connection.setupDataSet(dataSet);
169         connection.setupStatementFactory(factory);
170         connection.setExpectedCloseCalls(0);
171 
172         // execute operation
173         DatabaseOperation.REFRESH.execute(connection, dataSet);
174 
175         factory.verify();
176         connection.verify();
177     }
178 
179     @Test
180     void testExecute_withColumnNotInDatabase_throwsNoSuchColumnException() throws Exception
181     {
182         final String tableName = "table";
183 
184         // setup table
185         final Column[] columns =
186                 new Column[] {new Column("unknown", DataType.VARCHAR),};
187         final DefaultTable table = new DefaultTable(tableName, columns);
188         table.addRow();
189         table.setValue(0, columns[0].getColumnName(), "value");
190         final IDataSet insertDataset = new DefaultDataSet(table);
191 
192         final IDataSet databaseDataSet = new DefaultDataSet(new DefaultTable(
193                 tableName,
194                 new Column[] {new Column("column", DataType.VARCHAR),}));
195 
196         // setup mock objects
197         final MockBatchStatement statement = new MockBatchStatement();
198         statement.setExpectedExecuteBatchCalls(0);
199         statement.setExpectedClearBatchCalls(0);
200         statement.setExpectedCloseCalls(0);
201 
202         final MockStatementFactory factory = new MockStatementFactory();
203         factory.setExpectedCreatePreparedStatementCalls(0);
204         factory.setupStatement(statement);
205 
206         final MockDatabaseConnection connection = new MockDatabaseConnection();
207         connection.setupDataSet(databaseDataSet);
208         connection.setupStatementFactory(factory);
209         connection.setExpectedCloseCalls(0);
210 
211         // execute operation
212         try
213         {
214             new RefreshOperation().execute(connection, insertDataset);
215             fail("Should not be here!");
216         } catch (final NoSuchColumnException e)
217         {
218 
219         }
220 
221         statement.verify();
222         factory.verify();
223         connection.verify();
224     }
225 
226 }