Project

General

Profile

1
package eu.dnetlib.enabling.database.utils;
2

    
3
import static org.junit.Assert.assertEquals;
4
import static org.junit.Assert.assertNotNull;
5
import static org.junit.Assert.assertTrue;
6
import static org.mockito.Matchers.any;
7
import static org.mockito.Matchers.anyObject;
8
import static org.mockito.Matchers.anyString;
9
import static org.mockito.Mockito.atLeastOnce;
10
import static org.mockito.Mockito.never;
11
import static org.mockito.Mockito.times;
12
import static org.mockito.Mockito.verify;
13
import static org.mockito.Mockito.when;
14

    
15
import java.io.StringReader;
16
import java.sql.Date;
17
import java.util.Arrays;
18
import java.util.HashMap;
19
import java.util.List;
20
import java.util.Map;
21

    
22
import javax.sql.DataSource;
23

    
24
import org.apache.velocity.app.VelocityEngine;
25
import org.dom4j.Document;
26
import org.dom4j.DocumentHelper;
27
import org.dom4j.Element;
28
import org.dom4j.io.SAXReader;
29
import org.junit.Before;
30
import org.junit.Ignore;
31
import org.junit.Test;
32
import org.junit.runner.RunWith;
33
import org.mockito.Mock;
34
import org.mockito.runners.MockitoJUnitRunner;
35
import org.springframework.jdbc.core.JdbcTemplate;
36
import org.springframework.transaction.support.TransactionCallback;
37
import org.springframework.transaction.support.TransactionTemplate;
38

    
39
import com.google.common.collect.Lists;
40
import com.google.common.collect.Maps;
41

    
42
import eu.dnetlib.enabling.database.DataSourceFactory;
43
import eu.dnetlib.enabling.database.TransactionTemplateFactory;
44
import eu.dnetlib.enabling.database.objects.DnetDatabase;
45

    
46
@RunWith(MockitoJUnitRunner.class)
47
public class DatabaseUtilsTest {
48

    
49
	private static final String DB = "THE_DB";
50
	private static final String TABLE = "THE_TABLE";
51
	private static final String QUERY = "SELECT age FROM persons";
52
	private static final String RESOURCE_ID = "id1234";
53
	private static final String DB_PREFIX = "THE_";
54
	public static final String DNET_RESOURCE_ID_FIELD = "_dnet_resource_identifier_";
55
	private static final String DEFAULT_DB = "postgres";
56

    
57
	// Class Under Test
58
	private DatabaseUtils dbUtils;
59

    
60
	private final List<Map<String, Object>> RESULTS = Lists.newArrayList();
61

    
62
	private Map<String, Object> MAP;
63

    
64
	private final DnetDatabase DNET_DB = new DnetDatabase();
65

    
66
	@Mock
67
	private JdbcTemplateFactory jdbcTemplateFactory;
68
	@Mock
69
	private JdbcTemplate jdbcTemplate;
70
	@Mock
71
	private DataSource dataSource;
72
	@Mock
73
	private VelocityEngine velocityEngine;
74
	@Mock
75
	private DataSourceFactory dataSourceFactory;
76
	@Mock
77
	private TransactionTemplateFactory transactionTemplateFactory;
78
	@Mock
79
	private TransactionTemplate transactionTemplate;
80

    
81
	@SuppressWarnings("unchecked")
82
	@Before
83
	public void setUp() throws Exception {
84
		dbUtils = new DatabaseUtils();
85

    
86
		DNET_DB.setDbName(DB);
87

    
88
		MAP = new HashMap<String, Object>();
89
		MAP.put("k1", "v1");
90
		MAP.put("k2", "v2");
91
		MAP.put("k3", "v3");
92

    
93
		dbUtils.setJdbcTemplateFactory(jdbcTemplateFactory);
94
		dbUtils.setDataSourceFactory(dataSourceFactory);
95
		dbUtils.setTransactionTemplateFactory(transactionTemplateFactory);
96
		dbUtils.setVelocityEngine(velocityEngine);
97
		dbUtils.setDbPrefix(DB_PREFIX);
98
		dbUtils.setNumbersOfRecordsForTransaction(20);
99

    
100
		when(jdbcTemplateFactory.createJdbcTemplate(dataSource)).thenReturn(jdbcTemplate);
101
		when(jdbcTemplateFactory.createJdbcTemplate(DB)).thenReturn(jdbcTemplate);
102

    
103
		when(jdbcTemplate.queryForList(QUERY, Integer.class)).thenReturn(Arrays.asList(1, 2, 3, 4));
104

    
105
		for (int i = 0; i < 4; i++) {
106
			RESULTS.add(MAP);
107
		}
108

    
109
		when(jdbcTemplate.queryForList(QUERY)).thenReturn(RESULTS);
110
		when(jdbcTemplate.queryForList("SELECT * FROM " + TABLE)).thenReturn(Arrays.asList(MAP, MAP, MAP));
111

    
112
		when(jdbcTemplate.queryForList("SELECT * FROM information_schema.columns WHERE table_name = ?", new Object[] { TABLE })).thenReturn(
113
				Arrays.asList(MAP, MAP, MAP));
114
		//when(jdbcTemplate.queryForList("SELECT profileid FROM dnet_tables WHERE table_name='THE_TABLE' AND database_db_name='THE_DB'", String.class))
115
		//		.thenReturn(Arrays.asList("1234"));
116

    
117
		when(dataSourceFactory.createDataSource(anyString())).thenReturn(dataSource);
118
		//when(jdbcTemplate.getDataSource()).thenReturn(dataSource);
119

    
120
		when(transactionTemplateFactory.createTransactionTemplate(dataSource)).thenReturn(transactionTemplate);
121

    
122
	}
123

    
124
	@Test
125
	public void testListCommonDBTables() throws Exception {
126
		dbUtils.listCommonDBTables(DB);
127
		verify(jdbcTemplateFactory).createJdbcTemplate(DB);
128
		verify(jdbcTemplate).queryForList(
129
				"SELECT table_name FROM information_schema.tables WHERE table_schema = 'public' AND table_type != 'VIEW' AND table_name NOT LIKE '%_log'",
130
				String.class);
131
	}
132

    
133
	@Test
134
	public void testListCommonDBViews() throws Exception {
135
		dbUtils.listCommonDBViews(DB);
136
		verify(jdbcTemplateFactory).createJdbcTemplate(DB);
137
		verify(jdbcTemplate).queryForList(
138
				"SELECT table_name FROM information_schema.tables WHERE table_schema = 'public' AND table_type = 'VIEW' AND table_name NOT LIKE '%_log'",
139
				String.class);
140
	}
141

    
142
	@Ignore
143
	@Test
144
	public void testListAllDatabases() throws Exception {
145
		dbUtils.listAllDatabases();
146
		verify(jdbcTemplateFactory).createJdbcTemplate(DEFAULT_DB);
147
		verify(jdbcTemplate).queryForList("SELECT datname FROM pg_database WHERE datname LIKE '" + DB_PREFIX + "%'", String.class);
148
	}
149

    
150
	@Test
151
	public void testGetTypedListFromSql() throws Exception {
152
		List<Integer> list = dbUtils.getTypedListFromSql(DB, QUERY, Integer.class);
153
		verify(jdbcTemplateFactory).createJdbcTemplate(DB);
154
		verify(jdbcTemplate).queryForList(QUERY, Integer.class);
155
		assertEquals(4, list.size());
156
	}
157

    
158
	@Test
159
	public void testGetSimpleListFromSql() throws Exception {
160
		List<String> list = dbUtils.getSimpleListFromSql(DB, QUERY);
161
		verify(jdbcTemplateFactory).createJdbcTemplate(DB);
162
		verify(jdbcTemplate).queryForList(QUERY);
163
		assertEquals(4, list.size());
164
	}
165

    
166
	@Test
167
	public void testExecuteSql() throws Exception {
168
		dbUtils.executeSql(DB, QUERY, null);
169
		verify(jdbcTemplateFactory).createJdbcTemplate(DB);
170
		verify(jdbcTemplate).update(QUERY);
171
	}
172

    
173
	@Test
174
	public void testDescribeTable() throws Exception {
175
		List<Map<?, ?>> res = dbUtils.describeTable(DB, TABLE);
176
		verify(jdbcTemplateFactory).createJdbcTemplate(DB);
177
		assertEquals(3, res.size());
178
		assertEquals(3, res.get(0).size());
179
		assertEquals(3, res.get(1).size());
180
		assertEquals(3, res.get(2).size());
181
	}
182

    
183
	@Test
184
	public void testDumpTableAsXML() throws Exception {
185
		String xml = dbUtils.dumpTableAsXML(DB, TABLE);
186

    
187
		verify(jdbcTemplateFactory).createJdbcTemplate(DB);
188
		assertNotNull(xml);
189
		assertTrue(xml.contains(TABLE));
190
		assertTrue(xml.contains(DB));
191
		assertTrue(xml.contains("ROW"));
192
	}
193

    
194
	@Test
195
	public void testDumpTableAsList() throws Exception {
196
		List<Document> list = dbUtils.dumpTableAsList(DB, TABLE);
197

    
198
		verify(jdbcTemplateFactory).createJdbcTemplate(DB);
199
		verify(jdbcTemplate).queryForList("SELECT * FROM " + TABLE);
200
		assertTrue(list.size() > 0);
201
	}
202

    
203
	@Test
204
	public void testGetRowByResourceId() throws Exception {
205
		dbUtils.getRowByResourceId(DB, TABLE, RESOURCE_ID);
206
		verify(jdbcTemplateFactory).createJdbcTemplate(DB);
207
		verify(jdbcTemplate).queryForMap("SELECT * FROM " + TABLE + " WHERE " + DatabaseUtils.DNET_RESOURCE_ID_FIELD + "=?", new Object[] { RESOURCE_ID });
208
	}
209

    
210
	@SuppressWarnings({ "unchecked", "rawtypes" })
211
	@Test
212
	public void testImportFromIterable() throws Exception {
213
		List<String> iterable = Lists.newArrayList("<ROWS><ROW table='t1' /></ROWS>", "<ROWS><ROW table='t2' /></ROWS>");
214

    
215
		GenericRow row1 = new GenericRow(TABLE, MAP, true);
216
		GenericRow row2 = new GenericRow(TABLE, MAP, false);;
217

    
218
		when(transactionTemplate.execute((TransactionCallback) anyObject())).thenReturn(Lists.newArrayList(row1, row2, row1, row2));
219

    
220
		dbUtils.importFromIterable(DB, iterable);
221

    
222
		verify(jdbcTemplateFactory).createJdbcTemplate(dataSource);
223
		verify(transactionTemplateFactory).createTransactionTemplate(dataSource);
224

    
225
		verify(transactionTemplate, times(1)).execute((TransactionCallback) anyObject());
226
	}
227

    
228
	@Test
229
	public void testDeleteRowByResourceId() throws Exception {
230
		dbUtils.deleteRowByResourceId(DB, TABLE, RESOURCE_ID);
231
		verify(jdbcTemplateFactory).createJdbcTemplate(DB);
232
		verify(jdbcTemplate).update("DELETE FROM " + TABLE + " WHERE " + DatabaseUtils.DNET_RESOURCE_ID_FIELD + "=?", new Object[] { RESOURCE_ID });
233
	}
234

    
235
	@Test
236
	public void testClearTable() throws Exception {
237
		dbUtils.clearTable(DB, TABLE);
238
		verify(jdbcTemplateFactory).createJdbcTemplate(DB);
239
		verify(jdbcTemplate).update("DELETE FROM " + TABLE);
240
	}
241

    
242
	@Ignore
243
	@SuppressWarnings("unchecked")
244
	@Test
245
	public void testPrepareManagementOfTable() throws Exception {
246
		when(jdbcTemplate.queryForObject(anyString(), any(Class.class), (Object[]) anyObject())).thenReturn(1);
247

    
248
		dbUtils.prepareManagementOfTable(DB, TABLE);
249
		verify(jdbcTemplateFactory, atLeastOnce()).createJdbcTemplate(DB);
250
		verify(jdbcTemplate, atLeastOnce()).queryForObject(anyString(), Integer.class, (Object[]) anyObject());
251
		verify(jdbcTemplate, never()).update(anyString());
252
	}
253

    
254
	@Ignore
255
	@SuppressWarnings("unchecked")
256
	@Test
257
	public void testPrepareManagementOfTable_2() throws Exception {
258
		when(jdbcTemplate.queryForObject(anyString(), any(Class.class), (Object[]) anyObject())).thenReturn(0);
259

    
260
		dbUtils.prepareManagementOfTable(DB, TABLE);
261
		verify(jdbcTemplateFactory, atLeastOnce()).createJdbcTemplate(DB);
262
		verify(jdbcTemplate, atLeastOnce()).queryForObject(anyString(), Integer.class, (Object[]) anyObject());
263
		verify(jdbcTemplate, atLeastOnce()).update(anyString());
264
	}
265

    
266
	@Ignore
267
	@SuppressWarnings("unchecked")
268
	@Test
269
	public void testClearManagementOfTable() throws Exception {
270
		when(jdbcTemplate.queryForObject(anyString(), any(Class.class), (Object[]) anyObject())).thenReturn(0);
271

    
272
		dbUtils.removeManagementOfTable(DB, TABLE);
273
		verify(jdbcTemplateFactory, atLeastOnce()).createJdbcTemplate(DB);
274

    
275
		verify(jdbcTemplate, never()).update(anyString());
276
	}
277

    
278
	@Ignore
279
	@Test
280
	public void testClearManagementOfTable_2() throws Exception {
281
		when(jdbcTemplate.queryForObject(anyString(), any(Class.class), (Object[]) anyObject())).thenReturn(1);
282
		dbUtils.removeManagementOfTable(DB, TABLE);
283
		verify(jdbcTemplateFactory, atLeastOnce()).createJdbcTemplate(DB);
284

    
285
		verify(jdbcTemplate, atLeastOnce()).update(anyString());
286
	}
287

    
288
	@Test
289
	public void testParseDate() throws Exception {
290
		Date d = dbUtils.parseDate("31-05-2011", "dd-MM-yyyy");
291
		assertEquals("2011-05-31", d.toString());
292
	}
293

    
294
	@Test
295
	public void testEscape() throws Exception {
296
		Map<String, String> m = Maps.newHashMap();
297

    
298
		m.put("url", "http://www.google.com/set?a=val1&b=val2");
299
		m.put("title", "My favourite movie title");
300

    
301
		Document doc = dbUtils.rowToDocument(m);
302
		assertNotNull(doc);
303

    
304
		Document doc2 = DocumentHelper.createDocument();
305
		Element elem = doc2.addElement("a");
306
		elem.setText(doc.asXML());
307
		doc2.setRootElement(elem);
308

    
309
		String tempXML = doc2.asXML();
310

    
311
		SAXReader reader = new SAXReader();
312
		Document doc3 = reader.read(new StringReader(tempXML));
313

    
314
		System.out.println(doc.asXML());;
315
		System.out.println(doc3.getRootElement().getText());;
316

    
317
		assertEquals(doc.asXML(), doc3.getRootElement().getText());
318

    
319
	}
320

    
321
	@Test
322
	public void testParseBoolean() throws Exception {
323
		assertEquals(dbUtils.parseBoolean("TRUE"), true);
324
		assertEquals(dbUtils.parseBoolean("true"), true);
325
		assertEquals(dbUtils.parseBoolean("T"), true);
326
		assertEquals(dbUtils.parseBoolean("Yes"), true);
327
		assertEquals(dbUtils.parseBoolean("false"), false);
328
		assertEquals(dbUtils.parseBoolean("F"), false);
329
		assertEquals(dbUtils.parseBoolean("No"), false);
330
		assertEquals(dbUtils.parseBoolean("N/A"), false);
331
		assertEquals(dbUtils.parseBoolean("XYZ"), false);
332
	}
333
}
(1-1/2)