/*
* Copyright 2015 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.dashbuilder.displayer.client.widgets.filter;
import javax.enterprise.event.Event;
import org.dashbuilder.dataset.ColumnType;
import org.dashbuilder.dataset.DataSetLookupFactory;
import org.dashbuilder.dataset.DataSetMetadata;
import org.dashbuilder.dataset.filter.ColumnFilter;
import org.dashbuilder.dataset.filter.CoreFunctionType;
import org.dashbuilder.dataset.filter.DataSetFilter;
import org.dashbuilder.dataset.filter.FilterFactory;
import org.dashbuilder.displayer.client.events.ColumnFilterDeletedEvent;
import org.dashbuilder.displayer.client.events.DataSetFilterChangedEvent;
import org.jboss.errai.ioc.client.container.SyncBeanDef;
import org.jboss.errai.ioc.client.container.SyncBeanManager;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import static org.junit.Assert.*;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
public class DataSetFilterEditorTest {
@Mock
ColumnFilterEditor columnFilterEditor;
@Mock
DataSetFilterEditor.View filterView;
@Mock
SyncBeanManager beanManager;
@Mock
SyncBeanDef<ColumnFilterEditor> columnFilterEditorBeanDef;
@Mock
DataSetMetadata metadata;
@Mock
Event<DataSetFilterChangedEvent> changedEvent;
@Before
public void setup() {
when(beanManager.lookupBean(ColumnFilterEditor.class)).thenReturn(columnFilterEditorBeanDef);
when(columnFilterEditorBeanDef.newInstance()).thenReturn(columnFilterEditor);
when(metadata.getNumberOfColumns()).thenReturn(3);
when(metadata.getColumnId(0)).thenReturn("column1");
when(metadata.getColumnId(1)).thenReturn("column2");
when(metadata.getColumnId(2)).thenReturn("column3");
when(metadata.getColumnType(0)).thenReturn(ColumnType.LABEL);
when(metadata.getColumnType(1)).thenReturn(ColumnType.NUMBER);
when(metadata.getColumnType(2)).thenReturn(ColumnType.DATE);
}
@Test
public void testViewInitialization() {
DataSetFilter filter = new DataSetFilter();
ColumnFilter filter1 = FilterFactory.equalsTo("column1", "Test");
filter.addFilterColumn(filter1);
DataSetFilterEditor filterEditor = new DataSetFilterEditor(filterView, beanManager, changedEvent);
filterEditor.init(filter, metadata);
assertEquals(filterView, filterEditor.view);
verify(filterView).showNewFilterHome();
verify(filterView).addColumn("column1");
verify(filterView).addColumn("column2");
verify(filterView).addColumn("column3");
verify(filterView, times(filter.getColumnFilterList().size())).addColumnFilterEditor(any(ColumnFilterEditor.class));
}
@Test
public void testWorkflow() {
DataSetFilterEditor filterEditor = new DataSetFilterEditor(filterView, beanManager, changedEvent);
filterEditor.init(null, metadata);
reset(filterView);
filterEditor.onNewFilterStart();
verify(filterView).showColumnSelector();
filterEditor.onNewFilterCancel();
verify(filterView).showNewFilterHome();
}
@Test
public void testCreateLabelFilter() {
DataSetFilterEditor filterEditor = new DataSetFilterEditor(filterView, beanManager, changedEvent);
filterEditor.init(null, metadata);
reset(filterView);
when(filterView.getSelectedColumnIndex()).thenReturn(0);
filterEditor.onCreateFilter();
verify(changedEvent).fire(any(DataSetFilterChangedEvent.class));
DataSetFilter filter = filterEditor.getFilter();
assertNotNull(filter);
assertEquals(filter.getColumnFilterList().size(), 1);
ColumnFilter expected = FilterFactory.createCoreFunctionFilter("column1", ColumnType.LABEL, CoreFunctionType.NOT_EQUALS_TO);
assertEquals(filter.getColumnFilterList().get(0), expected);
}
@Test
public void testCreateDateFilter() {
DataSetFilterEditor filterEditor = new DataSetFilterEditor(filterView, beanManager, changedEvent);
filterEditor.init(null, metadata);
reset(filterView);
when(filterView.getSelectedColumnIndex()).thenReturn(2);
filterEditor.onCreateFilter();
verify(changedEvent).fire(any(DataSetFilterChangedEvent.class));
DataSetFilter filter = filterEditor.getFilter();
assertNotNull(filter);
assertEquals(filter.getColumnFilterList().size(), 1);
ColumnFilter expected = FilterFactory.createCoreFunctionFilter("column3", ColumnType.DATE, CoreFunctionType.TIME_FRAME);
assertEquals(filter.getColumnFilterList().get(0), expected);
}
@Test
public void testDeleteDuplicatedFilters() {
ColumnFilter columnFilter1 = FilterFactory.notEqualsTo("column", "val1");
ColumnFilter columnFilter2 = FilterFactory.notEqualsTo("column", "val1");
ColumnFilterEditor columnFilterEditor1 = mock(ColumnFilterEditor.class);
ColumnFilterEditor columnFilterEditor2 = mock(ColumnFilterEditor.class);
when(columnFilterEditor1.getFilter()).thenReturn(columnFilter1);
when(columnFilterEditor2.getFilter()).thenReturn(columnFilter2);
when(columnFilterEditorBeanDef.newInstance()).thenReturn(columnFilterEditor1, columnFilterEditor2);
DataSetFilter filter = new DataSetFilter();
filter.addFilterColumn(columnFilter1, columnFilter2);
DataSetFilterEditor filterEditor = new DataSetFilterEditor(filterView, beanManager, changedEvent);
filterEditor.init(filter, metadata);
filterEditor.onColumnFilterDeleted(new ColumnFilterDeletedEvent(columnFilterEditor2));
filterEditor.onColumnFilterDeleted(new ColumnFilterDeletedEvent(columnFilterEditor1));
assertEquals(filter.getColumnFilterList().size(), 0);
verify(filterView).removeColumnFilterEditor(columnFilterEditor1);
verify(filterView).removeColumnFilterEditor(columnFilterEditor2);
verify(beanManager).destroyBean(columnFilterEditor1);
verify(beanManager).destroyBean(columnFilterEditor2);
verify(changedEvent, times(2)).fire(any(DataSetFilterChangedEvent.class));
}
}