package liquibase.changelog;
import liquibase.database.OfflineConnection;
import liquibase.database.core.HsqlDatabase;
import liquibase.executor.ExecutorService;
import liquibase.executor.LoggingExecutor;
import liquibase.resource.ClassLoaderResourceAccessor;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import java.io.File;
import java.io.StringWriter;
import java.io.Writer;
import java.net.URISyntaxException;
import java.net.URL;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
/**
* @see https://liquibase.jira.com/browse/CORE-2334
*/
public class OfflineChangeLogHistoryServiceTest {
@Rule
public TemporaryFolder temporaryFolder = new TemporaryFolder();
private File getResourceAsFile(String resourceName) {
URL resourceUrl = getClass().getResource(resourceName);
if (resourceUrl == null) {
throw new IllegalArgumentException("Resource "+resourceName+" not found for class "+getClass().getName());
}
try {
return new File(resourceUrl.toURI());
} catch (URISyntaxException e) {
return new File(resourceUrl.getPath());
}
}
/**
* Test ChangeLog table update SQL generation with outputLiquibaseSql=true and outputLiquibaseSql=true
*/
@Test
public void testInitOfflineWithOutputLiquibaseSql() throws Exception {
// Given
StringWriter writer = new StringWriter();
OfflineChangeLogHistoryService service = createService(writer, "true");
ChangeSet changeSet = createChangeSet();
// When
service.init();
service.setExecType(changeSet, ChangeSet.ExecType.EXECUTED);
writer.close();
// Assert
assertTrue(writer.toString().contains("CREATE TABLE PUBLIC.DATABASECHANGELOG"));
assertTrue(writer.toString().contains("INSERT INTO PUBLIC.DATABASECHANGELOG"));
}
/**
* Test ChangeLog table update SQL generation with outputLiquibaseSql=true and outputLiquibaseSql=data_only
*/
@Test
public void testInitOfflineWithOutputLiquibaseSqlAndNoDdl() throws Exception {
// Given
StringWriter writer = new StringWriter();
OfflineChangeLogHistoryService service = createService(writer, "data_only");
ChangeSet changeSet = createChangeSet();
// When
service.init();
service.setExecType(changeSet, ChangeSet.ExecType.EXECUTED);
writer.close();
// Assert
assertFalse(writer.toString().contains("CREATE TABLE PUBLIC.DATABASECHANGELOG"));
assertTrue(writer.toString().contains("INSERT INTO PUBLIC.DATABASECHANGELOG"));
}
/**
* Create OfflineChangeLogHistoryService and register LoggingExecutor
*/
private OfflineChangeLogHistoryService createService(Writer writer, String outputLiquibaseSql) {
HsqlDatabase database = new HsqlDatabase();
File changeLogCsvFile = new File(temporaryFolder.getRoot(), "changeLog.csv");
OfflineConnection connection = new OfflineConnection("offline:hsqldb?changeLogFile="+changeLogCsvFile.getAbsolutePath()+"&outputLiquibaseSql="+outputLiquibaseSql, new ClassLoaderResourceAccessor());
database.setConnection(connection);
connection.attached(database);
OfflineChangeLogHistoryService changeLogHistoryService = (OfflineChangeLogHistoryService) ChangeLogHistoryServiceFactory.getInstance().getChangeLogService(database);
LoggingExecutor loggingExecutor = new LoggingExecutor(ExecutorService.getInstance().getExecutor(database), writer, database);
ExecutorService.getInstance().setExecutor(database, loggingExecutor);
return changeLogHistoryService;
}
/**
* Create ChangeLog and ChangeSet
*/
private ChangeSet createChangeSet() {
DatabaseChangeLog databaseChangeLog = new DatabaseChangeLog("/patch/changeLog.xml");
ChangeSet changeSet = new ChangeSet("id", "author", false, false, "/path/changeSet.xml", "", "", databaseChangeLog);
databaseChangeLog.addChangeSet(changeSet);
return changeSet;
}
}