/* * 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; import java.util.Arrays; import org.dashbuilder.dataset.DataSetFactory; import org.dashbuilder.dataset.client.DataSetReadyCallback; import org.dashbuilder.dataset.sort.SortOrder; import org.dashbuilder.displayer.DisplayerConstraints; import org.dashbuilder.displayer.DisplayerSettings; import org.dashbuilder.displayer.DisplayerSettingsFactory; import org.dashbuilder.displayer.DisplayerType; import org.dashbuilder.displayer.Position; import org.dashbuilder.displayer.client.DataSetHandler; import org.dashbuilder.displayer.client.Displayer; import org.dashbuilder.displayer.client.DisplayerLocator; import org.dashbuilder.displayer.client.RendererLibrary; import org.dashbuilder.displayer.client.RendererManager; import org.dashbuilder.displayer.client.events.DisplayerSettingsChangedEvent; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.invocation.InvocationOnMock; import org.mockito.runners.MockitoJUnitRunner; import org.mockito.stubbing.Answer; import org.uberfire.ext.properties.editor.model.validators.PropertyFieldValidator; import org.uberfire.mocks.EventSourceMock; import static org.dashbuilder.displayer.DisplayerAttributeDef.*; import static org.dashbuilder.displayer.DisplayerAttributeGroupDef.*; import static org.junit.Assert.*; import static org.mockito.Matchers.any; import static org.mockito.Mockito.*; @RunWith(MockitoJUnitRunner.class) public class DisplayerSettingsEditorTest { @Mock DisplayerSettingsEditor.View view; @Mock Displayer displayer; @Mock DataSetHandler dataSetHandler; @Mock EventSourceMock<DisplayerSettingsChangedEvent> event; @Mock DisplayerLocator displayerLocator; @Mock RendererManager rendererManager; @Mock RendererLibrary rendererA; @Mock RendererLibrary rendererB; DisplayerSettingsEditor presenter; @Before public void init() throws Exception { when(rendererManager.getRenderersForType(any(DisplayerType.class))).thenReturn(Arrays.asList(rendererA, rendererB)); when(rendererA.getUUID()).thenReturn("rendererA"); when(rendererB.getUUID()).thenReturn("rendererB"); when(rendererManager.getRendererForDisplayer(any(DisplayerSettings.class))).thenReturn(rendererB); when(displayerLocator.lookupDisplayer(any(DisplayerSettings.class))).thenReturn(displayer); when(displayer.getDataSetHandler()).thenReturn(dataSetHandler); when(displayer.getDisplayerConstraints()).thenReturn(new DisplayerConstraints(null) .supportsAttribute(TYPE) .supportsAttribute(SUBTYPE) .supportsAttribute(RENDERER) .supportsAttribute(GENERAL_GROUP) .supportsAttribute(COLUMNS_GROUP) .supportsAttribute(REFRESH_GROUP) .supportsAttribute(FILTER_GROUP) .supportsAttribute(CHART_GROUP) .supportsAttribute(TABLE_GROUP) .supportsAttribute(AXIS_GROUP) .supportsAttribute(METER_GROUP)); presenter = new DisplayerSettingsEditor(view, displayerLocator, rendererManager, event); // Call to init implies calling to presenter.show() internally doAnswer(new Answer() { @Override public Object answer(InvocationOnMock invocationOnMock) throws Throwable { presenter.show(); return null; } }).when(dataSetHandler).lookupDataSet(any(DataSetReadyCallback.class)); } @Test public void testGeneralSettings() { when(dataSetHandler.getLastDataSet()).thenReturn(DataSetFactory.newDataSetBuilder() .label("dept") .number("amount") .buildDataSet()); when(displayer.getDisplayerSettings()).thenReturn(DisplayerSettingsFactory.newBarChartSettings() .dataset("dset") .group("dept") .column("dept").format("Department") .column("amount").format("Total", "#.##0").expression("value/100") .title("Sales by dept") .titleVisible(true) .legendOn(Position.BOTTOM) .width(400).height(200) .xAxisTitle("Depts") .yAxisTitle("Amount $") .margins(10, 80, 80, 100) .filterOn(false, true, true) .refreshOn(3, false) .buildSettings()); // Call to init implies calling to presenter.show() internally (see above) presenter.init(displayer); verify(view).clear(); verify(view).addTextProperty(TITLE, "Sales by dept"); verify(view).addBooleanProperty(TITLE_VISIBLE, true); verify(view).addBooleanProperty(ALLOW_EXPORT_CSV, false); verify(view).addBooleanProperty(ALLOW_EXPORT_EXCEL, false); verify(view).addTextProperty(eq(CHART_WIDTH), eq("400"), any(DisplayerSettingsEditor.LongValidator.class)); verify(view).addTextProperty(eq(CHART_HEIGHT), eq("200"), any(DisplayerSettingsEditor.LongValidator.class)); verify(view).addColorProperty(eq(CHART_BGCOLOR), anyString()); verify(view).addBooleanProperty(CHART_3D, false); verify(view).addTextProperty(eq(CHART_MARGIN_TOP), eq("10"), any(DisplayerSettingsEditor.LongValidator.class)); verify(view).addTextProperty(eq(CHART_MARGIN_BOTTOM), eq("80"), any(DisplayerSettingsEditor.LongValidator.class)); verify(view).addTextProperty(eq(CHART_MARGIN_LEFT), eq("80"), any(DisplayerSettingsEditor.LongValidator.class)); verify(view).addTextProperty(eq(CHART_MARGIN_RIGHT), eq("100"), any(DisplayerSettingsEditor.LongValidator.class)); verify(view).addBooleanProperty(CHART_SHOWLEGEND, true); verify(view).addListProperty(eq(CHART_LEGENDPOSITION), anyListOf(String.class), anyString()); verify(view).addBooleanProperty(XAXIS_SHOWLABELS, true); verify(view).addTextProperty(XAXIS_TITLE, "Depts"); verify(view).addBooleanProperty(YAXIS_SHOWLABELS, true); verify(view).addTextProperty(YAXIS_TITLE, "Amount $"); verify(view).addBooleanProperty(FILTER_ENABLED, true); verify(view).addBooleanProperty(FILTER_SELFAPPLY_ENABLED, false); verify(view).addBooleanProperty(FILTER_NOTIFICATION_ENABLED, true); verify(view).addBooleanProperty(FILTER_LISTENING_ENABLED, true); verify(view).addTextProperty(eq(REFRESH_INTERVAL), eq("3"), any(DisplayerSettingsEditor.LongValidator.class)); verify(view).addBooleanProperty(REFRESH_STALE_DATA, false); verify(view).addTextProperty(eq("columns.dept.name"), anyString(), eq("Department")); verify(view).addTextProperty(eq("columns.amount.name"), anyString(), eq("Total")); verify(view).addTextProperty(eq("columns.amount.expression"), anyString(), eq("value/100")); verify(view).addTextProperty(eq("columns.amount.pattern"), anyString(), eq("#.##0")); verify(view).show(); } @Test public void testChangeAttributes() { DisplayerSettings settings = DisplayerSettingsFactory.newBarChartSettings().buildSettings(); when(displayer.getDisplayerSettings()).thenReturn(settings); presenter.init(displayer); presenter.onAttributeChanged(TITLE.getFullId(), "Test"); presenter.onAttributeChanged(TITLE_VISIBLE.getFullId(), "true"); presenter.onAttributeChanged(ALLOW_EXPORT_CSV.getFullId(), "false"); presenter.onAttributeChanged(ALLOW_EXPORT_EXCEL.getFullId(), "false"); presenter.onAttributeChanged(CHART_HEIGHT.getFullId(), "400"); presenter.onAttributeChanged("columns.amount.name", "Total"); presenter.onAttributeChanged("columns.amount.pattern", "#.###,00"); presenter.onAttributeChanged("columns.amount.expression", "value"); assertEquals(settings.getTitle(), "Test"); assertEquals(settings.isTitleVisible(), true); assertEquals(settings.isCSVExportAllowed(), false); assertEquals(settings.isExcelExportAllowed(), false); assertEquals(settings.getChartHeight(), 400); assertEquals(settings.getColumnSettings("amount").getColumnName(), "Total"); assertEquals(settings.getColumnSettings("amount").getValuePattern(), "#.###,00"); assertEquals(settings.getColumnSettings("amount").getValueExpression(), "value"); verify(event, atLeastOnce()).fire(any(DisplayerSettingsChangedEvent.class)); } @Test public void testTableSettings() { when(dataSetHandler.getLastDataSet()).thenReturn(DataSetFactory.newDataSetBuilder() .label("dept") .date("date") .number("amount") .buildDataSet()); when(displayer.getDisplayerConstraints()).thenReturn( new DisplayerConstraints(null) .supportsAttribute(TABLE_GROUP)); when(displayer.getDisplayerSettings()).thenReturn(DisplayerSettingsFactory.newTableSettings() .tablePageSize(10) .tableWidth(500) .tableOrderEnabled(true) .tableOrderDefault("date", SortOrder.ASCENDING) .buildSettings()); presenter.init(displayer); verify(view).clear(); verify(view).addTextProperty(eq(TABLE_WIDTH), eq("500"), any(DisplayerSettingsEditor.LongValidator.class)); verify(view).addBooleanProperty(TABLE_SORTENABLED, true); verify(view).addListProperty(eq(TABLE_SORTCOLUMNID), anyListOf(String.class), eq("date")); verify(view).addListProperty(eq(TABLE_SORTORDER), anyListOf(String.class), eq(SortOrder.ASCENDING.toString())); verify(view).show(); } @Test public void testMeterSettings() { when(displayer.getDisplayerConstraints()).thenReturn( new DisplayerConstraints(null) .supportsAttribute(METER_GROUP)); when(displayer.getDisplayerSettings()).thenReturn(DisplayerSettingsFactory.newMeterChartSettings() .meter(0, 100, 500, 900) .buildSettings()); presenter.init(displayer); verify(view).clear(); verify(view).addTextProperty(eq(METER_START), eq("0"), any(DisplayerSettingsEditor.LongValidator.class)); verify(view).addTextProperty(eq(METER_WARNING), eq("100"), any(DisplayerSettingsEditor.LongValidator.class)); verify(view).addTextProperty(eq(METER_CRITICAL), eq("500"), any(DisplayerSettingsEditor.LongValidator.class)); verify(view).addTextProperty(eq(METER_END), eq("900"), any(DisplayerSettingsEditor.LongValidator.class)); verify(view).show(); } @Test public void testRenderer() { DisplayerSettings settings = DisplayerSettingsFactory.newBarChartSettings() .renderer("rendererB") .buildSettings(); when(rendererManager.getRendererForDisplayer(settings)).thenReturn(rendererB); when(displayer.getDisplayerConstraints()).thenReturn( new DisplayerConstraints(null) .supportsAttribute(RENDERER)); when(displayer.getDisplayerSettings()).thenReturn(settings); presenter.init(displayer); verify(view).clear(); verify(view).addListProperty(RENDERER, Arrays.asList("rendererA", "rendererB"), "rendererB"); verify(view).show(); } @Test public void testSupportedAttrs() { when(displayer.getDisplayerConstraints()).thenReturn(new DisplayerConstraints(null) .supportsAttribute(TYPE) .supportsAttribute(SUBTYPE) .supportsAttribute(TITLE) .supportsAttribute(FILTER_GROUP)); when(displayer.getDisplayerSettings()).thenReturn(DisplayerSettingsFactory.newBarChartSettings().buildSettings()); presenter.init(displayer); assertEquals(presenter.isSupported(TYPE), true); assertEquals(presenter.isSupported(SUBTYPE), true); assertEquals(presenter.isSupported(TITLE), true); assertEquals(presenter.isSupported(TITLE_VISIBLE), false); assertEquals(presenter.isSupported(RENDERER), false); assertEquals(presenter.isSupported(FILTER_ENABLED), true); assertEquals(presenter.isSupported(FILTER_LISTENING_ENABLED), true); assertEquals(presenter.isSupported(FILTER_NOTIFICATION_ENABLED), true); assertEquals(presenter.isSupported(FILTER_SELFAPPLY_ENABLED), true); } @Test public void testLongValidator() { PropertyFieldValidator validator = presenter.createLongValidator(); assertEquals(validator.validate("500"), true); assertEquals(validator.validate("500d"), false); assertEquals(validator.validate("aaa"), false); } @Test public void testMeterValidator() { DisplayerSettings settings = DisplayerSettingsFactory.newMeterChartSettings() .meter(0, 100, 500, 900) .buildSettings(); when(displayer.getDisplayerSettings()).thenReturn(settings); presenter.init(displayer); PropertyFieldValidator validator = presenter.createMeterValidator(settings, 0); assertEquals(validator.validate("aaa"), false); assertEquals(validator.validate("0"), true); assertEquals(validator.validate("99"), true); assertEquals(validator.validate("100"), true); assertEquals(validator.validate("101"), false); assertEquals(validator.validate("-999999999999"), true); validator = presenter.createMeterValidator(settings, 1); assertEquals(validator.validate("0"), true); assertEquals(validator.validate("99"), true); assertEquals(validator.validate("100"), true); assertEquals(validator.validate("101"), true); assertEquals(validator.validate("500"), true); assertEquals(validator.validate("501"), false); assertEquals(validator.validate("-1"), false); validator = presenter.createMeterValidator(settings, 2); assertEquals(validator.validate("99"), false); assertEquals(validator.validate("100"), true); assertEquals(validator.validate("900"), true); assertEquals(validator.validate("901"), false); validator = presenter.createMeterValidator(settings, 3); assertEquals(validator.validate("499"), false); assertEquals(validator.validate("500"), true); assertEquals(validator.validate("900"), true); assertEquals(validator.validate("10000000000000"), true); } }