package de.unioninvestment.eai.portal.portlet.crud.domain.form; import com.vaadin.ui.UI; import de.unioninvestment.eai.portal.portlet.crud.config.*; import de.unioninvestment.eai.portal.portlet.crud.domain.model.*; import de.unioninvestment.eai.portal.portlet.crud.domain.support.InitializingUI; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import java.sql.Timestamp; import java.util.*; import static de.unioninvestment.eai.portal.portlet.crud.domain.form.SearchFormTestUtility.createDateFormField; import static de.unioninvestment.eai.portal.portlet.crud.domain.form.SearchFormTestUtility.createFormField; import static org.mockito.Matchers.any; import static org.mockito.Mockito.when; // FIXME Testabdeckung überprüfen public class SearchFormActionValidatorTest { @SuppressWarnings("serial") static abstract class UIMock extends UI implements InitializingUI { } private SearchFormActionValidator searchFormActionValidator; @Mock private SearchFormAction searchAction; private FormFields formFields; @Mock private Form formMock; @Mock private Table tableMock; @Mock private DataContainer dataContainerMock; @Mock private OptionListFormField selectionFormField; @Mock private UIMock uiMock; @Before public void setUp() { MockitoAnnotations.initMocks(this); when(selectionFormField.getName()).thenReturn("selection1"); when(selectionFormField.getValue()).thenReturn("value1"); when(tableMock.getId()).thenReturn("table"); formFields = new FormFields(createFormField("field1", "title1", "prompt1", "filterValue1"), selectionFormField); when(formMock.getFields()).thenReturn(formFields); // register application with thread UI.setCurrent(uiMock); when(uiMock.getLocale()).thenReturn(Locale.GERMANY); searchFormActionValidator = new SearchFormActionValidator(searchAction, formMock); } @After public void tearDown() { // deregister from thread UI.setCurrent(null); } static FormField emptyField() { return createFormField("test-field", "title", "prompt", ""); } static FormField emptyDateField() { return createDateFormField("test-field", "title", "prompt", "dd.MM.yyyy", ""); } @Test(expected=IllegalArgumentException.class) public void shouldRaiseError_StartsWith_NumericField(){ checkComparisonFilterColumnType(Number.class, new StartsWithFilterConfig(), emptyField()); } @Test(expected=IllegalArgumentException.class) public void shouldRaiseError_EndsWith_NumericField(){ checkComparisonFilterColumnType(Number.class, new EndsWithFilterConfig(), emptyField()); } @Test(expected=IllegalArgumentException.class) public void shouldRaiseError_Contains_NumericField(){ checkComparisonFilterColumnType(Number.class, new ContainsFilterConfig(), emptyField()); } @Test(expected=IllegalArgumentException.class) public void shouldRaiseError_RegExp_NumericField(){ checkComparisonFilterColumnType(Number.class, new RegExpFilterConfig(), emptyField()); } @Test(expected=IllegalArgumentException.class) public void shouldRaiseError_StartsWith_DateField(){ checkComparisonFilterColumnType(Date.class, new StartsWithFilterConfig(), emptyDateField()); } @Test public void noError_Equals_TimestampField(){ checkComparisonFilterColumnType(Timestamp.class, new EqualsFilterConfig(), emptyDateField()); } @Test(expected=IllegalArgumentException.class) public void shouldRaiseError_EndsWith_DateField(){ checkComparisonFilterColumnType(Date.class, new EndsWithFilterConfig(), emptyDateField()); } @Test(expected=IllegalArgumentException.class) public void shouldRaiseError_Contains_DateField(){ checkComparisonFilterColumnType(Date.class, new ContainsFilterConfig(), emptyDateField()); } @Test(expected=IllegalArgumentException.class) public void shouldRaiseError_RegExp_DateField(){ checkComparisonFilterColumnType(Date.class, new RegExpFilterConfig(), emptyDateField()); } @Test public void noError_StartsWith_StringField(){ checkComparisonFilterColumnType(String.class, new StartsWithFilterConfig(), emptyField()); } @Test public void noError_EndsWith_StringField(){ checkComparisonFilterColumnType(String.class, new EndsWithFilterConfig(), emptyField()); } @Test public void noError_Contains_StringField(){ checkComparisonFilterColumnType(String.class, new ContainsFilterConfig(), emptyField()); } @Test public void noError_RegExp_StringField(){ checkComparisonFilterColumnType(String.class, new RegExpFilterConfig(), emptyField()); } private void checkComparisonFilterColumnType(final Class<?> aClass, ComparisonFilterConfig aFilterConfig, FormField createFormField) { when(searchAction.findSearchableTables(formMock)).thenReturn(Collections.singletonList(tableMock)); when(dataContainerMock.getType(any(String.class))).thenAnswer( new Answer<Class<?>>() { @Override public Class<?> answer(InvocationOnMock invocation) throws Throwable { return aClass; } }); when(tableMock.getContainer()).thenReturn(dataContainerMock); ComparisonFilterConfig filterConfig = aFilterConfig; filterConfig.setField("test-field"); List<FilterConfig> filterConfigList = Arrays.<FilterConfig>asList(filterConfig); when(searchAction.createFilterConfigs(formMock, tableMock)).thenReturn(filterConfigList); when(searchAction.filterMatchesTable(tableMock, filterConfig)).thenReturn(true); FormFields formFields = new FormFields(createFormField); when(formMock.getFields()).thenReturn(formFields); searchFormActionValidator.validate(); } }