package liquibase.change.core;
import liquibase.change.AbstractChangeTest;
import liquibase.change.Change;
import liquibase.change.ColumnConfig;
import liquibase.change.ConstraintsConfig;
import liquibase.database.core.MockDatabase;
import liquibase.database.typeconversion.core.DefaultTypeConverter;
import liquibase.statement.ForeignKeyConstraint;
import liquibase.statement.SqlStatement;
import liquibase.statement.UniqueConstraint;
import liquibase.statement.core.CreateTableStatement;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
/**
* Tests for {@link CreateTableChange}
*/
public class CreateTableChangeTest extends AbstractChangeTest {
private CreateTableChange change;
@Before
public void setUp() throws Exception {
change = new CreateTableChange();
}
@Override
@Test
public void getRefactoringName() throws Exception {
assertEquals("Create Table", change.getChangeMetaData().getDescription());
}
@Override
@Test
public void generateStatement() throws Exception {
change.setTableName("TABLE_NAME");
ColumnConfig column1 = new ColumnConfig();
column1.setName("id");
column1.setType("int");
ConstraintsConfig column1constraints = new ConstraintsConfig();
column1constraints.setPrimaryKey(true);
column1constraints.setNullable(false);
column1.setConstraints(column1constraints);
change.addColumn(column1);
ColumnConfig column2 = new ColumnConfig();
column2.setName("name");
column2.setType("varchar(255)");
change.addColumn(column2);
ColumnConfig column3 = new ColumnConfig();
column3.setName("state_id");
column3.setType("int");
ConstraintsConfig column3constraints = new ConstraintsConfig();
column3constraints.setNullable(false);
column3constraints.setInitiallyDeferred(true);
column3constraints.setDeferrable(true);
column3constraints.setForeignKeyName("fk_tab_ref");
column3constraints.setReferences("state(id)");
column3.setConstraints(column3constraints);
change.addColumn(column3);
ColumnConfig column4 = new ColumnConfig();
column4.setName("phone");
column4.setType("varchar(255)");
column4.setDefaultValue("NOPHONE");
change.addColumn(column4);
ColumnConfig column5 = new ColumnConfig();
column5.setName("phone2");
column5.setType("varchar(255)");
ConstraintsConfig column5constraints = new ConstraintsConfig();
column5constraints.setUnique(true);
column5.setConstraints(column5constraints);
change.addColumn(column5);
SqlStatement[] statements = change.generateStatements(new MockDatabase());
assertEquals(1, statements.length);
assertTrue(statements[0] instanceof CreateTableStatement);
CreateTableStatement statement = (CreateTableStatement) statements[0];
assertEquals("TABLE_NAME", statement.getTableName());
assertTrue(statement.getColumns().contains("id"));
assertTrue(statement.getColumns().contains("state_id"));
assertTrue(statement.getColumns().contains("phone"));
assertTrue(statement.getColumns().contains("phone2"));
assertEquals(1, statement.getPrimaryKeyConstraint().getColumns().size());
assertEquals("id", statement.getPrimaryKeyConstraint().getColumns().iterator().next());
assertEquals(1, statement.getUniqueConstraints().size());
UniqueConstraint uniqueConstraint = statement.getUniqueConstraints().iterator().next();
assertEquals(1, uniqueConstraint.getColumns().size());
assertEquals("phone2", uniqueConstraint.getColumns().iterator().next());
assertEquals(2, statement.getNotNullColumns().size());
assertEquals(1, statement.getForeignKeyConstraints().size());
ForeignKeyConstraint keyConstraint = statement.getForeignKeyConstraints().iterator().next();
assertEquals("fk_tab_ref", keyConstraint.getForeignKeyName());
assertEquals("state_id", keyConstraint.getColumn());
assertEquals("state(id)", keyConstraint.getReferences());
assertTrue(keyConstraint.isDeferrable());
assertTrue(keyConstraint.isInitiallyDeferred());
}
@Override
@Test
public void getConfirmationMessage() throws Exception {
change.setTableName("TAB_NAME");
assertEquals("Table TAB_NAME created", change.getConfirmationMessage());
}
@Test
public void defaultValue_none() throws Exception {
CreateTableChange change = new CreateTableChange();
ColumnConfig columnConfig = new ColumnConfig();
columnConfig.setName("id");
columnConfig.setType("int");
change.addColumn(columnConfig);
CreateTableStatement statement = (CreateTableStatement) change.generateStatements(new MockDatabase())[0];
assertNull(statement.getDefaultValue("id"));
}
@Test
public void defaultValue_string() throws Exception {
CreateTableChange change = new CreateTableChange();
ColumnConfig columnConfig = new ColumnConfig();
columnConfig.setName("id");
columnConfig.setType("int");
columnConfig.setDefaultValue("DEFAULTVALUE");
change.addColumn(columnConfig);
CreateTableStatement statement = (CreateTableStatement) change.generateStatements(new MockDatabase())[0];
assertEquals("DEFAULTVALUE", statement.getDefaultValue("id"));
}
@Test
public void defaultValue_boolean() throws Exception {
CreateTableChange change = new CreateTableChange();
ColumnConfig columnConfig = new ColumnConfig();
columnConfig.setName("id");
columnConfig.setType("boolean");
columnConfig.setDefaultValueBoolean(Boolean.TRUE);
change.addColumn(columnConfig);
CreateTableStatement statement = (CreateTableStatement) change.generateStatements(new MockDatabase())[0];
assertEquals(true, statement.getDefaultValue("id"));
}
@Test
public void defaultValue_numeric() throws Exception {
CreateTableChange change = new CreateTableChange();
ColumnConfig columnConfig = new ColumnConfig();
columnConfig.setName("id");
columnConfig.setType("int");
columnConfig.setDefaultValueNumeric("42");
change.addColumn(columnConfig);
CreateTableStatement statement = (CreateTableStatement) change.generateStatements(new MockDatabase())[0];
assertEquals(42L, statement.getDefaultValue("id"));
}
@Test
public void defaultValue_date() throws Exception {
CreateTableChange change = new CreateTableChange();
ColumnConfig columnConfig = new ColumnConfig();
columnConfig.setName("id");
columnConfig.setType("date");
columnConfig.setDefaultValueDate("2007-01-02");
change.addColumn(columnConfig);
CreateTableStatement statement = (CreateTableStatement) change.generateStatements(new MockDatabase())[0];
assertEquals(columnConfig.getDefaultValueDate(), statement.getDefaultValue("id"));
}
@Test
public void createInverse() {
CreateTableChange change = new CreateTableChange();
change.setTableName("TestTable");
Change[] inverses = change.createInverses();
assertEquals(1, inverses.length);
assertTrue(inverses[0] instanceof DropTableChange);
assertEquals("TestTable", ((DropTableChange) inverses[0]).getTableName());
}
@Test
public void tableSpace_none() throws Exception {
CreateTableChange change = new CreateTableChange();
CreateTableStatement statement = (CreateTableStatement) change.generateStatements(new MockDatabase())[0];
assertNull(statement.getTablespace());
}
@Test
public void tableSpace_set() throws Exception {
CreateTableChange change = new CreateTableChange();
change.setTablespace("TESTTABLESPACE");
CreateTableStatement statement = (CreateTableStatement) change.generateStatements(new MockDatabase())[0];
assertEquals("TESTTABLESPACE", statement.getTablespace());
}
@Test
public void foreignKey_deferrable() throws Exception {
CreateTableChange change = new CreateTableChange();
ColumnConfig columnConfig = new ColumnConfig();
columnConfig.setName("id");
columnConfig.setType("int");
ConstraintsConfig constraints = new ConstraintsConfig();
constraints.setForeignKeyName("fk_test");
constraints.setReferences("test(id)");
constraints.setDeferrable(true);
constraints.setInitiallyDeferred(true);
columnConfig.setConstraints(constraints);
change.addColumn(columnConfig);
CreateTableStatement statement = (CreateTableStatement) change.generateStatements(new MockDatabase())[0];
ForeignKeyConstraint keyConstraint = statement.getForeignKeyConstraints().iterator().next();
assertTrue(keyConstraint.isDeferrable());
assertTrue(keyConstraint.isInitiallyDeferred());
}
@Test
public void foreignKey_notDeferrable() throws Exception {
CreateTableChange change = new CreateTableChange();
ColumnConfig columnConfig = new ColumnConfig();
columnConfig.setName("id");
columnConfig.setType("int");
ConstraintsConfig constraints = new ConstraintsConfig();
constraints.setForeignKeyName("fk_test");
constraints.setReferences("test(id)");
constraints.setDeferrable(false);
constraints.setInitiallyDeferred(false);
columnConfig.setConstraints(constraints);
change.addColumn(columnConfig);
CreateTableStatement statement = (CreateTableStatement) change.generateStatements(new MockDatabase())[0];
ForeignKeyConstraint keyConstraint = statement.getForeignKeyConstraints().iterator().next();
assertFalse(keyConstraint.isDeferrable());
assertFalse(keyConstraint.isInitiallyDeferred());
}
@Test
public void foreignKey_defaultDeferrable() throws Exception {
CreateTableChange change = new CreateTableChange();
ColumnConfig columnConfig = new ColumnConfig();
columnConfig.setName("id");
columnConfig.setType("int");
ConstraintsConfig constraints = new ConstraintsConfig();
constraints.setReferences("test(id)");
constraints.setForeignKeyName("fk_test");
columnConfig.setConstraints(constraints);
change.addColumn(columnConfig);
CreateTableStatement statement = (CreateTableStatement) change.generateStatements(new MockDatabase())[0];
ForeignKeyConstraint keyConstraint = statement.getForeignKeyConstraints().iterator().next();
assertFalse(keyConstraint.isDeferrable());
assertFalse(keyConstraint.isInitiallyDeferred());
}
}