/*
* Copyright 2016 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.
* You may obtain a copy of the License at
*
* 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.drools.workbench.screens.guided.dtable.client.editor;
import java.lang.reflect.Field;
import java.util.Collections;
import javax.enterprise.event.Event;
import org.drools.workbench.models.datamodel.workitems.PortableWorkDefinition;
import org.drools.workbench.models.guided.dtable.shared.model.GuidedDecisionTable52;
import org.drools.workbench.screens.guided.dtable.client.editor.menu.EditMenuBuilder;
import org.drools.workbench.screens.guided.dtable.client.editor.menu.InsertMenuBuilder;
import org.drools.workbench.screens.guided.dtable.client.editor.menu.RadarMenuBuilder;
import org.drools.workbench.screens.guided.dtable.client.editor.menu.ViewMenuBuilder;
import org.drools.workbench.screens.guided.dtable.client.widget.table.GuidedDecisionTableModellerView;
import org.drools.workbench.screens.guided.dtable.client.widget.table.GuidedDecisionTablePresenter;
import org.drools.workbench.screens.guided.dtable.client.widget.table.GuidedDecisionTableView;
import org.drools.workbench.screens.guided.dtable.client.widget.table.events.cdi.DecisionTableSelectedEvent;
import org.drools.workbench.screens.guided.dtable.model.GuidedDecisionTableEditorContent;
import org.drools.workbench.screens.guided.dtable.service.GuidedDecisionTableEditorService;
import org.guvnor.common.services.project.context.ProjectContext;
import org.guvnor.common.services.shared.metadata.model.Metadata;
import org.guvnor.common.services.shared.metadata.model.Overview;
import org.jboss.errai.common.client.api.Caller;
import org.jboss.errai.ioc.client.container.SyncBeanManager;
import org.junit.Before;
import org.junit.Rule;
import org.junit.rules.ExpectedException;
import org.kie.workbench.common.services.datamodel.model.PackageDataModelOracleBaselinePayload;
import org.kie.workbench.common.widgets.client.datamodel.AsyncPackageDataModelOracle;
import org.kie.workbench.common.widgets.client.menu.FileMenuBuilder;
import org.kie.workbench.common.widgets.client.menu.FileMenuBuilderImpl;
import org.kie.workbench.common.widgets.client.popups.validation.ValidationPopup;
import org.kie.workbench.common.widgets.configresource.client.widget.bound.ImportsWidgetPresenter;
import org.kie.workbench.common.widgets.metadata.client.KieMultipleDocumentEditorWrapperView;
import org.kie.workbench.common.widgets.metadata.client.menu.RegisteredDocumentsMenuBuilder;
import org.kie.workbench.common.widgets.metadata.client.widget.OverviewWidgetPresenter;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Mock;
import org.mockito.Spy;
import org.uberfire.backend.vfs.ObservablePath;
import org.uberfire.backend.vfs.Path;
import org.uberfire.client.mvp.PlaceManager;
import org.uberfire.client.workbench.events.ChangeTitleWidgetEvent;
import org.uberfire.ext.editor.commons.client.file.popups.CopyPopUpPresenter;
import org.uberfire.ext.editor.commons.client.file.popups.DeletePopUpPresenter;
import org.uberfire.ext.editor.commons.client.file.popups.RenamePopUpPresenter;
import org.uberfire.ext.editor.commons.client.file.popups.SavePopUpPresenter;
import org.uberfire.ext.editor.commons.client.history.VersionRecordManager;
import org.uberfire.ext.editor.commons.client.menu.BasicFileMenuBuilder;
import org.uberfire.ext.editor.commons.client.menu.BasicFileMenuBuilderImpl;
import org.uberfire.ext.editor.commons.client.menu.RestoreVersionCommandProvider;
import org.uberfire.ext.editor.commons.client.validation.DefaultFileNameValidator;
import org.uberfire.ext.editor.commons.version.VersionService;
import org.uberfire.ext.editor.commons.version.events.RestoreEvent;
import org.uberfire.ext.widgets.common.client.common.BusyIndicatorView;
import org.uberfire.mocks.CallerMock;
import org.uberfire.mocks.EventSourceMock;
import org.uberfire.mvp.Command;
import org.uberfire.mvp.PlaceRequest;
import org.uberfire.workbench.events.NotificationEvent;
import org.uberfire.workbench.model.menu.MenuItem;
import static org.junit.Assert.*;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.*;
public abstract class BaseGuidedDecisionTablePresenterTest<P extends BaseGuidedDecisionTableEditorPresenter> {
@Mock
protected BaseGuidedDecisionTableEditorPresenter.View view;
@Mock
protected GuidedDecisionTableEditorService dtService;
protected Caller<GuidedDecisionTableEditorService> dtServiceCaller;
protected Event<NotificationEvent> notification = spy( new EventSourceMock<NotificationEvent>() {
@Override
public void fire( final NotificationEvent event ) {
//Do nothing
}
} );
protected Event<DecisionTableSelectedEvent> decisionTableSelectedEvent = spy( new EventSourceMock<DecisionTableSelectedEvent>() {
@Override
public void fire( final DecisionTableSelectedEvent event ) {
//Do nothing
}
} );
@Mock
protected ValidationPopup validationPopup;
@Mock
protected EditMenuBuilder editMenuBuilder;
@Mock
protected MenuItem editMenuItem;
@Mock
protected ViewMenuBuilder viewMenuBuilder;
@Mock
protected MenuItem viewMenuItem;
@Mock
protected InsertMenuBuilder insertMenuBuilder;
@Mock
protected MenuItem insertMenuItem;
@Mock
protected RadarMenuBuilder radarMenuBuilder;
@Mock
protected MenuItem radarMenuItem;
@Mock
protected RegisteredDocumentsMenuBuilder registeredDocumentsMenuBuilder;
@Mock
protected MenuItem registeredDocumentsMenuItem;
@Mock
protected MenuItem saveMenuItem;
@Mock
protected MenuItem versionManagerMenuItem;
@Mock
protected GuidedDecisionTableModellerView.Presenter modeller;
@Mock
protected GuidedDecisionTableModellerView modellerView;
@Mock
protected KieMultipleDocumentEditorWrapperView kieEditorWrapperView;
@Mock
protected OverviewWidgetPresenter overviewWidget;
@Mock
protected SavePopUpPresenter savePopUpPresenter;
@Mock
protected ImportsWidgetPresenter importsWidget;
@Mock
protected EventSourceMock<NotificationEvent> notificationEvent;
@Mock
protected EventSourceMock<ChangeTitleWidgetEvent> changeTitleEvent;
@Mock
protected ProjectContext workbenchContext;
@Mock
protected VersionRecordManager versionRecordManager;
@Mock
protected VersionService versionService;
protected CallerMock<VersionService> versionServiceCaller;
@Mock
protected EventSourceMock<RestoreEvent> restoreEvent;
@Mock
protected DeletePopUpPresenter deletePopUpPresenter;
@Mock
protected CopyPopUpPresenter copyPopUpPresenter;
@Mock
protected RenamePopUpPresenter renamePopUpPresenter;
@Mock
protected BusyIndicatorView busyIndicatorView;
@Spy
protected RestoreVersionCommandProvider restoreVersionCommandProvider = getRestoreVersionCommandProvider();
@Spy
protected BasicFileMenuBuilder basicFileMenuBuilder = getBasicFileMenuBuilder();
@Spy
protected FileMenuBuilder fileMenuBuilder = getFileMenuBuilder();
@Mock
protected DefaultFileNameValidator fileNameValidator;
@Mock
protected SyncBeanManager beanManager;
@Mock
protected PlaceManager placeManager;
@Captor
protected ArgumentCaptor<DecisionTableSelectedEvent> dtSelectedEventCaptor;
@Rule
public ExpectedException exception = ExpectedException.none();
protected P presenter;
@Before
public void setup() {
this.dtServiceCaller = new CallerMock<>( dtService );
this.versionServiceCaller = new CallerMock<>( versionService );
final P wrapped = getPresenter();
wrapped.setKieEditorWrapperView( kieEditorWrapperView );
wrapped.setOverviewWidget( overviewWidget );
wrapped.setSavePopUpPresenter( savePopUpPresenter );
wrapped.setImportsWidget( importsWidget );
wrapped.setNotificationEvent( notificationEvent );
wrapped.setChangeTitleEvent( changeTitleEvent );
wrapped.setWorkbenchContext( workbenchContext );
wrapped.setVersionRecordManager( versionRecordManager );
wrapped.setRegisteredDocumentsMenuBuilder( registeredDocumentsMenuBuilder );
wrapped.setFileMenuBuilder( fileMenuBuilder );
wrapped.setFileNameValidator( fileNameValidator );
this.presenter = spy( wrapped );
when( modeller.getView() ).thenReturn( modellerView );
when( versionRecordManager.newSaveMenuItem( any( Command.class ) ) ).thenReturn( saveMenuItem );
when( versionRecordManager.buildMenu() ).thenReturn( versionManagerMenuItem );
when( editMenuBuilder.build() ).thenReturn( editMenuItem );
when( viewMenuBuilder.build() ).thenReturn( viewMenuItem );
when( insertMenuBuilder.build() ).thenReturn( insertMenuItem );
when( radarMenuBuilder.build() ).thenReturn( radarMenuItem );
when( registeredDocumentsMenuBuilder.build() ).thenReturn( registeredDocumentsMenuItem );
presenter.init();
presenter.setupMenuBar();
}
protected abstract P getPresenter();
protected GuidedDecisionTableView.Presenter makeDecisionTable( final Path originalPath,
final ObservablePath path,
final PlaceRequest placeRequest,
final GuidedDecisionTableEditorContent content ) {
final GuidedDecisionTableView.Presenter dtPresenter = mock( GuidedDecisionTableView.Presenter.class );
final AsyncPackageDataModelOracle oracle = mock( AsyncPackageDataModelOracle.class );
final Overview overview = mock( Overview.class );
final GuidedDecisionTablePresenter.Access access = new GuidedDecisionTablePresenter.Access();
when( dtService.loadContent( eq( path ) ) ).thenReturn( content );
when( modeller.addDecisionTable( eq( path ),
eq( placeRequest ),
eq( content ),
any( Boolean.class ),
any( Double.class ),
any( Double.class ) ) ).thenReturn( dtPresenter );
when( path.getOriginal() ).thenReturn( originalPath );
when( dtPresenter.getLatestPath() ).thenReturn( path );
when( dtPresenter.getCurrentPath() ).thenReturn( path );
when( dtPresenter.getPlaceRequest() ).thenReturn( placeRequest );
when( dtPresenter.getModel() ).thenReturn( content.getModel() );
when( dtPresenter.getDataModelOracle() ).thenReturn( oracle );
when( dtPresenter.getOverview() ).thenReturn( overview );
when( dtPresenter.getAccess() ).thenReturn( access );
when( dtPresenter.getView() ).thenReturn( mock( GuidedDecisionTableView.class ) );
when( overview.getMetadata() ).thenReturn( mock( Metadata.class ) );
return dtPresenter;
}
protected GuidedDecisionTableEditorContent makeDecisionTableContent() {
return makeDecisionTableContent( 0 );
}
protected GuidedDecisionTableEditorContent makeDecisionTableContent( final int hashCode ) {
final GuidedDecisionTable52 model = new GuidedDecisionTable52() {
@Override
public int hashCode() {
return hashCode;
}
};
final Overview overview = mock( Overview.class );
final Metadata metadata = mock( Metadata.class );
when( overview.getMetadata() ).thenReturn( metadata );
return new GuidedDecisionTableEditorContent( model,
Collections.<PortableWorkDefinition>emptySet(),
overview,
mock( PackageDataModelOracleBaselinePayload.class ) );
}
private RestoreVersionCommandProvider getRestoreVersionCommandProvider() {
final RestoreVersionCommandProvider restoreVersionCommandProvider = new RestoreVersionCommandProvider();
setField( restoreVersionCommandProvider,
"versionService",
versionServiceCaller );
setField( restoreVersionCommandProvider,
"restoreEvent",
restoreEvent );
setField( restoreVersionCommandProvider,
"busyIndicatorView",
view );
return restoreVersionCommandProvider;
}
private BasicFileMenuBuilder getBasicFileMenuBuilder() {
final BasicFileMenuBuilder basicFileMenuBuilder = new BasicFileMenuBuilderImpl( deletePopUpPresenter,
copyPopUpPresenter,
renamePopUpPresenter,
busyIndicatorView,
notification,
restoreVersionCommandProvider );
setField( basicFileMenuBuilder,
"restoreVersionCommandProvider",
restoreVersionCommandProvider );
setField( basicFileMenuBuilder,
"notification",
notificationEvent );
setField( restoreVersionCommandProvider,
"busyIndicatorView",
view );
return basicFileMenuBuilder;
}
private FileMenuBuilder getFileMenuBuilder() {
final FileMenuBuilder fileMenuBuilder = new FileMenuBuilderImpl();
setField( fileMenuBuilder,
"menuBuilder",
basicFileMenuBuilder );
return fileMenuBuilder;
}
private void setField( final Object o,
final String fieldName,
final Object value ) {
try {
final Field field = o.getClass().getDeclaredField( fieldName );
field.setAccessible( true );
field.set( o,
value );
} catch ( NoSuchFieldException | IllegalAccessException e ) {
fail( e.getMessage() );
}
}
}