package com.dbdeploy.appliers;
import com.dbdeploy.database.QueryStatementSplitter;
import com.dbdeploy.database.changelog.DatabaseSchemaVersionManager;
import com.dbdeploy.database.changelog.QueryExecuter;
import com.dbdeploy.exceptions.ChangeScriptFailedException;
import com.dbdeploy.scripts.ChangeScript;
import com.dbdeploy.scripts.StubChangeScript;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnit44Runner;
import java.sql.SQLException;
import java.util.Arrays;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.fail;
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnit44Runner.class)
public class DirectToDbApplierTest {
@Mock private QueryExecuter queryExecuter;
@Mock private DatabaseSchemaVersionManager schemaVersionManager;
@Mock private QueryStatementSplitter splitter;
private DirectToDbApplier applier;
@Before
public void setUp() {
applier = new DirectToDbApplier(queryExecuter, schemaVersionManager, splitter);
}
@Test
public void shouldSetConnectionToManualCommitModeAtStart() throws Exception {
applier.begin();
verify(queryExecuter).setAutoCommit(false);
}
@Test
public void shouldApplyChangeScriptBySplittingContentUsingTheSplitter() throws Exception {
when(splitter.split("split; content")).thenReturn(Arrays.asList("split", "content"));
applier.applyChangeScript(new StubChangeScript(1, "script", "split; content"));
verify(queryExecuter).execute("split");
verify(queryExecuter).execute("content");
}
@Test
public void shouldRethrowSqlExceptionsWithInformationAboutWhatStringFailed() throws Exception {
when(splitter.split("split; content")).thenReturn(Arrays.asList("split", "content"));
ChangeScript script = new StubChangeScript(1, "script", "split; content");
doThrow(new SQLException("dummy exception")).when(queryExecuter).execute("split");
try {
applier.applyChangeScript(script);
fail("exception expected");
} catch (ChangeScriptFailedException e) {
assertThat(e.getExecutedSql(), is("split"));
assertThat(e.getScript(), is(script));
}
verify(queryExecuter, never()).execute("content");
}
@Test
public void shouldInsertToSchemaVersionTable() throws Exception {
ChangeScript changeScript = new ChangeScript(1, "script.sql");
applier.insertToSchemaVersionTable(changeScript);
verify(schemaVersionManager).recordScriptApplied(changeScript);
}
@Test
public void shouldCommitTransactionOnErrrCommitTransaction() throws Exception {
applier.commitTransaction();
verify(queryExecuter).commit();
}
}