package liquibase.database; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.util.ArrayList; import java.util.List; import liquibase.change.core.CreateTableChange; import liquibase.executor.ExecutorService; import liquibase.sdk.executor.MockExecutor; import liquibase.sql.visitor.AppendSqlVisitor; import liquibase.sql.visitor.SqlVisitor; import liquibase.statement.SqlStatement; import liquibase.statement.core.CreateTableStatement; import liquibase.statement.core.DropTableStatement; import liquibase.structure.core.Table; import org.junit.Test; /** * Base test class for database-specific tests */ public abstract class AbstractJdbcDatabaseTest { protected AbstractJdbcDatabase database; protected AbstractJdbcDatabaseTest(AbstractJdbcDatabase database) throws Exception { this.database = database; } public AbstractJdbcDatabase getDatabase() { return database; } protected abstract String getProductNameString(); public abstract void supportsInitiallyDeferrableColumns(); public abstract void getCurrentDateTimeFunction(); // @Test // public void onlyAdjustAutoCommitOnMismatch() throws Exception { // // Train expectations for setConnection(). If getAutoCommit() returns the same value the Database wants, based // // on getAutoCommitMode(), it should _not_ call setAutoCommit(boolean) on the connection // DatabaseConnection connection = createStrictMock(DatabaseConnection.class); // expect(connection.getConnectionUserName()).andReturn("user").anyTimes(); // expect(connection.getURL()).andReturn("URL"); // expect(connection.getAutoCommit()).andReturn(getDatabase().getAutoCommitMode()); // replay(connection); // getDatabase().setConnection(connection); // verify(connection); // // // Reset the mock and train expectations for close(). Since the auto-commit mode was not adjusted while setting // // the connection, it should not be adjusted on close() either // reset(connection); // connection.close(); // replay(connection); // // getDatabase().close(); // verify(connection); // } @Test public void defaultsWorkWithoutAConnection() { database.getDatabaseProductName(); database.getDefaultCatalogName(); database.getDefaultSchemaName(); database.getDefaultPort(); } // @Test // public void isCorrectDatabaseImplementation() throws Exception { // assertTrue(getDatabase().isCorrectDatabaseImplementation(getMockConnection())); // } // protected DatabaseConnection getMockConnection() throws Exception { // DatabaseConnection conn = createMock(DatabaseConnection.class); //// DatabaseMetaData metaData = createMock(DatabaseMetaData.class); // conn.setAutoCommit(false); // // expectLastCall().anyTimes(); //// expect(((JdbcConnection) conn).getUnderlyingConnection().getMetaData()).andReturn(metaData).anyTimes(); // expect(conn.getDatabaseProductName()).andReturn(getProductNameString()).anyTimes(); // replay(conn); //// replay(metaData); // return conn; // } @Test public void escapeTableName_noSchema() { Database database = getDatabase(); assertEquals("tableName", database.escapeTableName(null, null, "tableName")); } @Test public void escapeTableName_withSchema() { Database database = getDatabase(); if (database.supportsCatalogInObjectName(Table.class)) { assertEquals("catalogName.schemaName.tableName", database.escapeTableName("catalogName", "schemaName", "tableName")); } else { assertEquals("schemaName.tableName", database.escapeTableName("catalogName", "schemaName", "tableName")); } } @Test public void executeRollbackStatements_WithStatementsOverload_ShouldNotIncludeAppendTextFromApplyToRollbackFalseVisitor() throws Exception { Database database = getDatabase(); final MockExecutor mockExecutor = new MockExecutor(); ExecutorService.getInstance().setExecutor(database, mockExecutor); final List<SqlVisitor> sqlVisitors = new ArrayList<SqlVisitor>(); final SqlStatement dropTableStatement = new DropTableStatement(null, null, "test_table", false); final AppendSqlVisitor appendSqlVisitor = new AppendSqlVisitor(); appendSqlVisitor.setApplyToRollback(false); appendSqlVisitor.setValue(" SHOULD NOT BE APPENDED"); sqlVisitors.add(appendSqlVisitor); database.executeRollbackStatements(new SqlStatement[] {dropTableStatement}, sqlVisitors); assertEquals("DROP TABLE test_table;", mockExecutor.getRanSql().trim()); } @Test public void executeRollbackStatements_WithStatementsOverload_ShouldIncludeAppendTextFromApplyToRollbackTrueVisitor() throws Exception { Database database = getDatabase(); final MockExecutor mockExecutor = new MockExecutor(); ExecutorService.getInstance().setExecutor(database, mockExecutor); final List<SqlVisitor> sqlVisitors = new ArrayList<SqlVisitor>(); final SqlStatement dropTableStatement = new DropTableStatement(null, null, "test_table", false); final AppendSqlVisitor appendSqlVisitor = new AppendSqlVisitor(); appendSqlVisitor.setApplyToRollback(true); appendSqlVisitor.setValue(" SHOULD BE APPENDED"); sqlVisitors.add(appendSqlVisitor); database.executeRollbackStatements(new SqlStatement[] {dropTableStatement}, sqlVisitors); assertEquals("DROP TABLE test_table SHOULD BE APPENDED;", mockExecutor.getRanSql().trim()); } @Test public void executeRollbackStatements_WithChangeOverload_ShouldNotIncludeAppendTextFromApplyToRollbackFalseVisitor() throws Exception { Database database = getDatabase(); final MockExecutor mockExecutor = new MockExecutor(); ExecutorService.getInstance().setExecutor(database, mockExecutor); final List<SqlVisitor> sqlVisitors = new ArrayList<SqlVisitor>(); final CreateTableChange change = new CreateTableChange(); change.setTableName("test_table"); final AppendSqlVisitor appendSqlVisitor = new AppendSqlVisitor(); appendSqlVisitor.setApplyToRollback(false); appendSqlVisitor.setValue(" SHOULD NOT BE APPENDED"); sqlVisitors.add(appendSqlVisitor); database.executeRollbackStatements(change, sqlVisitors); assertEquals("DROP TABLE test_table;", mockExecutor.getRanSql().trim()); } @Test public void executeRollbackStatements_WithChangeOverload_ShouldIncludeAppendTextFromApplyToRollbackTrueVisitor() throws Exception { Database database = getDatabase(); final MockExecutor mockExecutor = new MockExecutor(); ExecutorService.getInstance().setExecutor(database, mockExecutor); final List<SqlVisitor> sqlVisitors = new ArrayList<SqlVisitor>(); final CreateTableChange change = new CreateTableChange(); change.setTableName("test_table"); final AppendSqlVisitor appendSqlVisitor = new AppendSqlVisitor(); appendSqlVisitor.setApplyToRollback(true); appendSqlVisitor.setValue(" SHOULD BE APPENDED"); sqlVisitors.add(appendSqlVisitor); database.executeRollbackStatements(change, sqlVisitors); assertEquals("DROP TABLE test_table SHOULD BE APPENDED;", mockExecutor.getRanSql().trim()); } // @Test // public void getColumnType_javaTypes() throws SQLException { // Database database = getDatabase(); // DatabaseConnection connection = database.getConnection(); // if (connection != null) { // ((JdbcConnection) connection).getUnderlyingConnection().rollback(); // assertEquals(database.getDateType().getDataTypeName().toUpperCase(), database.getDataType("java.sql.Types.DATE", false).toUpperCase()); // assertEquals(database.getBooleanType().getDataTypeName().toUpperCase(), database.getDataType("java.sql.Types.BOOLEAN", false).toUpperCase()); // assertEquals("VARCHAR(255)", database.getDataType("java.sql.Types.VARCHAR(255)", false).toUpperCase().replaceAll("VARCHAR2", "VARCHAR")); // } // } }