Project

General

Profile

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

    
3
import java.io.StringReader;
4
import java.sql.Date;
5
import java.util.Arrays;
6
import java.util.HashMap;
7
import java.util.List;
8
import java.util.Map;
9
import javax.sql.DataSource;
10

    
11
import com.google.common.collect.Lists;
12
import com.google.common.collect.Maps;
13
import eu.dnetlib.enabling.database.DataSourceFactory;
14
import eu.dnetlib.enabling.database.TransactionTemplateFactory;
15
import eu.dnetlib.enabling.database.objects.DnetDatabase;
16
import org.apache.velocity.app.VelocityEngine;
17
import org.dom4j.Document;
18
import org.dom4j.DocumentHelper;
19
import org.dom4j.Element;
20
import org.dom4j.io.SAXReader;
21
import org.junit.Before;
22
import org.junit.Ignore;
23
import org.junit.Test;
24
import org.junit.runner.RunWith;
25
import org.mockito.Mock;
26
import org.mockito.runners.MockitoJUnitRunner;
27
import org.springframework.jdbc.core.JdbcTemplate;
28
import org.springframework.transaction.support.TransactionCallback;
29
import org.springframework.transaction.support.TransactionTemplate;
30

    
31
import static org.junit.Assert.*;
32
import static org.mockito.Matchers.any;
33
import static org.mockito.Matchers.anyObject;
34
import static org.mockito.Matchers.anyString;
35
import static org.mockito.Mockito.*;
36

    
37
@RunWith(MockitoJUnitRunner.class)
38
public class DatabaseUtilsTest {
39

    
40
	private static final String DB = "THE_DB";
41
	private static final String TABLE = "THE_TABLE";
42
	private static final String QUERY = "SELECT age FROM persons";
43
	private static final String RESOURCE_ID = "id1234";
44
	private static final String DB_PREFIX = "THE_";
45
	public static final String DNET_RESOURCE_ID_FIELD = "_dnet_resource_identifier_";
46
	private static final String DEFAULT_DB = "postgres";
47

    
48
	// Class Under Test
49
	private DatabaseUtils dbUtils;
50

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

    
53
	private Map<String, Object> MAP;
54

    
55
	private final DnetDatabase DNET_DB = new DnetDatabase();
56

    
57
	@Mock
58
	private JdbcTemplateFactory jdbcTemplateFactory;
59
	@Mock
60
	private JdbcTemplate jdbcTemplate;
61
	@Mock
62
	private DataSource dataSource;
63
	@Mock
64
	private VelocityEngine velocityEngine;
65
	@Mock
66
	private DataSourceFactory dataSourceFactory;
67
	@Mock
68
	private TransactionTemplateFactory transactionTemplateFactory;
69
	@Mock
70
	private TransactionTemplate transactionTemplate;
71

    
72
	@SuppressWarnings("unchecked")
73
	@Before
74
	public void setUp() throws Exception {
75
		dbUtils = new DatabaseUtils();
76

    
77
		DNET_DB.setDbName(DB);
78

    
79
		MAP = new HashMap<String, Object>();
80
		MAP.put("k1", "v1");
81
		MAP.put("k2", "v2");
82
		MAP.put("k3", "v3");
83

    
84
		dbUtils.setJdbcTemplateFactory(jdbcTemplateFactory);
85
		dbUtils.setDataSourceFactory(dataSourceFactory);
86
		dbUtils.setTransactionTemplateFactory(transactionTemplateFactory);
87
		dbUtils.setVelocityEngine(velocityEngine);
88
		dbUtils.setDbPrefix(DB_PREFIX);
89
		dbUtils.setNumbersOfRecordsForTransaction(20);
90

    
91
		when(jdbcTemplateFactory.createJdbcTemplate(dataSource)).thenReturn(jdbcTemplate);
92
		when(jdbcTemplateFactory.createJdbcTemplate(DB)).thenReturn(jdbcTemplate);
93

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

    
96
		for (int i = 0; i < 4; i++) {
97
			RESULTS.add(MAP);
98
		}
99

    
100
		when(jdbcTemplate.queryForList(QUERY)).thenReturn(RESULTS);
101
		when(jdbcTemplate.queryForList("SELECT * FROM " + TABLE)).thenReturn(Arrays.asList(MAP, MAP, MAP));
102

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

    
108
		when(dataSourceFactory.createDataSource(anyString())).thenReturn(dataSource);
109
		//when(jdbcTemplate.getDataSource()).thenReturn(dataSource);
110

    
111
		when(transactionTemplateFactory.createTransactionTemplate(dataSource)).thenReturn(transactionTemplate);
112

    
113
	}
114

    
115
	@Test
116
	public void testListCommonDBTables() throws Exception {
117
		dbUtils.listCommonDBTables(DB);
118
		verify(jdbcTemplateFactory).createJdbcTemplate(DB);
119
		verify(jdbcTemplate).queryForList(
120
				"SELECT table_name FROM information_schema.tables WHERE table_schema = 'public' AND table_type != 'VIEW' AND table_name NOT LIKE '%_log'",
121
				String.class);
122
	}
123

    
124
	@Test
125
	public void testListCommonDBViews() throws Exception {
126
		dbUtils.listCommonDBViews(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
	@Ignore
134
	@Test
135
	public void testListAllDatabases() throws Exception {
136
		dbUtils.listAllDatabases();
137
		verify(jdbcTemplateFactory).createJdbcTemplate(DEFAULT_DB);
138
		verify(jdbcTemplate).queryForList("SELECT datname FROM pg_database WHERE datname LIKE '" + DB_PREFIX + "%'", String.class);
139
	}
140

    
141
	@Test
142
	public void testGetTypedListFromSql() throws Exception {
143
		List<Integer> list = dbUtils.getTypedListFromSql(DB, QUERY, Integer.class);
144
		verify(jdbcTemplateFactory).createJdbcTemplate(DB);
145
		verify(jdbcTemplate).queryForList(QUERY, Integer.class);
146
		assertEquals(4, list.size());
147
	}
148

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

    
157
	@Test
158
	public void testExecuteSql() throws Exception {
159
		dbUtils.executeSql(DB, QUERY, null);
160
		verify(jdbcTemplateFactory).createJdbcTemplate(DB);
161
		verify(jdbcTemplate).update(QUERY);
162
	}
163

    
164
	@Test
165
	public void testDescribeTable() throws Exception {
166
		List<Map<?, ?>> res = dbUtils.describeTable(DB, TABLE);
167
		verify(jdbcTemplateFactory).createJdbcTemplate(DB);
168
		assertEquals(3, res.size());
169
		assertEquals(3, res.get(0).size());
170
		assertEquals(3, res.get(1).size());
171
		assertEquals(3, res.get(2).size());
172
	}
173

    
174
	@Test
175
	public void testDumpTableAsXML() throws Exception {
176
		String xml = dbUtils.dumpTableAsXML(DB, TABLE);
177

    
178
		verify(jdbcTemplateFactory).createJdbcTemplate(DB);
179
		assertNotNull(xml);
180
		assertTrue(xml.contains(TABLE));
181
		assertTrue(xml.contains(DB));
182
		assertTrue(xml.contains("ROW"));
183
	}
184

    
185
	@Test
186
	public void testDumpTableAsList() throws Exception {
187
		List<Document> list = dbUtils.dumpTableAsList(DB, TABLE);
188

    
189
		verify(jdbcTemplateFactory).createJdbcTemplate(DB);
190
		verify(jdbcTemplate).queryForList("SELECT * FROM " + TABLE);
191
		assertTrue(list.size() > 0);
192
	}
193

    
194
	@Test
195
	public void testGetRowByResourceId() throws Exception {
196
		dbUtils.getRowByResourceId(DB, TABLE, RESOURCE_ID);
197
		verify(jdbcTemplateFactory).createJdbcTemplate(DB);
198
		verify(jdbcTemplate).queryForMap("SELECT * FROM " + TABLE + " WHERE " + DatabaseUtils.DNET_RESOURCE_ID_FIELD + "=?", new Object[] { RESOURCE_ID });
199
	}
200

    
201
	@SuppressWarnings({ "unchecked", "rawtypes" })
202
	@Test
203
	public void testImportFromIterable() throws Exception {
204
		List<String> iterable = Lists.newArrayList("<ROWS><ROW table='t1' /></ROWS>", "<ROWS><ROW table='t2' /></ROWS>");
205

    
206
		GenericRow row1 = new GenericRow("1", TABLE, MAP, true);
207
		GenericRow row2 = new GenericRow("2", TABLE, MAP, false);;
208

    
209
		when(transactionTemplate.execute((TransactionCallback) anyObject())).thenReturn(Lists.newArrayList(row1, row2, row1, row2));
210

    
211
		dbUtils.importFromIterable(DB, iterable);
212

    
213
		verify(jdbcTemplateFactory).createJdbcTemplate(dataSource);
214
		verify(transactionTemplateFactory).createTransactionTemplate(dataSource);
215

    
216
		verify(transactionTemplate, times(1)).execute((TransactionCallback) anyObject());
217
	}
218

    
219
	@Test
220
	public void testDeleteRowByResourceId() throws Exception {
221
		dbUtils.deleteRowByResourceId(DB, TABLE, RESOURCE_ID);
222
		verify(jdbcTemplateFactory).createJdbcTemplate(DB);
223
		verify(jdbcTemplate).update("DELETE FROM " + TABLE + " WHERE " + DatabaseUtils.DNET_RESOURCE_ID_FIELD + "=?", new Object[] { RESOURCE_ID });
224
	}
225

    
226
	@Test
227
	public void testClearTable() throws Exception {
228
		dbUtils.clearTable(DB, TABLE);
229
		verify(jdbcTemplateFactory).createJdbcTemplate(DB);
230
		verify(jdbcTemplate).update("DELETE FROM " + TABLE);
231
	}
232

    
233
	@Ignore
234
	@SuppressWarnings("unchecked")
235
	@Test
236
	public void testPrepareManagementOfTable() throws Exception {
237
		when(jdbcTemplate.queryForObject(anyString(), any(Class.class), (Object[]) anyObject())).thenReturn(1);
238

    
239
		dbUtils.prepareManagementOfTable(DB, TABLE);
240
		verify(jdbcTemplateFactory, atLeastOnce()).createJdbcTemplate(DB);
241
		verify(jdbcTemplate, atLeastOnce()).queryForObject(anyString(), Integer.class, (Object[]) anyObject());
242
		verify(jdbcTemplate, never()).update(anyString());
243
	}
244

    
245
	@Ignore
246
	@SuppressWarnings("unchecked")
247
	@Test
248
	public void testPrepareManagementOfTable_2() throws Exception {
249
		when(jdbcTemplate.queryForObject(anyString(), any(Class.class), (Object[]) anyObject())).thenReturn(0);
250

    
251
		dbUtils.prepareManagementOfTable(DB, TABLE);
252
		verify(jdbcTemplateFactory, atLeastOnce()).createJdbcTemplate(DB);
253
		verify(jdbcTemplate, atLeastOnce()).queryForObject(anyString(), Integer.class, (Object[]) anyObject());
254
		verify(jdbcTemplate, atLeastOnce()).update(anyString());
255
	}
256

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

    
263
		dbUtils.removeManagementOfTable(DB, TABLE);
264
		verify(jdbcTemplateFactory, atLeastOnce()).createJdbcTemplate(DB);
265

    
266
		verify(jdbcTemplate, never()).update(anyString());
267
	}
268

    
269
	@Ignore
270
	@Test
271
	public void testClearManagementOfTable_2() throws Exception {
272
		when(jdbcTemplate.queryForObject(anyString(), any(Class.class), (Object[]) anyObject())).thenReturn(1);
273
		dbUtils.removeManagementOfTable(DB, TABLE);
274
		verify(jdbcTemplateFactory, atLeastOnce()).createJdbcTemplate(DB);
275

    
276
		verify(jdbcTemplate, atLeastOnce()).update(anyString());
277
	}
278

    
279
	@Test
280
	public void testParseDate() throws Exception {
281
		Date d = dbUtils.parseDate("31-05-2011", "dd-MM-yyyy");
282
		assertEquals("2011-05-31", d.toString());
283
	}
284

    
285
	@Test
286
	public void testEscape() throws Exception {
287
		Map<String, String> m = Maps.newHashMap();
288

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

    
292
		Document doc = dbUtils.rowToDocument(m);
293
		assertNotNull(doc);
294

    
295
		Document doc2 = DocumentHelper.createDocument();
296
		Element elem = doc2.addElement("a");
297
		elem.setText(doc.asXML());
298
		doc2.setRootElement(elem);
299

    
300
		String tempXML = doc2.asXML();
301

    
302
		SAXReader reader = new SAXReader();
303
		Document doc3 = reader.read(new StringReader(tempXML));
304

    
305
		System.out.println(doc.asXML());;
306
		System.out.println(doc3.getRootElement().getText());;
307

    
308
		assertEquals(doc.asXML(), doc3.getRootElement().getText());
309

    
310
	}
311

    
312
	@Test
313
	public void testParseBoolean() throws Exception {
314
		assertEquals(dbUtils.parseBoolean("TRUE"), true);
315
		assertEquals(dbUtils.parseBoolean("true"), true);
316
		assertEquals(dbUtils.parseBoolean("T"), true);
317
		assertEquals(dbUtils.parseBoolean("Yes"), true);
318
		assertEquals(dbUtils.parseBoolean("false"), false);
319
		assertEquals(dbUtils.parseBoolean("F"), false);
320
		assertEquals(dbUtils.parseBoolean("No"), false);
321
		assertEquals(dbUtils.parseBoolean("N/A"), false);
322
		assertEquals(dbUtils.parseBoolean("XYZ"), false);
323
	}
324
}
(1-1/2)