package com.dbdeploy.database; import com.dbdeploy.ChangeScriptApplier; import com.dbdeploy.Controller; import com.dbdeploy.appliers.TemplateBasedApplier; import com.dbdeploy.database.changelog.DatabaseSchemaVersionManager; import com.dbdeploy.exceptions.SchemaVersionTrackingException; import com.dbdeploy.scripts.ChangeScript; import com.dbdeploy.scripts.ChangeScriptRepository; import com.dbdeploy.scripts.StubChangeScript; import org.junit.Test; import java.io.*; import java.util.Arrays; import java.util.Collections; import java.util.List; import static org.junit.Assert.assertEquals; public class ScriptGenerationTest { @Test public void generateConsolidatedChangesScriptForAllDatabasesAndCompareAgainstTemplate() throws Exception { for (String syntax : Arrays.asList("hsql", "mssql", "mysql", "ora", "syb-ase", "db2", "pgsql")) { try { System.out.printf("Testing syntax %s\n", syntax); runIntegratedTestAndConfirmOutputResults(syntax); } catch (Exception e) { throw new RuntimeException("Failed while testing syntax " + syntax, e); } } } private void runIntegratedTestAndConfirmOutputResults(String syntaxName) throws Exception { StringWriter writer = new StringWriter(); ChangeScript changeOne = new StubChangeScript(1, "001_change.sql", "-- contents of change script 1"); ChangeScript changeTwo = new StubChangeScript(2, "002_change.sql", "-- contents of change script 2"); List<ChangeScript> changeScripts = Arrays.asList(changeOne, changeTwo); ChangeScriptRepository changeScriptRepository = new ChangeScriptRepository(changeScripts); final StubSchemaManager schemaManager = new StubSchemaManager(); ChangeScriptApplier applier = new TemplateBasedApplier(writer, syntaxName, "changelog", ";", DelimiterType.normal, null); Controller controller = new Controller(changeScriptRepository, schemaManager, applier, null); controller.processChangeScripts(Long.MAX_VALUE); assertEquals(readExpectedFileContents(getExpectedFilename(syntaxName)), writer.toString()); } private String getExpectedFilename(String dbSyntaxName) { return dbSyntaxName + "_expected.sql"; } private String readExpectedFileContents(String expectedFilename) throws IOException { final InputStream stream = getClass().getResourceAsStream(expectedFilename); BufferedReader reader = new BufferedReader(new InputStreamReader(stream)); try { return readEntireStreamIntoAStringWithConversionToSystemDependantLineTerminators(reader); } finally { reader.close(); } } private String readEntireStreamIntoAStringWithConversionToSystemDependantLineTerminators(BufferedReader reader) throws IOException { StringWriter contentWithSystemDependentLineTerminators = new StringWriter(); PrintWriter newLineConvertingContentWriter = new PrintWriter(contentWithSystemDependentLineTerminators); try { String line; while ((line = reader.readLine()) != null) { newLineConvertingContentWriter.println(line); } newLineConvertingContentWriter.flush(); return contentWithSystemDependentLineTerminators.toString(); } finally { newLineConvertingContentWriter.close(); } } private class StubSchemaManager extends DatabaseSchemaVersionManager { public StubSchemaManager() { super(null, "changelog"); } @Override public List<Long> getAppliedChanges() throws SchemaVersionTrackingException { return Collections.emptyList(); } } }