/*
* 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.renderer.client.metric;
import org.dashbuilder.common.client.StringUtils;
import org.dashbuilder.dataset.filter.DataSetFilter;
import org.dashbuilder.dataset.filter.FilterFactory;
import org.dashbuilder.dataset.group.AggregateFunctionType;
import org.dashbuilder.displayer.DisplayerSettings;
import org.dashbuilder.displayer.DisplayerSettingsFactory;
import org.dashbuilder.displayer.client.AbstractDisplayerTest;
import org.dashbuilder.displayer.client.DisplayerListener;
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.Mockito.*;
import static org.dashbuilder.dataset.ExpenseReportsData.*;
@RunWith(MockitoJUnitRunner.class)
public class MetricDisplayerTest extends AbstractDisplayerTest {
public static final String HTML_TEMPLATE =
"<div id=\"${this}\" style=\"background-color:${bgColor}; width:${width}px; height:${height}px; " +
"margin-top:${marginTop}px; margin-right:${marginRight}px; margin-bottom:${marginBottom}px; margin-left:${marginLeft}px;\">\n" +
" <span>${title}</span>\n" +
" <span>${value}</span>\n" +
"</div>";
@Mock
MetricDisplayer.View view;
@Mock
DisplayerListener listener;
public MetricDisplayer createMetricDisplayer(DisplayerSettings settings) {
MetricDisplayer displayer = initDisplayer(new MetricDisplayer(view), settings);
displayer.addListener(listener);
return displayer;
}
@Before
public void setUp() {
when(view.getUniqueId()).thenReturn("test");
}
@Test
public void testDraw() {
DisplayerSettings engExpenses = DisplayerSettingsFactory.newMetricSettings()
.dataset(EXPENSES)
.filter(COLUMN_DEPARTMENT, FilterFactory.equalsTo("Engineering"))
.column(COLUMN_AMOUNT, AggregateFunctionType.SUM)
.title("Title").titleVisible(true)
.width(300).height(200)
.margins(10, 20, 30, 40)
.backgroundColor("FDE8D4")
.filterOff(true)
.htmlTemplate(HTML_TEMPLATE)
.jsTemplate("alert('${value.raw}');")
.buildSettings();
MetricDisplayer presenter = createMetricDisplayer(engExpenses);
presenter.draw();
verify(view).setHtml("<div id=\"test_this\" style=\"background-color:#FDE8D4; width:300px; height:200px; " +
"margin-top:10px; margin-right:40px; margin-bottom:20px; margin-left:30px;\">\n" +
" <span>Title</span>\n" +
" <span>7,650.16</span>\n" +
"</div>");
verify(view).eval("alert('7650.16');");
}
@Test
public void testDefaultTemplates() {
DisplayerSettings engExpenses = DisplayerSettingsFactory.newMetricSettings()
.dataset(EXPENSES)
.buildSettings();
MetricDisplayer presenter = createMetricDisplayer(engExpenses);
String html = presenter.getHtmlTemplate();
String js = presenter.getJsTemplate();
assertFalse(StringUtils.isBlank(html));
assertFalse(StringUtils.isBlank(js));
assertFalse(html.equals(js));
}
@Test
public void testNoData() {
DisplayerSettings empty = DisplayerSettingsFactory.newMetricSettings()
.dataset(EXPENSES)
.filter(COLUMN_ID, FilterFactory.isNull())
.column(COLUMN_AMOUNT)
.title("Title").titleVisible(true)
.width(300).height(200)
.margins(10, 20, 30, 40)
.backgroundColor("FDE8D4")
.htmlTemplate(HTML_TEMPLATE)
.buildSettings();
when(view.getNoDataString()).thenReturn("0,0");
MetricDisplayer presenter = createMetricDisplayer(empty);
MetricDisplayer.View view = presenter.getView();
presenter.draw();
verify(view, atLeastOnce()).getNoDataString();
verify(view).setHtml("<div id=\"test_this\" style=\"background-color:#FDE8D4; width:300px; height:200px; " +
"margin-top:10px; margin-right:40px; margin-bottom:20px; margin-left:30px;\">\n" +
" <span>Title</span>\n" +
" <span>0,0</span>\n" +
"</div>");
}
@Test
public void testNoFilter() {
DisplayerSettings empty = DisplayerSettingsFactory.newMetricSettings()
.dataset(EXPENSES)
.column(COLUMN_AMOUNT)
.filterOn(false, true, true)
.buildSettings();
MetricDisplayer presenter = createMetricDisplayer(empty);
MetricDisplayer.View view = presenter.getView();
presenter.draw();
reset(view);
reset(listener);
presenter.filterApply();
verify(listener, never()).onFilterEnabled(eq(presenter), any(DataSetFilter.class));
}
@Test
public void testSwitchOnFilter() {
DisplayerSettings empty = DisplayerSettingsFactory.newMetricSettings()
.dataset(EXPENSES)
.filter(COLUMN_ID, FilterFactory.isNull())
.column(COLUMN_AMOUNT)
.filterOn(false, true, true)
.buildSettings();
MetricDisplayer presenter = createMetricDisplayer(empty);
MetricDisplayer.View view = presenter.getView();
presenter.draw();
reset(view);
reset(listener);
presenter.updateFilter();
verify(listener).onFilterEnabled(eq(presenter), any(DataSetFilter.class));
}
@Test
public void testSwitchOffFilter() {
DisplayerSettings empty = DisplayerSettingsFactory.newMetricSettings()
.dataset(EXPENSES)
.filter(COLUMN_ID, FilterFactory.isNull())
.column(COLUMN_AMOUNT)
.filterOn(false, true, true)
.buildSettings();
MetricDisplayer presenter = createMetricDisplayer(empty);
MetricDisplayer.View view = presenter.getView();
presenter.draw();
presenter.filterApply();
reset(view);
reset(listener);
presenter.filterReset();
verify(listener).onFilterReset(eq(presenter), any(DataSetFilter.class));
}
}