package de.unioninvestment.eai.portal.portlet.crud.scripting.model;
import static java.util.Collections.singletonMap;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import groovy.lang.GString;
import java.math.BigDecimal;
import java.sql.Time;
import java.sql.Timestamp;
import java.util.Date;
import org.codehaus.groovy.runtime.GStringImpl;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import com.vaadin.data.util.sqlcontainer.query.generator.StatementHelper;
import de.unioninvestment.eai.portal.portlet.crud.domain.model.DatabaseQueryContainer;
public class ScriptDatabaseQueryContainerTest {
@Mock
private DatabaseQueryContainer containerMock;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
}
@Test
public void shouldConvertQueryHelperToGString() {
StatementHelper queryHelper = new StatementHelper();
queryHelper.setQueryString("select * from TEST where x = ? ");
queryHelper.addParameterValue(1);
GString expectedResult = new GStringImpl(new Object[] { 1 },
new String[] { "select * from TEST where x = ", " " });
checkForValidResult(queryHelper, expectedResult);
}
@Test
public void shouldPassPreserveOrderOption() {
StatementHelper queryHelper = new StatementHelper();
queryHelper.setQueryString("select * from TEST where x = ? ");
queryHelper.addParameterValue(1);
when(containerMock.getCurrentQuery(true)).thenReturn(queryHelper);
ScriptDatabaseQueryContainer scriptContainer = new ScriptDatabaseQueryContainer(
containerMock);
scriptContainer.getCurrentQuery(singletonMap("preserveOrder",
(Object) true));
verify(containerMock).getCurrentQuery(true);
}
@Test
public void shouldNotPassPreserveOrderOptionByDefault() {
StatementHelper queryHelper = new StatementHelper();
queryHelper.setQueryString("select * from TEST where x = ? ");
queryHelper.addParameterValue(1);
when(containerMock.getCurrentQuery(false)).thenReturn(queryHelper);
ScriptDatabaseQueryContainer scriptContainer = new ScriptDatabaseQueryContainer(
containerMock);
scriptContainer.getCurrentQuery(null);
verify(containerMock).getCurrentQuery(false);
}
@Test
public void shouldHandleMultipleParameters() {
StatementHelper queryHelper = new StatementHelper();
queryHelper.setQueryString("select * from TEST where x = ? and y=?");
queryHelper.addParameterValue(1);
queryHelper.addParameterValue(2);
GString expectedResult = new GStringImpl(new Object[] { 1, 2 },
new String[] { "select * from TEST where x = ", " and y=", "" });
checkForValidResult(queryHelper, expectedResult);
}
@Test
public void shouldIgnoreQuestionMarksInCharacterSequences() {
StatementHelper queryHelper = new StatementHelper();
queryHelper.setQueryString("select * from TEST where x = '?' and y=?");
queryHelper.addParameterValue(2);
GString expectedResult = new GStringImpl(new Object[] { 2 },
new String[] { "select * from TEST where x = '?' and y=", "" });
checkForValidResult(queryHelper, expectedResult);
}
private void checkForValidResult(StatementHelper queryHelper,
GString expectedResult) {
when(containerMock.getCurrentQuery(false)).thenReturn(queryHelper);
ScriptDatabaseQueryContainer scriptContainer = new ScriptDatabaseQueryContainer(
containerMock);
GString result = scriptContainer.getCurrentQuery(singletonMap(
"preserveOrder", (Object) false));
assertThat(result, equalTo(expectedResult));
}
@Test
public void shouldHandleNullInteger() {
checkSupportForNullParameterType(Integer.class);
}
@Test
public void shouldHandleNullString() {
checkSupportForNullParameterType(String.class);
}
@Test
public void shouldHandleNullBoolean() {
checkSupportForNullParameterType(Boolean.class);
}
@Test
public void shouldHandleNullByte() {
checkSupportForNullParameterType(Byte.class);
}
@Test
@Ignore("Currently not handled by SQLContainer")
public void shouldHandleNullDate() {
checkSupportForNullParameterType(Date.class);
}
@Test
public void shouldHandleNullDouble() {
checkSupportForNullParameterType(Double.class);
}
@Test
public void shouldHandleNullFloat() {
checkSupportForNullParameterType(Float.class);
}
@Test
public void shouldHandleNullLong() {
checkSupportForNullParameterType(Long.class);
}
@Test
public void shouldHandleNullShort() {
checkSupportForNullParameterType(Short.class);
}
@Test
public void shouldHandleNullBigDecimal() {
checkSupportForNullParameterType(BigDecimal.class);
}
@Test
public void shouldHandleNullSqlDate() {
checkSupportForNullParameterType(java.sql.Date.class);
}
@Test
public void shouldHandleNullTime() {
checkSupportForNullParameterType(Time.class);
}
@Test
public void shouldHandleNullTimestamp() {
checkSupportForNullParameterType(Timestamp.class);
}
private void checkSupportForNullParameterType(Class<?> parameterType) {
StatementHelper queryHelper = new StatementHelper();
queryHelper.setQueryString("select * from TEST where x = ?");
queryHelper.addParameterValue(null, parameterType);
when(containerMock.getCurrentQuery(false)).thenReturn(queryHelper);
ScriptDatabaseQueryContainer scriptContainer = new ScriptDatabaseQueryContainer(
containerMock);
GString expectedResult = new GStringImpl(new Object[] { null },
new String[] { "select * from TEST where x = ", "" });
assertThat(scriptContainer.getCurrentQuery(singletonMap("sorted",
(Object) false)), equalTo(expectedResult));
}
}