package org.javalite.db_migrator; import org.javalite.db_migrator.mock.MockConnection; import org.junit.After; import org.junit.Before; import org.junit.Test; import java.io.File; import java.util.List; import static org.javalite.common.Util.readResource; import static org.javalite.db_migrator.DbUtils.attach; import static org.javalite.db_migrator.DbUtils.detach; import static org.javalite.test.jspec.JSpec.a; public class MigrationSpec { MockConnection connection; @Before public void before() { connection = new MockConnection(); attach(connection); } @After public void after(){ detach(); } @Test public void shouldBatchSimpleCommands() throws Exception { Migration m = new Migration("123", new File("src/test/resources/sql/simple.sql")); m.migrate(null); List statements = getStatements(); a(statements.size()).shouldBeEqual(2); shouldBeEqual(statements.get(0), "/expected/create_users.sql"); shouldBeEqual(statements.get(1), "/expected/alter_users.sql"); } private List getStatements() { return connection.getExecutedStatements(); } @Test public void shouldHandleComplexCommands() throws Exception { Migration m = new Migration("123", new File("src/test/resources/sql/complex.sql")); m.migrate(null); List statements = getStatements(); a(statements.size()).shouldBeEqual(1); shouldBeEqual(statements.get(0), "/expected/dav_file.sql"); } @Test public void shouldBatchMySQLFunctionsAndProcedures() throws Exception { Migration m = new Migration("123", new File("src/test/resources/sql/stored-procedure-mysql.sql")); m.migrate(null); List statements = getStatements(); a(statements.size()).shouldBeEqual(3); a(statements.get(0)).shouldBeEqual("CREATE FUNCTION hello (s CHAR(20)) RETURNS CHAR(50) DETERMINISTIC RETURN CONCAT('Hello, ',s,'!')"); shouldBeEqual(statements.get(1), "/expected/weighted_average.sql"); shouldBeEqual(statements.get(1), "/expected/weighted_average.sql"); shouldBeEqual(statements.get(2), "/expected/payment.sql"); } @Test public void shouldBatchPostgresFunctionsAndProcedures() throws Exception { Migration m = new Migration("123", new File("src/test/resources/sql/stored-procedure-postgresql.sql")); m.migrate(null); List statements = getStatements(); a(statements.size()).shouldBeEqual(4); shouldBeEqual(statements.get(0), "/expected/getQtyOrders.sql"); shouldBeEqual(statements.get(1), "/expected/one.sql"); shouldBeEqual(statements.get(2), "/expected/emp_stamp.sql"); a(statements.get(3).toString().trim()).shouldBeEqual("SELECT one();".trim()); } @Test public void shouldUseTheSameDelimiterUntilExplicitlyChanged() throws Exception { Migration m = new Migration("123", new File("src/test/resources/sql/function-mysql.sql")); m.migrate(null); List statements = getStatements(); a(statements.size()).shouldBeEqual(3); shouldBeEqual(statements.get(0), "/expected/drop_simple.sql"); shouldBeEqual(statements.get(1), "/expected/simpleFunction.sql"); shouldBeEqual(statements.get(2), "/expected/selectSimpleFunction.sql"); } @Test public void shouldExecuteLastStatementWhenDelimiterIsMissing() throws Exception { Migration m = new Migration("123", new File("src/test/resources/sql/missing-last-deliminator.sql")); m.migrate(null); List statements = getStatements(); a(statements.size()).shouldBeEqual(2); shouldBeEqual(statements.get(0), "/expected/create_users.sql"); shouldBeEqual(statements.get(1), "/expected/roles.sql"); } private void shouldBeEqual(Object operand1, String resourceName){ a(stripNL(operand1)).shouldBeEqual(stripNL(readResource(resourceName))); } private String stripNL(Object in){ return in.toString().trim().replace("\n", "").replace("\r", ""); } }