package liquibase; import liquibase.database.Database; import liquibase.database.DatabaseConnection; import liquibase.database.DatabaseFactory; import liquibase.database.core.MSSQLDatabase; import liquibase.database.core.OracleDatabase; import liquibase.database.core.PostgresDatabase; import liquibase.exception.DatabaseException; import liquibase.exception.LiquibaseException; import liquibase.resource.ClassLoaderResourceAccessor; import liquibase.resource.ResourceAccessor; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.expectLastCall; import static org.easymock.classextension.EasyMock.*; import static org.junit.Assert.*; import org.junit.Before; import org.junit.Test; import java.io.InputStream; import java.net.URL; import java.sql.DatabaseMetaData; import java.util.Enumeration; import java.util.List; /** * Tests for {@link liquibase.Liquibase} */ public class LiquibaseTest { private TestLiquibase testLiquibase; private DatabaseConnection connectionForConstructor; @Before public void setUp() throws Exception { if (connectionForConstructor != null) { reset(connectionForConstructor); } connectionForConstructor = createMock(DatabaseConnection.class); connectionForConstructor.setAutoCommit(false); expectLastCall().atLeastOnce(); DatabaseMetaData metaData = createMock(DatabaseMetaData.class); expect(metaData.getDatabaseProductName()).andReturn("Oracle"); replay(metaData); // expect(connectionForConstructor.getMetaData()).andReturn(metaData); replay(connectionForConstructor); testLiquibase = new TestLiquibase(); } //todo: reintroduce @Test // public void isSaveToRunMigration() throws Exception { // TestLiquibase liquibase = testLiquibase; // // // curiously setting the database of mock liquibase // Database database = testLiquibase.getDatabase(); // // liquibase.setUrl("jdbc:oracle:thin:@localhost:1521:latest"); // assertTrue(liquibase.isSafeToRunMigration()); // // liquibase.setUrl("jdbc:oracle:thin:@liquibase:1521:latest"); // assertFalse(liquibase.isSafeToRunMigration()); // // ExecutorService.getInstance().setWriteExecutor(database, new LoggingExecutor(new PrintWriter(System.out), database)); // assertTrue("Safe to run if outputing sql, even if non-localhost URL", liquibase.isSafeToRunMigration()); // // } /* @Test public void testBlosDocumentation() throws Exception { testLiquibase.generateDocumentation("."); } */ @Test public void getImplementedDatabases() throws Exception { List<Database> databases = DatabaseFactory.getInstance().getImplementedDatabases(); assertTrue(databases.size() > 15); boolean foundOracle = false; boolean foundPostgres = false; boolean foundMSSQL = false; for (Database db : databases) { if (db instanceof OracleDatabase) { foundOracle = true; } else if (db instanceof PostgresDatabase) { foundPostgres = true; } else if (db instanceof MSSQLDatabase) { foundMSSQL = true; } } assertTrue("Oracle not in Implemented Databases", foundOracle); assertTrue("MSSQL not in Implemented Databases", foundMSSQL); assertTrue("Postgres not in Implemented Databases", foundPostgres); } private class TestLiquibase extends Liquibase { private String url; // instead use super.database //private Database database; private InputStream inputStream; public TestLiquibase() throws LiquibaseException { super("liquibase/test.xml", new ClassLoaderResourceAccessor(), ((Database) null)); inputStream = createMock(InputStream.class); replay(inputStream); } @Override public Database getDatabase() { if (database == null) { database = new OracleDatabase() { }; } return database; } public void setDatabase(Database database) { this.database = database; } @SuppressWarnings("unused") public Database[] getImplementedDatabases() { Database mockDatabase = createMock(Database.class); try { expect(mockDatabase.isCorrectDatabaseImplementation(null)).andReturn(true).atLeastOnce(); mockDatabase.setConnection((DatabaseConnection) null); expectLastCall(); expect(mockDatabase.getConnection()).andReturn(connectionForConstructor); replay(mockDatabase); return new Database[]{ mockDatabase, }; } catch (DatabaseException e) { throw new RuntimeException(e); } } public void setUrl(String url) { this.url = url; } @Override public ResourceAccessor getFileOpener() { return new ResourceAccessor() { public InputStream getResourceAsStream(String file) { return inputStream; } public Enumeration<URL> getResources(String packageName) { return null; } public ClassLoader toClassLoader() { return null; } }; } } }