package de.unioninvestment.eai.portal.portlet.crud.domain.validation.search; import com.google.common.collect.ImmutableMap; import de.unioninvestment.eai.portal.portlet.crud.config.*; import de.unioninvestment.eai.portal.portlet.crud.domain.form.SearchFormAction; import de.unioninvestment.eai.portal.portlet.crud.domain.model.*; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import static de.unioninvestment.eai.portal.portlet.crud.domain.form.SearchFormTestUtility.*; import static java.util.Arrays.asList; import static org.mockito.Mockito.when; // FIXME Testabdeckung public class SearchFormActionsValidatorTest { @Mock private ModelBuilder modelBuilderMock; @Mock private Form formMock; private SearchFormActionsValidator validator; @Mock private FormActions searchActionsMock; @Mock private FormAction searchActionMock; @Mock private SearchFormAction searchActionHandlerMock; private FormActionConfig searchFormActionConfig = new FormActionConfig(); private SearchConfig searchConfig = new SearchConfig(); private ApplyFiltersConfig applyFiltersConfig = new ApplyFiltersConfig(); private EqualsFilterConfig equalsFilter = new EqualsFilterConfig(); @Mock private FormFields formFieldsMock; @Mock private Table tableMock, otherTableMock; @Mock private DataContainer containerMock, otherContainerMock; @Rule public ExpectedException thrown = ExpectedException.none(); @Before public void setup() { MockitoAnnotations.initMocks(this); searchFormActionConfig.setSearch(searchConfig); searchConfig.setApplyFilters(applyFiltersConfig); applyFiltersConfig.getFilters().add(equalsFilter); equalsFilter.setColumn("COLUMN"); equalsFilter.setField("FIELD"); when(formMock.getActions()).thenReturn(searchActionsMock); when(formMock.getFields()).thenReturn(formFieldsMock); when(formFieldsMock.getNames()).thenReturn(asList("FIELD")); when(modelBuilderMock.getForms()).thenReturn(asList(formMock)); when(searchActionsMock.getSearchAction()).thenReturn(searchActionMock); when(searchActionMock.getActionHandler()).thenReturn(searchActionHandlerMock); when(searchActionHandlerMock.findSearchableTables(formMock)).thenReturn(asList(tableMock, otherTableMock)); when(modelBuilderMock.getModelToConfigMapping()).thenReturn(ImmutableMap.<Object,Object>of(searchActionMock, searchFormActionConfig)); when(tableMock.getContainer()).thenReturn(containerMock); when(containerMock.getColumns()).thenReturn(asList("COLUMN")); when(otherTableMock.getContainer()).thenReturn(otherContainerMock); when(otherContainerMock.getColumns()).thenReturn(asList("OTHER_COLUMN")); validator = new SearchFormActionsValidator(modelBuilderMock); } @Test public void shouldAcceptValidSearches() { validator.validate(); } @Test public void shouldAcceptSearchesThatContainNoExplicitFilters() { searchConfig.setApplyFilters(null); validator.validate(); } @Test public void shouldFailIfExplicitFilteringContainsNoFilters() { thrown.expect(IllegalArgumentException.class); thrown.expectMessage("Die Suche enthält explizit keine Filter"); applyFiltersConfig.getFilters().clear(); validator.validate(); } @Test public void shouldFailIfFormFieldDefinedInFilterDoesNotExist() { thrown.expect(IllegalArgumentException.class); thrown.expectMessage("Die Felder [NON_EXISTING_FIELD] sind nicht den durchsuchten Formularen verfügbar"); equalsFilter.setField("NON_EXISTING_FIELD"); validator.validate(); } @Test public void shouldFailIfColumnDefinedInComparisionFilterDoesNotExistInTable() { expectColumnExistenceError(createEqualsFilter("field", "NON_EXISTING_COLUMN")); } @Test public void shouldFailIfColumnDefinedInSQLFilterDoesNotExistInTable(){ expectColumnExistenceError(createSqlWhereFilter("NON_EXISTING_COLUMN", "some sql query")); } @Test public void shouldIgnoreCustomFilterInColumnNameCheck(){ applyFiltersConfig.getFilters().add(createIncludeFilter()); validator.validate(); } @Test public void shouldIgnoreIncludeFilterInColumnNameCheck(){ applyFiltersConfig.getFilters().add(createCustomFilter()); validator.validate(); } private void expectColumnExistenceError(FilterConfig filter) { thrown.expect(IllegalArgumentException.class); thrown.expectMessage("Die Spalte 'NON_EXISTING_COLUMN' ist nicht in den durchsuchten Tabellen verfügbar"); applyFiltersConfig.getFilters().add(filter); validator.validate(); } @Test public void shouldFailIfColumnDefinedExplicitlyInFilterDoesNotExistInSpecificTable() { thrown.expect(IllegalArgumentException.class); thrown.expectMessage("Die Spalte 'COLUMN' ist nicht in den durchsuchten Tabellen verfügbar"); equalsFilter.setTable("OTHER_TABLE"); validator.validate(); } @Test public void shouldFailIfColumnDefinedExplicitlyInSubFilterDoesNotExist() { thrown.expect(IllegalArgumentException.class); thrown.expectMessage("Die Spalte 'NON_EXISTING_COLUMN' ist nicht in den durchsuchten Tabellen verfügbar"); AllFilterConfig allFilterConfig = new AllFilterConfig(); allFilterConfig.getFilters().add(equalsFilter); applyFiltersConfig.getFilters().clear(); applyFiltersConfig.getFilters().add(allFilterConfig); equalsFilter.setColumn("NON_EXISTING_COLUMN"); validator.validate(); } }