package liquibase.change.core;
import liquibase.change.AbstractChangeTest;
import liquibase.change.AbstractSQLChange;
import liquibase.change.Change;
import liquibase.database.Database;
import liquibase.database.core.MockDatabase;
import liquibase.database.core.OracleDatabase;
import liquibase.exception.SetupException;
import liquibase.resource.ClassLoaderResourceAccessor;
import static org.junit.Assert.*;
import liquibase.statement.SqlStatement;
import liquibase.util.StringUtils;
import org.junit.Before;
import org.junit.Test;
import java.io.File;
import java.lang.reflect.Field;
import java.util.Map;
/**
* Tests the SQL File with a simple text file. No real SQL is used with the
* tests.
*
* @author <a href="mailto:csuml@yahoo.co.uk">Paul Keeble</a>
*
*/
public class SQLFileChangeTest extends AbstractChangeTest {
private SQLFileChange change;
private String fileName;
@Before
public void setUp() throws Exception {
//file contains contents "TESTDATA"
fileName= "liquibase/change/core/SQLFileTestData.sql";
change = new SQLFileChange();
change.setSql("select * from tablename");
ClassLoaderResourceAccessor opener = new ClassLoaderResourceAccessor();
change.setResourceAccessor(opener);
change.setPath(fileName);
change.init();
}
@Override
public void generateStatement() throws Exception {
}
@Test
public void multilineComment2() {
String original = "--\r\n"+
"-- This is a comment\r\n" +
"UPDATE tablename SET column = 1;\r\n" +
"GO";
SQLFileChange change = new SQLFileChange();
change.setSql(original);
change.setSplitStatements(true);
change.setStripComments(true);
SqlStatement[] out = change.generateStatements(new MockDatabase());
assertEquals(2, out.length);
assertEquals("UPDATE tablename SET column = 1", out[0].toString());
}
@Test
public void setFileOpener() {
assertNotNull(change.getResourceAccessor());
}
// @Test
// public void generateStatement() throws Exception {
// assertEquals(fileName,change.getPath());
//
// OracleDatabase database = new OracleDatabase();
// assertEquals("TESTDATA",change.generateStatements(database)[0].getSqlStatement(database));
//
// assertEquals(MD5Util.computeMD5(change.getSql()), change.generateCheckSum());
// }
@Test
public void generateStatementFileNotFound() throws Exception {
try {
change.setPath("doesnotexist.sql");
change.init();
change.generateStatements(new OracleDatabase());
fail("The file does not exist so should not be found");
} catch(SetupException fnfe) {
//expected
}
}
// @Test
// public void multiLineSQLFileSemiColon() throws Exception {
// SQLFileChange change2 = new SQLFileChange();
// change2.setSql("SELECT * FROM customer;" + StreamUtil.getLineSeparator() +
// "SELECT * from table;" + StreamUtil.getLineSeparator() +
// "SELECT * from table2;" + StreamUtil.getLineSeparator());
// OracleDatabase database = new OracleDatabase();
// SqlStatement[] statements = change2.generateStatements(database);
//
// assertEquals(3,statements.length);
// assertEquals("SELECT * FROM customer",statements[0].getSqlStatement(database));
// assertEquals("SELECT * from table",statements[1].getSqlStatement(database));
// assertEquals("SELECT * from table2",statements[2].getSqlStatement(database));
// }
// @Test
// public void singleLineEndInSemiColon() throws Exception {
// SQLFileChange change2 = new SQLFileChange();
// change2.setSql("SELECT * FROM customer;");
// OracleDatabase database = new OracleDatabase();
// SqlStatement[] statements = change2.generateStatements(database);
// assertEquals(1,statements.length);
// assertEquals("SELECT * FROM customer",statements[0].getSqlStatement(database));
// }
// @Test
// public void singleLineEndGo() throws Exception {
// SQLFileChange change2 = new SQLFileChange();
// change2.setSql("SELECT * FROM customer\ngo");
// MSSQLDatabase database = new MSSQLDatabase();
// SqlStatement[] statements = change2.generateStatements(database);
// assertEquals(1,statements.length);
// assertEquals("SELECT * FROM customer",statements[0].getSqlStatement(database));
// }
// @Test
// public void singleLineBeginGo() throws Exception {
// SQLFileChange change2 = new SQLFileChange();
// change2.setSql("goSELECT * FROM customer\ngo");
// MSSQLDatabase database = new MSSQLDatabase();
// SqlStatement[] statements = change2.generateStatements(database);
// assertEquals(1,statements.length);
// assertEquals("goSELECT * FROM customer",statements[0].getSqlStatement(database));
// }
// @Test
// public void multiLineSQLFileGoShouldFind() throws Exception {
// SQLFileChange change2 = new SQLFileChange();
// change2.setSql("SELECT * FROM customer\ngo\n" +
// "SELECT * from table\ngo");
// MSSQLDatabase database = new MSSQLDatabase();
// SqlStatement[] statements = change2.generateStatements(database);
// assertEquals(2,statements.length);
// assertEquals("SELECT * FROM customer",statements[0].getSqlStatement(database));
// assertEquals("SELECT * from table",statements[1].getSqlStatement(database));
// }
// @Test
// public void multiLineSQLFileGoShouldNotFind() throws Exception {
// SQLFileChange change2 = new SQLFileChange();
// change2.setSql("SELECT * FROM go\ngo\n" +
// "SELECT * from gogo\ngo\n");
// MSSQLDatabase database = new MSSQLDatabase();
// SqlStatement[] statements = change2.generateStatements(database);
//
// assertEquals(2,statements.length);
// assertEquals("SELECT * FROM go",statements[0].getSqlStatement(database));
// assertEquals("SELECT * from gogo",statements[1].getSqlStatement(database));
// }
@Override
@Test
public void getConfirmationMessage() throws Exception {
change.setPath(fileName);
assertEquals("SQL in file " + fileName + " executed", change.getConfirmationMessage());
}
@Override
@Test
public void getRefactoringName() throws Exception {
assertEquals("SQL From File", change.getChangeMetaData().getDescription());
}
@Test
public void testStatementsWithSemicolons() {
AbstractSQLChange change2 = new SQLFileChange();
String insertWithSemicolon = "insert into table ( col ) values (' value with; semicolon ');";
change2.setSql(insertWithSemicolon);
Database database = new MockDatabase();
SqlStatement[] statements = change2.generateStatements(database);
assertEquals("Unexpected amount of statements returned",1, statements.length);
String insertWithoutTrailingSemicolon = insertWithSemicolon.substring(0, insertWithSemicolon.length() - 1);
assertEquals("unexpected SQL statement returned", insertWithoutTrailingSemicolon, statements[0].toString());
}
@Override
protected void checkThatChecksumIsNew(Change change, Map<String, String> seenCheckSums, Field field) {
//always ok
}
}