package liquibase.statement;
import static java.util.Arrays.asList;
import static org.mockito.BDDMockito.given;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.verify;
import static org.mockito.MockitoAnnotations.initMocks;
import java.sql.PreparedStatement;
import java.util.ArrayList;
import liquibase.change.ColumnConfig;
import liquibase.changelog.ChangeSet;
import liquibase.database.Database;
import liquibase.database.PreparedStatementFactory;
import liquibase.database.core.MSSQLDatabase;
import liquibase.database.jvm.JdbcConnection;
import liquibase.resource.ResourceAccessor;
import liquibase.structure.core.Column;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
public class UpdateExecutablePreparedStatementTest {
@Mock
private ChangeSet changeSet;
@Mock
private ResourceAccessor resourceAccessor;
@Mock
private JdbcConnection connection;
@Mock
private PreparedStatement ps;
private Database database;
private PreparedStatementFactory preparedStatementFactory;
@Before
public void setUp() throws Exception {
initMocks(this);
given(connection.prepareStatement(anyString())).willReturn(ps);
database = new MSSQLDatabase();
preparedStatementFactory = new PreparedStatementFactory(connection);
}
@Test
public void testExecuteWithParamPlaceholders() throws Exception {
// given
UpdateExecutablePreparedStatement statement = new UpdateExecutablePreparedStatement(
database,
null,
null,
"DATABASECHANGELOG",
new ArrayList<ColumnConfig>(asList(
new ColumnConfig()
.setName("MD5SUM")
.setValue("7:e27bf9c0c2313160ef960a15d44ced47"))),
changeSet,
resourceAccessor)
.setWhereClause(
database.escapeObjectName("ID", Column.class) + " = ? " +
"AND " + database.escapeObjectName("AUTHOR", Column.class) + " = ? " +
"AND " + database.escapeObjectName("FILENAME", Column.class) + " = ?")
.addWhereParameters(
"SYPA: AUTO_START tüüp INT -> TEXT, vaartus 0 00 17 * * ?",
"martin",
"db/changelog.xml");
// when
statement.execute(preparedStatementFactory);
// then
verify(connection).prepareStatement(
"UPDATE [DATABASECHANGELOG] " +
"SET [MD5SUM] = ? " +
"WHERE [ID] = N'SYPA: AUTO_START tüüp INT -> TEXT, vaartus 0 00 17 * * ?' " +
"AND [AUTHOR] = 'martin' " +
"AND [FILENAME] = 'db/changelog.xml'");
verify(ps).setString(1, "7:e27bf9c0c2313160ef960a15d44ced47");
}
@Test
public void testExecuteWithNameValuePlaceholderPairs() throws Exception {
// given
UpdateExecutablePreparedStatement statement = new UpdateExecutablePreparedStatement(
database,
null,
null,
"DATABASECHANGELOG",
new ArrayList<ColumnConfig>(asList(
new ColumnConfig()
.setName("MD5SUM")
.setValue("7:e27bf9c0c2313160ef960a15d44ced47"))),
changeSet,
resourceAccessor)
.setWhereClause(":name = :value AND :name = :value AND :name = :value")
.addWhereColumnName("ID")
.addWhereColumnName("AUTHOR")
.addWhereColumnName("FILENAME")
.addWhereParameters(
"SYPA: AUTO_START tüüp INT -> TEXT, vaartus 0 00 17 * * ?",
"martin",
"db/changelog.xml");
// when
statement.execute(preparedStatementFactory);
// then
verify(connection).prepareStatement(
"UPDATE [DATABASECHANGELOG] " +
"SET [MD5SUM] = ? " +
"WHERE [ID] = N'SYPA: AUTO_START tüüp INT -> TEXT, vaartus 0 00 17 * * ?' " +
"AND [AUTHOR] = 'martin' " +
"AND [FILENAME] = 'db/changelog.xml'");
verify(ps).setString(1, "7:e27bf9c0c2313160ef960a15d44ced47");
}
}