package liquibase.ext.spatial.sqlgenerator;
import static org.mockito.Mockito.*;
import static org.testng.Assert.*;
import liquibase.database.Database;
import liquibase.database.core.H2Database;
import liquibase.database.core.MySQLDatabase;
import liquibase.ext.spatial.statement.CreateSpatialIndexStatement;
import liquibase.sql.Sql;
import liquibase.sqlgenerator.SqlGeneratorChain;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
/**
* <code>CreateSpatialIndexGeneratorMySQLTest</code> tests {@link CreateSpatialIndexGeneratorMySQL}.
*/
public class CreateSpatialIndexGeneratorMySQLTest {
/**
* Tests {@link CreateSpatialIndexGeneratorMySQL#supports(CreateSpatialIndexStatement, Database)}
*/
@Test
public void testSupports() {
final CreateSpatialIndexGeneratorMySQL generator = new CreateSpatialIndexGeneratorMySQL();
final CreateSpatialIndexStatement statement = mock(CreateSpatialIndexStatement.class);
assertTrue(generator.supports(statement, new MySQLDatabase()));
assertFalse(generator.supports(statement, new H2Database()));
}
/**
* Tests
* {@link CreateSpatialIndexGeneratorMySQL#generateSql(CreateSpatialIndexStatement, Database, SqlGeneratorChain)}
* with a variety of inputs.
*
* @param statement
*/
@Test(dataProvider = "generateSqlTestData")
public void testGenerateSql(final CreateSpatialIndexStatement statement) {
final CreateSpatialIndexGeneratorMySQL generator = new CreateSpatialIndexGeneratorMySQL();
final Database database = new MySQLDatabase();
final SqlGeneratorChain sqlGeneratorChain = mock(SqlGeneratorChain.class);
final Sql[] result = generator.generateSql(statement, database, sqlGeneratorChain);
assertNotNull(result);
assertEquals(result.length, 1);
final String sql = result[0].toSql();
String pattern = "(?i)CREATE SPATIAL INDEX " + statement.getIndexName() + " ON ";
if (statement.getTableCatalogName() != null) {
pattern += statement.getTableCatalogName() + '.';
} else if (statement.getTableSchemaName() != null) {
pattern += statement.getTableSchemaName() + '.';
}
pattern += statement.getTableName() + "\\(" + statement.getColumns()[0] + "\\)";
assertTrue(sql.matches(pattern), "'" + sql + "' does not match the pattern '" + pattern + "'");
assertNotNull(result[0].getAffectedDatabaseObjects());
assertTrue(result[0].getAffectedDatabaseObjects().size() > 1, result[0]
.getAffectedDatabaseObjects().toString());
}
/**
* Generates test data for {@link #testGenerateSql(Integer, String)}.
*
* @return the test data.
*/
@DataProvider
public Object[][] generateSqlTestData() {
return new Object[][] {
new Object[] { new CreateSpatialIndexStatement("indexName", "catalogName",
"schemaName", "tableName", new String[] { "geom" }, "tablespace", "Geometry",
4326) },
new Object[] { new CreateSpatialIndexStatement("indexName", null, "schemaName",
"tableName", new String[] { "geom" }, "tablespace", "Geometry", 4326) },
new Object[] { new CreateSpatialIndexStatement("indexName", null, null, "tableName",
new String[] { "geom" }, "tablespace", "Geometry", 4326) },
new Object[] { new CreateSpatialIndexStatement("indexName", null, null, "tableName",
new String[] { "geom" }, null, "Geometry", 4326) },
new Object[] { new CreateSpatialIndexStatement("indexName", null, null, "tableName",
new String[] { "geom" }, null, null, 4326) },
new Object[] { new CreateSpatialIndexStatement("indexName", null, null, "tableName",
new String[] { "geom" }, null, null, null) },
new Object[] { new CreateSpatialIndexStatement("indexName", null, null, "tableName",
new String[] { "geom", "ignoredColumn" }, null, null, null) } };
}
}