1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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
52
53
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
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
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
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
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
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
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
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
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
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 }