/*
* 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 java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.dashbuilder.dataset.ColumnType;
import org.dashbuilder.dataset.DataSetMetadata;
import org.dashbuilder.dataset.filter.CoreFunctionFilter;
import org.dashbuilder.dataset.filter.CoreFunctionType;
import org.dashbuilder.displayer.client.events.ColumnFilterChangedEvent;
import org.dashbuilder.displayer.client.events.ColumnFilterDeletedEvent;
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 org.uberfire.mocks.EventSourceMock;
import static org.junit.Assert.*;
import static org.mockito.Matchers.*;
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
public class ColumnFilterEditorTest {
@Mock
ColumnFilterEditor.View view;
@Mock
SyncBeanManager beanManager;
@Mock
SyncBeanDef<TextParameterEditor> textParameterBeanDef;
@Mock
SyncBeanDef<NumberParameterEditor> numberParameterBeanDef;
@Mock
SyncBeanDef<DateParameterEditor> dateParameterBeanDef;
@Mock
SyncBeanDef<TimeFrameEditor> timeFrameBeanDef;
@Mock
SyncBeanDef<LikeToFunctionEditor> likeToFunctionBeanDef;
@Mock
TextParameterEditor textParameterEditor;
@Mock
NumberParameterEditor numberParameterEditor;
@Mock
DateParameterEditor dateParameterEditor;
@Mock
TimeFrameEditor timeFrameEditor;
@Mock
LikeToFunctionEditor likeToFunctionEditor;
@Mock
DataSetMetadata metadata;
@Mock
EventSourceMock<ColumnFilterChangedEvent> changedEvent;
@Mock
EventSourceMock<ColumnFilterDeletedEvent> deletedEvent;
@Before
public void init() {
when(beanManager.lookupBean(TextParameterEditor.class)).thenReturn(textParameterBeanDef);
when(beanManager.lookupBean(NumberParameterEditor.class)).thenReturn(numberParameterBeanDef);
when(beanManager.lookupBean(DateParameterEditor.class)).thenReturn(dateParameterBeanDef);
when(beanManager.lookupBean(TimeFrameEditor.class)).thenReturn(timeFrameBeanDef);
when(beanManager.lookupBean(LikeToFunctionEditor.class)).thenReturn(likeToFunctionBeanDef);
when(textParameterBeanDef.newInstance()).thenReturn(textParameterEditor);
when(numberParameterBeanDef.newInstance()).thenReturn(numberParameterEditor);
when(dateParameterBeanDef.newInstance()).thenReturn(dateParameterEditor);
when(likeToFunctionBeanDef.newInstance()).thenReturn(likeToFunctionEditor);
when(timeFrameBeanDef.newInstance()).thenReturn(timeFrameEditor);
}
protected ColumnFilterEditor setupEditor(ColumnType columnType, CoreFunctionType functionType, Comparable... params) {
when(metadata.getColumnType("col")).thenReturn(columnType);
CoreFunctionFilter filter = new CoreFunctionFilter("col", functionType, params);
ColumnFilterEditor filterEditor = new ColumnFilterEditor(view, beanManager, changedEvent, deletedEvent);
filterEditor.init(metadata, filter);
assertEquals(view, filterEditor.getView());
return filterEditor;
}
@Test
public void testTextParam() {
setupEditor(ColumnType.LABEL, CoreFunctionType.EQUALS_TO, "Test");
int n = CoreFunctionType.getSupportedTypes(ColumnType.LABEL).size()-1;
verify(view).clearFunctionSelector();
verify(view, times(n)).addFunctionItem(any(CoreFunctionType.class));
verify(view, never()).addFunctionItem(CoreFunctionType.TIME_FRAME);
verify(view).clearFilterConfig();
verify(view).addFilterConfigWidget(textParameterEditor);
verify(view).setFunctionSelected("col = Test");
}
@Test
public void testNumberParam() throws Exception {
double number = 1000.23;
NumberFormat numberFormat = NumberFormat.getNumberInstance();
when(view.formatNumber(number)).thenReturn(numberFormat.format(number));
setupEditor(ColumnType.NUMBER, CoreFunctionType.EQUALS_TO, number);
int n = CoreFunctionType.getSupportedTypes(ColumnType.NUMBER).size()-1;
verify(view).clearFunctionSelector();
verify(view, times(n)).addFunctionItem(any(CoreFunctionType.class));
verify(view, never()).addFunctionItem(CoreFunctionType.TIME_FRAME);
verify(view, never()).addFunctionItem(CoreFunctionType.LIKE_TO);
verify(view).clearFilterConfig();
verify(view).addFilterConfigWidget(numberParameterEditor);
verify(view).setFunctionSelected("col = " + numberFormat.format(number));
}
@Test
public void testDateParam() throws Exception {
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
String dateStr = "23-11-2020 23:59:59";
Date d = dateFormat.parse(dateStr);
when(view.formatDate(d)).thenReturn(dateStr);
setupEditor(ColumnType.DATE, CoreFunctionType.EQUALS_TO, d);
int n = CoreFunctionType.getSupportedTypes(ColumnType.DATE).size()-1;
verify(view).clearFunctionSelector();
verify(view, times(n)).addFunctionItem(any(CoreFunctionType.class));
verify(view).addFunctionItem(CoreFunctionType.TIME_FRAME);
verify(view, never()).addFunctionItem(CoreFunctionType.LIKE_TO);
verify(view).clearFilterConfig();
verify(view).addFilterConfigWidget(dateParameterEditor);
verify(view).setFunctionSelected("col = " + dateStr);
}
@Test
public void testNotEquals() {
setupEditor(ColumnType.LABEL, CoreFunctionType.NOT_EQUALS_TO, "Test");
verify(view).setFunctionSelected("col != Test");
}
@Test
public void testBetween() {
setupEditor(ColumnType.LABEL, CoreFunctionType.BETWEEN, "A", "B");
verify(view).setFunctionSelected("col [A B]");
}
@Test
public void testGreaterOrEquals() {
setupEditor(ColumnType.LABEL, CoreFunctionType.GREATER_OR_EQUALS_TO, "Test");
verify(view).setFunctionSelected("col >= Test");
}
@Test
public void testGreaterThan() {
setupEditor(ColumnType.LABEL, CoreFunctionType.GREATER_THAN, "Test");
verify(view).setFunctionSelected("col > Test");
}
@Test
public void testLowerOrEquals() {
setupEditor(ColumnType.LABEL, CoreFunctionType.LOWER_OR_EQUALS_TO, "Test");
verify(view).setFunctionSelected("col <= Test");
}
@Test
public void testLowerThan() {
setupEditor(ColumnType.LABEL, CoreFunctionType.LOWER_THAN, "Test");
verify(view).setFunctionSelected("col < Test");
}
@Test
public void testNull() {
setupEditor(ColumnType.LABEL, CoreFunctionType.IS_NULL);
verify(view).setFunctionSelected("col = null ");
}
@Test
public void testNotNull() {
setupEditor(ColumnType.LABEL, CoreFunctionType.NOT_NULL);
verify(view).setFunctionSelected("col != null ");
}
@Test
public void testLikeTo() {
setupEditor(ColumnType.LABEL, CoreFunctionType.LIKE_TO, "Test");
verify(view).clearFilterConfig();
verify(view).setFunctionSelected("col like Test");
verify(view).addFilterConfigWidget(likeToFunctionEditor);
}
@Test
public void testTimeFrame() {
setupEditor(ColumnType.DATE, CoreFunctionType.TIME_FRAME, "begin[year February] till now");
verify(view).clearFilterConfig();
verify(view).setFunctionSelected("col = begin[year February] till now");
verify(view).addFilterConfigWidget(timeFrameEditor);
}
@Test
public void testSelectFunction() {
ColumnFilterEditor presenter = setupEditor(ColumnType.LABEL, CoreFunctionType.EQUALS_TO, "value");
verify(view).clearFilterConfig();
verify(view).setFunctionSelected("col = value");
reset(view);
when(view.getSelectedFunctionIndex()).thenReturn(2);
presenter.onSelectFilterFunction();
assertEquals(presenter.getCoreFilter().getType(), CoreFunctionType.NOT_EQUALS_TO);
verify(changedEvent).fire(any(ColumnFilterChangedEvent.class));
verify(view).clearFilterConfig();
verify(view).setFunctionSelected("col != value1");
}
}