package org.jcommons.db.load; import static org.jcommons.db.junit.DataSourceFactory.createMemoryDataSource; import static org.jcommons.lang.clazz.ClassUtils.getPackagePath; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.fail; import java.io.File; import java.sql.SQLException; import java.util.*; import org.apache.commons.dbutils.QueryRunner; import org.jcommons.db.column.ColumnDataProvider; import org.jcommons.db.jdbc.QueryUtils; import org.jcommons.db.load.meta.MetaTable; import org.jcommons.io.sheet.Book; import org.jcommons.io.sheet.Sheet; import org.jcommons.io.text.reader.csv.CsvBookReader; import org.jcommons.message.Message; import org.junit.*; /** * Checks if we can load multiple sheets into the database. * * @author Thorsten Goeckeler */ public class DatabaseLoaderTest { private static final String ROOT = getPackagePath(DatabaseLoaderTest.class, "./test"); private static final List<String> TABLES = new ArrayList<String>(); private static final Map<String, String> CREATE = new HashMap<String, String>(); static { TABLES.add("language"); TABLES.add("roles"); TABLES.add("role_name"); CREATE.put("language", "language_id integer not null, name varchar(40) not null"); CREATE.put("roles", "role_id integer not null, name varchar(40) not null"); CREATE.put("role_name", "role_id integer not null, language_id integer not null, name varchar(40) not null"); } /** * setup database * * @throws SQLException if table cannot be created */ @BeforeClass public static void createTables() throws SQLException { QueryRunner query = new QueryRunner(createMemoryDataSource()); for (String table : TABLES) { StringBuilder sql = new StringBuilder("create table "); sql.append(table).append(" ( ").append(CREATE.get(table)).append(" )"); query.update(sql.toString()); } } /** * tear down database * * @throws SQLException if table cannot be dropped */ @AfterClass public static void dropTables() throws SQLException { QueryRunner query = new QueryRunner(createMemoryDataSource()); List<String> drops = new ArrayList<String>(TABLES); Collections.reverse(drops); for (String table : drops) { query.update("drop table " + table); } } /** * test the database load * * @throws SQLException if table cannot be imported */ @Test public void testLoad() throws SQLException { try { DatabaseLoader load = new DatabaseLoader().setDataSource(createMemoryDataSource()); CsvBookReader reader = new CsvBookReader(); for (String table : TABLES) { reader.addFile(new File(ROOT, table + ".csv")); } Book book = reader.read(); book.setName("roles"); load.load(book); } catch (SQLException ex) { ex.printStackTrace(); fail("Could not execute database load due to:" + ex.getMessage()); } assertEquals(2, QueryUtils.countRows(createMemoryDataSource(), "language")); assertEquals(3, QueryUtils.countRows(createMemoryDataSource(), "roles")); assertEquals(6, QueryUtils.countRows(createMemoryDataSource(), "role_names")); } /** * test that invalid files are recognized * * @throws SQLException if table cannot be imported */ @Test public void testColumnValidation() throws SQLException { try { CsvBookReader reader = new CsvBookReader().addFile(new File(ROOT, "language_miss.csv")); Book book = reader.read(); book.setName("language"); assertEquals(1, book.getSheets().size()); Sheet sheet = book.getSheet("language_miss"); assertNotNull(sheet); sheet.setName("language"); ColumnDataProvider dataProvider = new ColumnDataProvider(); sheet.setDataProvider(dataProvider); dataProvider.setTable(sheet.getName()); dataProvider.setMetaColumns(MetaTable.getMetaData(createMemoryDataSource(), sheet.getName())); dataProvider.setHeaders(sheet.getTable().getColumns().toArray(new String[0])); Message errors = dataProvider.validateTable(); assertFalse(errors.isEmpty()); assertEquals(2, errors.getTexts().size()); SheetLoader loader = new SheetLoader().setDataSource(createMemoryDataSource()); try { loader.load(sheet); } catch (SQLException ex) { ex.printStackTrace(); fail("Column validation did not work in sheet loader, see: " + ex.getMessage()); } } catch (SQLException ex) { ex.printStackTrace(); fail("Could not execute database load due to:" + ex.getMessage()); } } }